From 67d07931f0d61e36c2b427fe2c88814448461f3a Mon Sep 17 00:00:00 2001
From: glorv <glorvs@163.com>
Date: Fri, 3 Jul 2020 16:45:16 +0800
Subject: [PATCH 1/8] add compression type

---
 go.mod                 |  2 ++
 go.sum                 |  2 ++
 pkg/backup/client.go   | 25 ++++++++++++++-----------
 pkg/task/backup.go     | 28 ++++++++++++++++++++++++++++
 pkg/task/backup_raw.go | 27 ++++++++++++++++++---------
 5 files changed, 64 insertions(+), 20 deletions(-)

diff --git a/go.mod b/go.mod
index 2fb2f69be..acf439f58 100644
--- a/go.mod
+++ b/go.mod
@@ -35,3 +35,5 @@ require (
 	google.golang.org/api v0.15.1
 	google.golang.org/grpc v1.26.0
 )
+
+replace github.com/pingcap/kvproto => github.com/glorv/kvproto v0.0.0-20200702084207-a2a6737837f6
diff --git a/go.sum b/go.sum
index abe4575b9..ee77dd6b8 100644
--- a/go.sum
+++ b/go.sum
@@ -167,6 +167,8 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm
 github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y=
 github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM=
 github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do=
+github.com/glorv/kvproto v0.0.0-20200702084207-a2a6737837f6 h1:WA/xq+rYQCi8TpdUnzAA7QSUCDmr4ndimybY7A5ate8=
+github.com/glorv/kvproto v0.0.0-20200702084207-a2a6737837f6/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI=
 github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I=
 github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
diff --git a/pkg/backup/client.go b/pkg/backup/client.go
index c0651d7a7..4c7d1c070 100644
--- a/pkg/backup/client.go
+++ b/pkg/backup/client.go
@@ -481,8 +481,8 @@ func (bc *Client) BackupRange(
 	// Find and backup remaining ranges.
 	// TODO: test fine grained backup.
 	err = bc.fineGrainedBackup(
-		ctx, startKey, endKey, req.StartVersion,
-		req.EndVersion, req.RateLimit, req.Concurrency, results, updateCh)
+		ctx, startKey, endKey, req.StartVersion, req.EndVersion, req.CompressionType,
+		req.RateLimit, req.Concurrency, results, updateCh)
 	if err != nil {
 		return err
 	}
