一.背景
gpbackup是Greenplum的备份工具,作为实验工具,鼓励大家去使用,推动该工具的成熟。该工具是用go语言开发,采用ginkgo框架进行BDD测试为快速开发的质量提供保证。虽然gpbackup只是一个备份数据的命令,但其中蕴含了Greenplum的大量知识,通过对该工具的源码分析,从而达到对Greenplum的进一步理解。本文主要分析DoFlagValidation函数。
二.DoFlagValidation函数
该函数是对gpbackup的参数合法性进行校验,为后续备份动作提供预检功能。
1.模块依赖关系
主函数为gpbackup.go的main函数。
1)backup.go 数据备份业务流程。
2)validate.go参数合法性校验业务。
3)options/flag.go参数相关性检查。
4)global_variables.go 获取参数数值、检查是否是布尔类型。
5)util/util.go 路径参数检查、压缩参数检查。
6)filepath/filepath.go日期格式检查。
2.关键函数说明
2.1 validateFlagCombinations函数
func validateFlagCombinations(flags*pflag.FlagSet) {
//参数相关性检查
options.CheckExclusiveFlags(flags, options.DEBUG, options.QUIET, options.VERBOSE)
options.CheckExclusiveFlags(flags, options.DATA_ONLY, options.METADATA_ONLY, options.INCREMENTAL)
options.CheckExclusiveFlags(flags, options.INCLUDE_SCHEMA, options.INCLUDE_SCHEMA_FILE, options.INCLUDE_RELATION, options.INCLUDE_RELATION_FILE)
options.CheckExclusiveFlags(flags, options.EXCLUDE_SCHEMA, options.EXCLUDE_SCHEMA_FILE, options.INCLUDE_SCHEMA, options.INCLUDE_SCHEMA_FILE)
options.CheckExclusiveFlags(flags, options.EXCLUDE_SCHEMA, options.EXCLUDE_SCHEMA_FILE, options.EXCLUDE_RELATION, options.INCLUDE_RELATION, options.EXCLUDE_RELATION_FILE, options.INCLUDE_RELATION_FILE)
options.CheckExclusiveFlags(flags, options.JOBS, options.METADATA_ONLY, options.SINGLE_DATA_FILE)
options.CheckExclusiveFlags(flags, options.METADATA_ONLY, options.LEAF_PARTITION_DATA)
options.CheckExclusiveFlags(flags, options.NO_COMPRESSION, options.COMPRESSION_LEVEL)
options.CheckExclusiveFlags(flags, options.PLUGIN_CONFIG, options.BACKUP_DIR)
//增量备份必须有开始时间
if MustGetFlagString(options.FROM_TIMESTAMP)!= "" && !MustGetFlagBool(options.INCREMENTAL) {
gplog.Fatal(errors.Errorf("--from-timestamp must be specified with --incremental"),"")
}
if MustGetFlagBool(options.INCREMENTAL)&& !MustGetFlagBool(options.LEAF_PARTITION_DATA) {
gplog.Fatal(errors.Errorf("--leaf-partition-data must be specified with --incremental"),"")
}
}
2.2 validateFlagValues函数
func validateFlagValues() {
//检查备份路径
err:=utils.ValidateFullPath(MustGetFlagString(options.BACKUP_DIR))
gplog.FatalOnError(err)
//检查备份的插件路径
err=utils.ValidateFullPath(MustGetFlagString(options.PLUGIN_CONFIG))
gplog.FatalOnError(err)
//检查压缩比参数
err=utils.ValidateCompressionLevel(MustGetFlagInt(options.COMPRESSION_LEVEL))
gplog.FatalOnError(err)
//检查日期格式
if MustGetFlagString(options.FROM_TIMESTAMP)!= "" && !filepath.IsValidTimestamp(MustGetFlagString(options.FROM_TIMESTAMP)) {
gplog.Fatal(errors.Errorf("Timestamp %s is invalid. Timestamps must be in the format YYYYMMDDHHMMSS.",
MustGetFlagString(options.FROM_TIMESTAMP)),"")
}
}
网友评论