From f800ab41381bf8b4d1b80c4efab6129c8f883503 Mon Sep 17 00:00:00 2001 From: kennytm Date: Wed, 5 Sep 2018 11:12:25 +0800 Subject: [PATCH] restore, kv: detect if SwitchMode exists instead of check version TiKV and PD's versions are exposed before 2.1, so we can't rely on their APIs to verify for 2.0.4+. Since the only reason we need 2.0.4+ is the SwitchMode gRPC interface, we instead inspect if SwitchMode is unimplemented and display a user-friendly message on stderr. --- lightning/kv/kv-deliver.go | 6 ++++++ lightning/restore/restore.go | 7 +++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lightning/kv/kv-deliver.go b/lightning/kv/kv-deliver.go index cd3196917..f1de66f48 100644 --- a/lightning/kv/kv-deliver.go +++ b/lightning/kv/kv-deliver.go @@ -1,7 +1,10 @@ package kv import ( + "fmt" "math" + "os" + "strings" "sync" "time" @@ -639,6 +642,9 @@ func (c *KVDeliverClient) Switch(mode sstpb.SwitchMode) error { } _, err := c.cli.SwitchMode(c.ctx, req) if err != nil { + if strings.Contains(err.Error(), "status: Unimplemented") { + fmt.Fprintln(os.Stderr, "Error: The TiKV instance does not support mode switching. Please make sure the TiKV version is 2.0.4 or above.") + } return errors.Trace(err) } common.AppLogger.Infof("switch to tikv %s mode takes %v", mode, time.Since(timer)) diff --git a/lightning/restore/restore.go b/lightning/restore/restore.go index b999db0ca..88cf7ff20 100644 --- a/lightning/restore/restore.go +++ b/lightning/restore/restore.go @@ -399,11 +399,14 @@ func (rc *RestoreController) checkRequirements(_ context.Context) error { if err := rc.checkTiDBVersion(client); err != nil { return errors.Trace(err) } + // TODO: Reenable the PD/TiKV version check after we upgrade the dependency to 2.1. if err := rc.checkPDVersion(client); err != nil { - return errors.Trace(err) + // return errors.Trace(err) + common.AppLogger.Infof("PD version check failed: %v", err) } if err := rc.checkTiKVVersion(client); err != nil { - return errors.Trace(err) + // return errors.Trace(err) + common.AppLogger.Infof("TiKV version check failed: %v", err) } return nil