@@ -546,6 +546,7 @@ func (bc *Client) fineGrainedBackup(
 	startKey, endKey []byte,
 	lastBackupTS uint64,
 	backupTS uint64,
+	compressType kvproto.BackupRequest_CompressionType,
 	rateLimit uint64,
 	concurrency uint32,
 	rangeTree rtree.RangeTree,
@@ -576,7 +577,7 @@ func (bc *Client) fineGrainedBackup(
 				defer wg.Done()
 				for rg := range retry {
 					backoffMs, err :=
-						bc.handleFineGrained(ctx, boFork, rg, lastBackupTS, backupTS, rateLimit, concurrency, respCh)
+						bc.handleFineGrained(ctx, boFork, rg, lastBackupTS, backupTS, compressType, rateLimit, concurrency, respCh)
 					if err != nil {
 						errCh <- err
 						return
@@ -710,6 +711,7 @@ func (bc *Client) handleFineGrained(
 	rg rtree.Range,
 	lastBackupTS uint64,
 	backupTS uint64,
+	compressType kvproto.BackupRequest_CompressionType,
 	rateLimit uint64,
 	concurrency uint32,
 	respCh chan<- *kvproto.BackupResponse,
@@ -722,14 +724,15 @@ func (bc *Client) handleFineGrained(
 	max := 0
 
 	req := kvproto.BackupRequest{
-		ClusterId:      bc.clusterID,
-		StartKey:       rg.StartKey, // TODO: the range may cross region.
-		EndKey:         rg.EndKey,
-		StartVersion:   lastBackupTS,
-		EndVersion:     backupTS,
-		StorageBackend: bc.backend,
-		RateLimit:      rateLimit,
-		Concurrency:    concurrency,
+		ClusterId:       bc.clusterID,
+		StartKey:        rg.StartKey, // TODO: the range may cross region.
+		EndKey:          rg.EndKey,
+		StartVersion:    lastBackupTS,
+		EndVersion:      backupTS,
+		StorageBackend:  bc.backend,
+		RateLimit:       rateLimit,
+		Concurrency:     concurrency,
+		CompressionType: compressType,
 	}
 	lockResolver := bc.mgr.GetLockResolver()
 	client, err := bc.mgr.GetBackupClient(ctx, storeID)
diff --git a/pkg/task/backup.go b/pkg/task/backup.go
index 8e17296e5..ce4b007ac 100644
--- a/pkg/task/backup.go
+++ b/pkg/task/backup.go
@@ -32,6 +32,7 @@ const (
 	flagBackupTimeago = "timeago"
 	flagBackupTS      = "backupts"
 	flagLastBackupTS  = "lastbackupts"
+	flagCompressionType = "compression-type"
 
 	flagGCTTL = "gcttl"
 
@@ -46,6 +47,7 @@ type BackupConfig struct {
 	BackupTS     uint64        `json:"backup-ts" toml:"backup-ts"`
 	LastBackupTS uint64        `json:"last-backup-ts" toml:"last-backup-ts"`
 	GCTTL        int64         `json:"gc-ttl" toml:"gc-ttl"`
+	CompressionType kvproto.BackupRequest_CompressionType `json:"compression-type" toml:"compression-type"`
 }
 
 // DefineBackupFlags defines common flags for the backup command.
@@ -60,6 +62,7 @@ func DefineBackupFlags(flags *pflag.FlagSet) {
 	flags.String(flagBackupTS, "", "the backup ts support TSO or datetime,"+
 		" e.g. '400036290571534337', '2018-05-11 01:42:23'")
 	flags.Int64(flagGCTTL, backup.DefaultBRGCSafePointTTL, "the TTL (in seconds) that PD holds for BR's GC safepoint")
+	flags.String(flagCompressionType, "", "backup sst file compression algorithm, value can be one of 'lz4|zstd|snappy'")
 }
 
 // ParseFromFlags parses the backup-related flags from the flag set.
@@ -90,12 +93,19 @@ func (cfg *BackupConfig) ParseFromFlags(flags *pflag.FlagSet) error {
 	}
 	cfg.GCTTL = gcTTL
 
+	compressionType, err := parseCompressionType(flagCompressionType)
+	if err != nil {
+		return errors.Trace(err)
+	}
+	cfg.CompressionType = compressionType
+
 	if err = cfg.Config.ParseFromFlags(flags); err != nil {
 		return errors.Trace(err)
 	}
 	if cfg.Config.Concurrency == 0 {
 		cfg.Config.Concurrency = defaultBackupConcurrency
 	}
+
 	return nil
 }
 
@@ -184,6 +194,7 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig
 		EndVersion:   backupTS,
 		RateLimit:    cfg.RateLimit,
 		Concurrency:  cfg.Concurrency,
+		CompressionType: cfg.CompressionType,
 	}
 	err = client.BackupRanges(
 		ctx, ranges, req, updateCh)
@@ -279,3 +290,20 @@ func parseTSString(ts string) (uint64, error) {
 	}
 	return variable.GoTimeToTS(t1), nil
 }
+
+func parseCompressionType(s string) (kvproto.BackupRequest_CompressionType, error) {
+	var ct kvproto.BackupRequest_CompressionType
+	switch s {
+	case "lz4":
+		ct = kvproto.BackupRequest_LZ4
+	case "snappy":
+		ct = kvproto.BackupRequest_SNAPPY
+	case "zstd":
+		ct = kvproto.BackupRequest_ZSTD
+	case "":
+		ct = kvproto.BackupRequest_UNKNOWN
+	default:
+		return kvproto.BackupRequest_UNKNOWN, errors.Errorf("invalid compression type '%s'", s)
+	}
+	return ct, nil
+}
diff --git a/pkg/task/backup_raw.go b/pkg/task/backup_raw.go
index aacd61627..ce9d42a54 100644
--- a/pkg/task/backup_raw.go
+++ b/pkg/task/backup_raw.go
@@ -31,9 +31,10 @@ const (
 type RawKvConfig struct {
 	Config
 
-	StartKey []byte `json:"start-key" toml:"start-key"`
-	EndKey   []byte `json:"end-key" toml:"end-key"`
-	CF       string `json:"cf" toml:"cf"`
+	StartKey        []byte                                `json:"start-key" toml:"start-key"`
+	EndKey          []byte                                `json:"end-key" toml:"end-key"`
+	CF              string                                `json:"cf" toml:"cf"`
+	CompressionType kvproto.BackupRequest_CompressionType `json:"compression-type" toml:"compression-type"`
 }
 
 // DefineRawBackupFlags defines common flags for the backup command.
@@ -42,6 +43,7 @@ func DefineRawBackupFlags(command *cobra.Command) {
 	command.Flags().StringP(flagTiKVColumnFamily, "", "default", "backup specify cf, correspond to tikv cf")
 	command.Flags().StringP(flagStartKey, "", "", "backup raw kv start key, key is inclusive")
 	command.Flags().StringP(flagEndKey, "", "", "backup raw kv end key, key is exclusive")
+	command.Flags().String(flagCompressionType, "", "backup sst file compression algorithm, value can be one of 'lz4|zstd|snappy'")
 }
 
 // ParseFromFlags parses the backup-related flags from the flag set.
@@ -78,6 +80,12 @@ func (cfg *RawKvConfig) ParseFromFlags(flags *pflag.FlagSet) error {
 	if err = cfg.Config.ParseFromFlags(flags); err != nil {
 		return errors.Trace(err)
 	}
+
+	compressionType, err := parseCompressionType(flagCompressionType)
+	if err != nil {
+		return errors.Trace(err)
+	}
+	cfg.CompressionType = compressionType
 	return nil
 }
 
@@ -121,12 +129,13 @@ func RunBackupRaw(c context.Context, g glue.Glue, cmdName string, cfg *RawKvConf
 		ctx, cmdName, int64(approximateRegions), !cfg.LogProgress)
 
 	req := kvproto.BackupRequest{
-		StartVersion: 0,
-		EndVersion:   0,
-		RateLimit:    cfg.RateLimit,
-		Concurrency:  cfg.Concurrency,
-		IsRawKv:      true,
-		Cf:           cfg.CF,
+		StartVersion:    0,
+		EndVersion:      0,
+		RateLimit:       cfg.RateLimit,
+		Concurrency:     cfg.Concurrency,
+		IsRawKv:         true,
+		Cf:              cfg.CF,
+		CompressionType: cfg.CompressionType,
 	}
 
 	err = client.BackupRange(ctx, backupRange.StartKey, backupRange.EndKey, req, updateCh)

From 3591bb1d41f7974bff6e8b2e2fdfc8671216330f Mon Sep 17 00:00:00 2001
From: glorv <glorvs@163.com>
Date: Fri, 3 Jul 2020 17:41:44 +0800
Subject: [PATCH 2/8] fix

---
 pkg/task/backup.go     | 28 ++++++++++++++++------------
 pkg/task/backup_raw.go |  6 +++++-
 2 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/pkg/task/backup.go b/pkg/task/backup.go
index ce4b007ac..22b1330d3 100644
--- a/pkg/task/backup.go
+++ b/pkg/task/backup.go
@@ -29,9 +29,9 @@ import (
 )
 
 const (
-	flagBackupTimeago = "timeago"
-	flagBackupTS      = "backupts"
-	flagLastBackupTS  = "lastbackupts"
+	flagBackupTimeago   = "timeago"
+	flagBackupTS        = "backupts"
+	flagLastBackupTS    = "lastbackupts"
 	flagCompressionType = "compression-type"
 
 	flagGCTTL = "gcttl"
@@ -43,10 +43,10 @@ const (
 type BackupConfig struct {
 	Config
 
-	TimeAgo      time.Duration `json:"time-ago" toml:"time-ago"`
-	BackupTS     uint64        `json:"backup-ts" toml:"backup-ts"`
-	LastBackupTS uint64        `json:"last-backup-ts" toml:"last-backup-ts"`
-	GCTTL        int64         `json:"gc-ttl" toml:"gc-ttl"`
+	TimeAgo         time.Duration                         `json:"time-ago" toml:"time-ago"`
+	BackupTS        uint64                                `json:"backup-ts" toml:"backup-ts"`
+	LastBackupTS    uint64                                `json:"last-backup-ts" toml:"last-backup-ts"`
+	GCTTL           int64                                 `json:"gc-ttl" toml:"gc-ttl"`
 	CompressionType kvproto.BackupRequest_CompressionType `json:"compression-type" toml:"compression-type"`
 }
 
@@ -93,7 +93,11 @@ func (cfg *BackupConfig) ParseFromFlags(flags *pflag.FlagSet) error {
 	}
 	cfg.GCTTL = gcTTL
 
-	compressionType, err := parseCompressionType(flagCompressionType)
+	compressionStr, err := flags.GetString(flagCompressionType)
+	if err != nil {
+		return errors.Trace(err)
+	}
+	compressionType, err := parseCompressionType(compressionStr)
 	if err != nil {
 		return errors.Trace(err)
 	}
@@ -190,10 +194,10 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig
 		ctx, cmdName, int64(approximateRegions), !cfg.LogProgress)
 
 	req := kvproto.BackupRequest{
-		StartVersion: cfg.LastBackupTS,
-		EndVersion:   backupTS,
-		RateLimit:    cfg.RateLimit,
-		Concurrency:  cfg.Concurrency,
+		StartVersion:    cfg.LastBackupTS,
+		EndVersion:      backupTS,
+		RateLimit:       cfg.RateLimit,
+		Concurrency:     cfg.Concurrency,
 		CompressionType: cfg.CompressionType,
 	}
 	err = client.BackupRanges(
diff --git a/pkg/task/backup_raw.go b/pkg/task/backup_raw.go
index ce9d42a54..40dd72053 100644
--- a/pkg/task/backup_raw.go
+++ b/pkg/task/backup_raw.go
@@ -81,7 +81,11 @@ func (cfg *RawKvConfig) ParseFromFlags(flags *pflag.FlagSet) error {
 		return errors.Trace(err)
 	}
 
-	compressionType, err := parseCompressionType(flagCompressionType)
+	compressionStr, err := flags.GetString(flagCompressionType)
+	if err != nil {
+		return errors.Trace(err)
+	}
+	compressionType, err := parseCompressionType(compressionStr)
 	if err != nil {
 		return errors.Trace(err)
 	}

From 5cdd6d041cef127f20a6d62c0ef94ceeeeceb42e Mon Sep 17 00:00:00 2001
From: glorv <glorvs@163.com>
Date: Tue, 7 Jul 2020 19:38:05 +0800
Subject: [PATCH 3/8] apply compresssion

---
 go.mod                 |  4 +---
 go.sum                 |  4 ++--
 pkg/backup/client.go   |  4 ++--
 pkg/task/backup.go     | 24 ++++++++++++------------
 pkg/task/backup_raw.go |  8 ++++----
 5 files changed, 21 insertions(+), 23 deletions(-)

diff --git a/go.mod b/go.mod
index acf439f58..5c9244284 100644
--- a/go.mod
+++ b/go.mod
@@ -15,7 +15,7 @@ require (
 	github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712
 	github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011
 	github.com/pingcap/failpoint v0.0.0-20200506114213-c17f16071c53
-	github.com/pingcap/kvproto v0.0.0-20200518112156-d4aeb467de29
+	github.com/pingcap/kvproto v0.0.0-20200706115936-1e0910aabe6c
 	github.com/pingcap/log v0.0.0-20200511115504-543df19646ad
 	github.com/pingcap/parser v0.0.0-20200518090819-ec1e13b948b1
 	github.com/pingcap/pd/v4 v4.0.0-rc.2.0.20200520083007-2c251bd8f181
@@ -35,5 +35,3 @@ require (
 	google.golang.org/api v0.15.1
 	google.golang.org/grpc v1.26.0
 )
-
-replace github.com/pingcap/kvproto => github.com/glorv/kvproto v0.0.0-20200702084207-a2a6737837f6
diff --git a/go.sum b/go.sum
index ee77dd6b8..ef9b219d5 100644
--- a/go.sum
+++ b/go.sum
@@ -167,8 +167,6 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm
 github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y=
 github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM=
 github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do=
-github.com/glorv/kvproto v0.0.0-20200702084207-a2a6737837f6 h1:WA/xq+rYQCi8TpdUnzAA7QSUCDmr4ndimybY7A5ate8=
-github.com/glorv/kvproto v0.0.0-20200702084207-a2a6737837f6/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI=
 github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I=
 github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
@@ -482,6 +480,8 @@ github.com/pingcap/kvproto v0.0.0-20200424032552-6650270c39c3/go.mod h1:IOdRDPLy
 github.com/pingcap/kvproto v0.0.0-20200428135407-0f5ffe459677/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI=
 github.com/pingcap/kvproto v0.0.0-20200518112156-d4aeb467de29 h1:NpW1OuYrIl+IQrSsVbtyHpHpazmSCHy+ysrOixY0xY4=
 github.com/pingcap/kvproto v0.0.0-20200518112156-d4aeb467de29/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI=
+github.com/pingcap/kvproto v0.0.0-20200706115936-1e0910aabe6c h1:VnLpCAxMAeDxc7HXTetwDQB+/MtDQjHAOBsd4QnGVwA=
+github.com/pingcap/kvproto v0.0.0-20200706115936-1e0910aabe6c/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI=
 github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9 h1:AJD9pZYm72vMgPcQDww9rkZ1DnWfl0pXV3BOWlkYIjA=
 github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8=
 github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd h1:CV3VsP3Z02MVtdpTMfEgRJ4T9NGgGTxdHpJerent7rM=
diff --git a/pkg/backup/client.go b/pkg/backup/client.go
index 4c7d1c070..482699ffc 100644
--- a/pkg/backup/client.go
+++ b/pkg/backup/client.go
@@ -546,7 +546,7 @@ func (bc *Client) fineGrainedBackup(
 	startKey, endKey []byte,
 	lastBackupTS uint64,
 	backupTS uint64,
-	compressType kvproto.BackupRequest_CompressionType,
+	compressType kvproto.CompressionType,
 	rateLimit uint64,
 	concurrency uint32,
 	rangeTree rtree.RangeTree,
@@ -711,7 +711,7 @@ func (bc *Client) handleFineGrained(
 	rg rtree.Range,
 	lastBackupTS uint64,
 	backupTS uint64,
-	compressType kvproto.BackupRequest_CompressionType,
+	compressType kvproto.CompressionType,
 	rateLimit uint64,
 	concurrency uint32,
 	respCh chan<- *kvproto.BackupResponse,
diff --git a/pkg/task/backup.go b/pkg/task/backup.go
index 22b1330d3..d42133480 100644
--- a/pkg/task/backup.go
+++ b/pkg/task/backup.go
@@ -43,11 +43,11 @@ const (
 type BackupConfig struct {
 	Config
 
-	TimeAgo         time.Duration                         `json:"time-ago" toml:"time-ago"`
-	BackupTS        uint64                                `json:"backup-ts" toml:"backup-ts"`
-	LastBackupTS    uint64                                `json:"last-backup-ts" toml:"last-backup-ts"`
-	GCTTL           int64                                 `json:"gc-ttl" toml:"gc-ttl"`
-	CompressionType kvproto.BackupRequest_CompressionType `json:"compression-type" toml:"compression-type"`
+	TimeAgo         time.Duration           `json:"time-ago" toml:"time-ago"`
+	BackupTS        uint64                  `json:"backup-ts" toml:"backup-ts"`
+	LastBackupTS    uint64                  `json:"last-backup-ts" toml:"last-backup-ts"`
+	GCTTL           int64                   `json:"gc-ttl" toml:"gc-ttl"`
+	CompressionType kvproto.CompressionType `json:"compression-type" toml:"compression-type"`
 }
 
 // DefineBackupFlags defines common flags for the backup command.
@@ -295,19 +295,19 @@ func parseTSString(ts string) (uint64, error) {
 	return variable.GoTimeToTS(t1), nil
 }
 
-func parseCompressionType(s string) (kvproto.BackupRequest_CompressionType, error) {
-	var ct kvproto.BackupRequest_CompressionType
+func parseCompressionType(s string) (kvproto.CompressionType, error) {
+	var ct kvproto.CompressionType
 	switch s {
 	case "lz4":
-		ct = kvproto.BackupRequest_LZ4
+		ct = kvproto.CompressionType_LZ4
 	case "snappy":
-		ct = kvproto.BackupRequest_SNAPPY
+		ct = kvproto.CompressionType_SNAPPY
 	case "zstd":
-		ct = kvproto.BackupRequest_ZSTD
+		ct = kvproto.CompressionType_ZSTD
 	case "":
-		ct = kvproto.BackupRequest_UNKNOWN
+		ct = kvproto.CompressionType_UNKNOWN
 	default:
-		return kvproto.BackupRequest_UNKNOWN, errors.Errorf("invalid compression type '%s'", s)
+		return kvproto.CompressionType_UNKNOWN, errors.Errorf("invalid compression type '%s'", s)
 	}
 	return ct, nil
 }
diff --git a/pkg/task/backup_raw.go b/pkg/task/backup_raw.go
index 40dd72053..6b583cdea 100644
--- a/pkg/task/backup_raw.go
+++ b/pkg/task/backup_raw.go
@@ -31,10 +31,10 @@ const (
 type RawKvConfig struct {
 	Config
 
-	StartKey        []byte                                `json:"start-key" toml:"start-key"`
-	EndKey          []byte                                `json:"end-key" toml:"end-key"`
-	CF              string                                `json:"cf" toml:"cf"`
-	CompressionType kvproto.BackupRequest_CompressionType `json:"compression-type" toml:"compression-type"`
+	StartKey        []byte                  `json:"start-key" toml:"start-key"`
+	EndKey          []byte                  `json:"end-key" toml:"end-key"`
+	CF              string                  `json:"cf" toml:"cf"`
+	CompressionType kvproto.CompressionType `json:"compression-type" toml:"compression-type"`
 }
 
 // DefineRawBackupFlags defines common flags for the backup command.

From 28003a70f88bf35cb3669d91546741626d8ecf49 Mon Sep 17 00:00:00 2001
From: glorv <glorvs@163.com>
Date: Tue, 7 Jul 2020 20:25:19 +0800
Subject: [PATCH 4/8] fix lint

---
 pkg/task/backup_raw.go | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/pkg/task/backup_raw.go b/pkg/task/backup_raw.go
index 4a2a8be4e..0bf10f37a 100644
--- a/pkg/task/backup_raw.go
+++ b/pkg/task/backup_raw.go
@@ -43,7 +43,8 @@ func DefineRawBackupFlags(command *cobra.Command) {
 	command.Flags().StringP(flagTiKVColumnFamily, "", "default", "backup specify cf, correspond to tikv cf")
 	command.Flags().StringP(flagStartKey, "", "", "backup raw kv start key, key is inclusive")
 	command.Flags().StringP(flagEndKey, "", "", "backup raw kv end key, key is exclusive")
-	command.Flags().String(flagCompressionType, "", "backup sst file compression algorithm, value can be one of 'lz4|zstd|snappy'")
+	command.Flags().String(flagCompressionType, "",
+		"backup sst file compression algorithm, value can be one of 'lz4|zstd|snappy'")
 }
 
 // ParseFromFlags parses the backup-related flags from the flag set.

From c02c5e8c9e7cddede2dad129c56f3039f835b8b3 Mon Sep 17 00:00:00 2001
From: glorv <glorvs@163.com>
Date: Wed, 8 Jul 2020 11:16:13 +0800
Subject: [PATCH 5/8] fix restore flag

---
 cmd/backup.go          |  2 +-
 pkg/task/backup_raw.go | 11 ++++++++++-
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/cmd/backup.go b/cmd/backup.go
index 971d4ef08..948249671 100644
--- a/cmd/backup.go
+++ b/cmd/backup.go
@@ -30,7 +30,7 @@ func runBackupCommand(command *cobra.Command, cmdName string) error {
 
 func runBackupRawCommand(command *cobra.Command, cmdName string) error {
 	cfg := task.RawKvConfig{Config: task.Config{LogProgress: HasLogFile()}}
-	if err := cfg.ParseFromFlags(command.Flags()); err != nil {
+	if err := cfg.ParseBackupConfigFromFlags(command.Flags()); err != nil {
 		command.SilenceUsage = false
 		return err
 	}
diff --git a/pkg/task/backup_raw.go b/pkg/task/backup_raw.go
index 0bf10f37a..f681a0f62 100644
--- a/pkg/task/backup_raw.go
+++ b/pkg/task/backup_raw.go
@@ -47,7 +47,7 @@ func DefineRawBackupFlags(command *cobra.Command) {
 		"backup sst file compression algorithm, value can be one of 'lz4|zstd|snappy'")
 }
 
-// ParseFromFlags parses the backup-related flags from the flag set.
+// ParseFromFlags parses the raw kv backup&restore common flags from the flag set.
 func (cfg *RawKvConfig) ParseFromFlags(flags *pflag.FlagSet) error {
 	format, err := flags.GetString(flagKeyFormat)
 	if err != nil {
@@ -81,6 +81,15 @@ func (cfg *RawKvConfig) ParseFromFlags(flags *pflag.FlagSet) error {
 	if err = cfg.Config.ParseFromFlags(flags); err != nil {
 		return errors.Trace(err)
 	}
+	return nil
+}
+
+// ParseBackupConfigFromFlags parses the backup-related flags from the flag set.
+func (cfg *RawKvConfig) ParseBackupConfigFromFlags(flags *pflag.FlagSet) error {
+	err := cfg.ParseFromFlags(flags)
+	if err != nil {
+		return err
+	}
 
 	compressionStr, err := flags.GetString(flagCompressionType)
 	if err != nil {

From 02ef27010ca1f43b4bf61f302fe00a3279f41566 Mon Sep 17 00:00:00 2001
From: glorv <glorvs@163.com>
Date: Wed, 8 Jul 2020 14:58:49 +0800
Subject: [PATCH 6/8] provide default value for flag compression

---
 pkg/task/backup.go | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/pkg/task/backup.go b/pkg/task/backup.go
index 541d67026..4f8b1bf3a 100644
--- a/pkg/task/backup.go
+++ b/pkg/task/backup.go
@@ -31,7 +31,7 @@ const (
 	flagBackupTimeago   = "timeago"
 	flagBackupTS        = "backupts"
 	flagLastBackupTS    = "lastbackupts"
-	flagCompressionType = "compression-type"
+	flagCompressionType = "compression"
 
 	flagGCTTL = "gcttl"
 
@@ -62,7 +62,8 @@ func DefineBackupFlags(flags *pflag.FlagSet) {
 	flags.String(flagBackupTS, "", "the backup ts support TSO or datetime,"+
 		" e.g. '400036290571534337', '2018-05-11 01:42:23'")
 	flags.Int64(flagGCTTL, backup.DefaultBRGCSafePointTTL, "the TTL (in seconds) that PD holds for BR's GC safepoint")
-	flags.String(flagCompressionType, "", "backup sst file compression algorithm, value can be one of 'lz4|zstd|snappy'")
+	flags.String(flagCompressionType, "lz4",
+		"backup sst file compression algorithm, value can be one of 'lz4|zstd|snappy'")
 }
 
 // ParseFromFlags parses the backup-related flags from the flag set.
@@ -319,8 +320,6 @@ func parseCompressionType(s string) (kvproto.CompressionType, error) {
 		ct = kvproto.CompressionType_SNAPPY
 	case "zstd":
 		ct = kvproto.CompressionType_ZSTD
-	case "":
-		ct = kvproto.CompressionType_UNKNOWN
 	default:
 		return kvproto.CompressionType_UNKNOWN, errors.Errorf("invalid compression type '%s'", s)
 	}

From 60a5befe1e0e321674c294a70f96bd2ce2ca18b2 Mon Sep 17 00:00:00 2001
From: glorv <glorvs@163.com>
Date: Wed, 8 Jul 2020 19:41:36 +0800
Subject: [PATCH 7/8] change default backup compression type from 'lz4' to
 'zstd' in favor of better performance

---
 pkg/task/backup.go     | 2 +-
 pkg/task/backup_raw.go | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/pkg/task/backup.go b/pkg/task/backup.go
index 9278b29f0..b79f33d35 100644
--- a/pkg/task/backup.go
+++ b/pkg/task/backup.go
@@ -62,7 +62,7 @@ func DefineBackupFlags(flags *pflag.FlagSet) {
 	flags.String(flagBackupTS, "", "the backup ts support TSO or datetime,"+
 		" e.g. '400036290571534337', '2018-05-11 01:42:23'")
 	flags.Int64(flagGCTTL, backup.DefaultBRGCSafePointTTL, "the TTL (in seconds) that PD holds for BR's GC safepoint")
-	flags.String(flagCompressionType, "lz4",
+	flags.String(flagCompressionType, "zstd",
 		"backup sst file compression algorithm, value can be one of 'lz4|zstd|snappy'")
 }
 
diff --git a/pkg/task/backup_raw.go b/pkg/task/backup_raw.go
index f681a0f62..4d237848b 100644
--- a/pkg/task/backup_raw.go
+++ b/pkg/task/backup_raw.go
@@ -43,7 +43,7 @@ func DefineRawBackupFlags(command *cobra.Command) {
 	command.Flags().StringP(flagTiKVColumnFamily, "", "default", "backup specify cf, correspond to tikv cf")
 	command.Flags().StringP(flagStartKey, "", "", "backup raw kv start key, key is inclusive")
 	command.Flags().StringP(flagEndKey, "", "", "backup raw kv end key, key is exclusive")
-	command.Flags().String(flagCompressionType, "",
+	command.Flags().String(flagCompressionType, "zstd",
 		"backup sst file compression algorithm, value can be one of 'lz4|zstd|snappy'")
 }
 

From 550b8683ed6816eceeb6cd76a494db70e959ca17 Mon Sep 17 00:00:00 2001
From: glorv <glorvs@163.com>
Date: Wed, 8 Jul 2020 20:39:27 +0800
Subject: [PATCH 8/8] fix a log bug

---
 pkg/backup/client.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pkg/backup/client.go b/pkg/backup/client.go
index 9643449fa..a86801434 100644
--- a/pkg/backup/client.go
+++ b/pkg/backup/client.go
@@ -815,7 +815,7 @@ func SendBackup(
 		// TODO: handle errors in the resp.
 		log.Info("range backuped",
 			zap.Stringer("StartKey", utils.WrapKey(resp.GetStartKey())),
-			zap.Stringer("EndKey", utils.WrapKey(req.GetEndKey())))
+			zap.Stringer("EndKey", utils.WrapKey(resp.GetEndKey())))
 		err = respFn(resp)
 		if err != nil {
 			return err