From 3381f154a0a0b1999f790eeaa1d8f4ff2d5735bd Mon Sep 17 00:00:00 2001 From: westhood Date: Thu, 7 Jul 2016 10:45:41 +0800 Subject: [PATCH] clientv3: fix sync base It is not correct to use WithPrefix. Range end will change in every internal batch. --- clientv3/integration/mirror_test.go | 35 +++++++++++++++++++++++++++++ clientv3/mirror/syncer.go | 2 +- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/clientv3/integration/mirror_test.go b/clientv3/integration/mirror_test.go index de74e09e6e63..1a47be47aeda 100644 --- a/clientv3/integration/mirror_test.go +++ b/clientv3/integration/mirror_test.go @@ -15,6 +15,7 @@ package integration import ( + "fmt" "reflect" "testing" "time" @@ -69,3 +70,37 @@ func TestMirrorSync(t *testing.T) { t.Fatal("failed to receive update in one second") } } + +func TestMirrorSyncBase(t *testing.T) { + cluster := integration.NewClusterV3(nil, &integration.ClusterConfig{Size: 1}) + defer cluster.Terminate(nil) + + cli := cluster.Client(0) + ctx := context.TODO() + + for i := 0; i < 2000; i++ { + if _, err := cli.Put(ctx, fmt.Sprintf("test%d", i), "test"); err != nil { + t.Fatal(err) + } + } + + syncer := mirror.NewSyncer(cli, "test", 0) + respCh, errCh := syncer.SyncBase(ctx) + + count := 0 + + for resp := range respCh { + count = count + len(resp.Kvs) + if !resp.More { + break + } + } + + for err := range errCh { + t.Fatalf("unexpected error %v", err) + } + + if count != 2000 { + t.Errorf("unexpected kv count: %d", count) + } +} diff --git a/clientv3/mirror/syncer.go b/clientv3/mirror/syncer.go index 58aae940e83f..f2a8f107f678 100644 --- a/clientv3/mirror/syncer.go +++ b/clientv3/mirror/syncer.go @@ -78,7 +78,7 @@ func (s *syncer) SyncBase(ctx context.Context) (<-chan clientv3.GetResponse, cha // If len(s.prefix) != 0, we will sync key-value space with given prefix. // We then range from the prefix to the next prefix if exists. Or we will // range from the prefix to the end if the next prefix does not exists. - opts = append(opts, clientv3.WithPrefix()) + opts = append(opts, clientv3.WithRange(clientv3.GetPrefixRangeEnd(s.prefix))) key = s.prefix }