diff --git a/integration/v3_auth_test.go b/integration/v3_auth_test.go index d0965a789..03ea88cd9 100644 --- a/integration/v3_auth_test.go +++ b/integration/v3_auth_test.go @@ -15,6 +15,8 @@ package integration import ( + "fmt" + "sync" "testing" "time" @@ -292,3 +294,41 @@ func TestV3AuthNonAuthorizedRPCs(t *testing.T) { t.Fatalf("could put key (%v), it should cause an error of permission denied", respput) } } + +func TestV3AuthOldRevConcurrent(t *testing.T) { + defer testutil.AfterTest(t) + clus := NewClusterV3(t, &ClusterConfig{Size: 1}) + defer clus.Terminate(t) + + authSetupRoot(t, toGRPC(clus.Client(0)).Auth) + + c, cerr := clientv3.New(clientv3.Config{ + Endpoints: clus.Client(0).Endpoints(), + DialTimeout: 5 * time.Second, + Username: "root", + Password: "123", + }) + testutil.AssertNil(t, cerr) + defer c.Close() + + var wg sync.WaitGroup + f := func(i int) { + defer wg.Done() + role, user := fmt.Sprintf("test-role-%d", i), fmt.Sprintf("test-user-%d", i) + _, err := c.RoleAdd(context.TODO(), role) + testutil.AssertNil(t, err) + _, err = c.RoleGrantPermission(context.TODO(), role, "", clientv3.GetPrefixRangeEnd(""), clientv3.PermissionType(clientv3.PermReadWrite)) + testutil.AssertNil(t, err) + _, err = c.UserAdd(context.TODO(), user, "123") + testutil.AssertNil(t, err) + _, err = c.Put(context.TODO(), "a", "b") + testutil.AssertNil(t, err) + } + // needs concurrency to trigger + numRoles := 2 + wg.Add(numRoles) + for i := 0; i < numRoles; i++ { + go f(i) + } + wg.Wait() +}