diff --git a/cli/command/format.go b/cli/command/format.go index be6bb3c03..7d1036017 100644 --- a/cli/command/format.go +++ b/cli/command/format.go @@ -39,9 +39,10 @@ import ( const ( FORMAT_EXAMPLE = `Examples: - $ curveadm format -f /path/to/format.yaml # Format chunkfile pool with specified configure file - $ curveadm format --status -f /path/to/format.yaml # Display formatting status - $ curveadm format --stop -f /path/to/format.yaml # Stop formatting progress` + $ curveadm format -f /path/to/format.yaml # Format chunkfile pool with specified configure file + $ curveadm format -f /path/to/format.yaml --increment # Incremental Format chunkfile pool with specified configure file + $ curveadm format --status -f /path/to/format.yaml # Display formatting status + $ curveadm format --stop -f /path/to/format.yaml # Stop formatting progress` ) var ( @@ -62,6 +63,7 @@ type formatOptions struct { filename string showStatus bool stopFormat bool + increment bool } func NewFormatCommand(curveadm *cli.CurveAdm) *cobra.Command { @@ -82,6 +84,7 @@ func NewFormatCommand(curveadm *cli.CurveAdm) *cobra.Command { flags.StringVarP(&options.filename, "formatting", "f", "format.yaml", "Specify the configure file for formatting chunkfile pool") flags.BoolVar(&options.showStatus, "status", false, "Show formatting status") flags.BoolVar(&options.stopFormat, "stop", false, "Stop formatting progress") + flags.BoolVar(&options.increment, "increment", false, "Incremental formatting") return cmd } @@ -112,6 +115,9 @@ func genFormatPlaybook(curveadm *cli.CurveAdm, ExecOptions: playbook.ExecOptions{ SilentSubBar: options.showStatus, }, + Options: map[string]interface{}{ + comm.FORMAT_INCREMENTAL: options.increment, + }, }) } return pb, nil diff --git a/internal/common/common.go b/internal/common/common.go index c12b801d0..bce5d99ad 100644 --- a/internal/common/common.go +++ b/internal/common/common.go @@ -67,6 +67,7 @@ const ( // format KEY_ALL_FORMAT_STATUS = "ALL_FORMAT_STATUS" + FORMAT_INCREMENTAL = "FORMAT_INCREMENTAL" // check KEY_CHECK_WITH_WEAK = "CHECK_WITH_WEAK" diff --git a/internal/task/scripts/format.go b/internal/task/scripts/format.go index 826fcf137..c065571d4 100644 --- a/internal/task/scripts/format.go +++ b/internal/task/scripts/format.go @@ -28,12 +28,40 @@ percent=$2 chunkfile_size=$3 chunkfile_pool_dir=$4 chunkfile_pool_meta_path=$5 +increment_format=$6 mkdir -p $chunkfile_pool_dir -$binary \ - -allocatePercent=$percent \ - -fileSize=$chunkfile_size \ - -filePoolDir=$chunkfile_pool_dir \ - -filePoolMetaPath=$chunkfile_pool_meta_path \ - -fileSystemPath=$chunkfile_pool_dir + +if [ $increment_format == "true" ] +then + rootdir=$(dirname $chunkfile_pool_dir) + used=$(df $rootdir --output=used|tail -n 1) + avail=$(df $rootdir --output=avail|tail -n 1) + size=$(df $rootdir --output=size|tail -n 1) + used_percent=$(df $rootdir --output=pcent|tail -n 1|sed 's/%//'|xargs) + let minus=$percent-$used_percent + + if [ $minus -gt 0 ] + then + let file_size=$chunkfile_size+4096 + let pre_allocate_num=$minus*$size*1024/100/$file_size + + $binary \ + -fileSize=$chunkfile_size \ + -filePoolDir=$chunkfile_pool_dir \ + -filePoolMetaPath=$chunkfile_pool_meta_path \ + -fileSystemPath=$chunkfile_pool_dir \ + -allocateByPercent=false \ + -preAllocateNum=$pre_allocate_num + fi +else + $binary \ + -allocatePercent=$percent \ + -fileSize=$chunkfile_size \ + -filePoolDir=$chunkfile_pool_dir \ + -filePoolMetaPath=$chunkfile_pool_meta_path \ + -fileSystemPath=$chunkfile_pool_dir +fi + + ` diff --git a/internal/task/task/bs/format.go b/internal/task/task/bs/format.go index e9a04aafc..a9a711c65 100644 --- a/internal/task/task/bs/format.go +++ b/internal/task/task/bs/format.go @@ -24,6 +24,7 @@ package bs import ( "fmt" + comm "github.com/opencurve/curveadm/internal/common" "regexp" "strings" "time" @@ -245,8 +246,9 @@ func NewFormatChunkfilePoolTask(curveadm *cli.CurveAdm, fc *configure.FormatConf chunkfilePoolRootDir := layout.ChunkfilePoolRootDir formatScript := scripts.SCRIPT_FORMAT formatScriptPath := fmt.Sprintf("%s/format.sh", layout.ToolsBinDir) - formatCommand := fmt.Sprintf("%s %s %d %d %s %s", formatScriptPath, layout.FormatBinaryPath, - usagePercent, DEFAULT_CHUNKFILE_SIZE, layout.ChunkfilePoolDir, layout.ChunkfilePoolMetaPath) + increment := curveadm.MemStorage().Get(comm.FORMAT_INCREMENTAL).(bool) + formatCommand := fmt.Sprintf("%s %s %d %d %s %s %t", formatScriptPath, layout.FormatBinaryPath, + usagePercent, DEFAULT_CHUNKFILE_SIZE, layout.ChunkfilePoolDir, layout.ChunkfilePoolMetaPath, increment) // 1: skip if formating container exist t.AddStep(&step.ListContainers{ @@ -278,10 +280,12 @@ func NewFormatChunkfilePoolTask(curveadm *cli.CurveAdm, fc *configure.FormatConf Paths: []string{mountPoint}, ExecOptions: curveadm.ExecOptions(), }) - t.AddStep(&step.CreateFilesystem{ // mkfs.ext4 MOUNT_POINT - Device: device, - ExecOptions: curveadm.ExecOptions(), - }) + if !increment { + t.AddStep(&step.CreateFilesystem{ // mkfs.ext4 MOUNT_POINT + Device: device, + ExecOptions: curveadm.ExecOptions(), + }) + } t.AddStep(&step.MountFilesystem{ Source: device, Directory: mountPoint,