Skip to content

Commit 2dc8ad3

Browse files
committed
ING-1451: Add support for VBUUID to CheckDocument
1 parent 744f4ad commit 2dc8ad3

4 files changed

Lines changed: 95 additions & 3 deletions

File tree

gateway/dataimpl/server_v1/xdcrserver.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,10 @@ func (s *XdcrServer) CheckDocument(
553553
opts.Key = []byte(in.Key)
554554
opts.FetchDatatype = true
555555

556+
if in.VbUuid != nil {
557+
opts.VBUUID = *in.VbUuid
558+
}
559+
556560
metaRes, err := bucketAgent.GetMeta(ctx, &opts)
557561
if err != nil {
558562
if errors.Is(err, memdx.ErrDocNotFound) {
@@ -569,6 +573,8 @@ func (s *XdcrServer) CheckDocument(
569573
return nil, s.errorHandler.NewScopeMissingStatus(ctx, err, in.BucketName, in.ScopeName).Err()
570574
} else if errors.Is(err, memdx.ErrAccessError) {
571575
return nil, s.errorHandler.NewCollectionNoReadAccessStatus(ctx, err, in.BucketName, in.ScopeName, in.CollectionName).Err()
576+
} else if errors.Is(err, gocbcorex.ErrVbucketUUIDMismatch) {
577+
return nil, s.errorHandler.NewVbUuidDivergenceStatus(ctx, err, in.BucketName, in.ScopeName, in.CollectionName, in.Key).Err()
572578
}
573579
return nil, s.errorHandler.NewGenericStatus(ctx, err).Err()
574580
}

gateway/test/xdcr_test.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,32 @@ func (s *GatewayOpsTestSuite) TestXdcrCheckDocument() {
350350
}, grpc.PerRPCCredentials(s.basicRpcCreds))
351351
requireRpcSuccess(s.T(), resp, err)
352352
})
353+
354+
s.Run("VbUuidMismatch", func() {
355+
docId := s.randomDocId()
356+
357+
// we just make up a cas for testing purposes
358+
var docCreateCas uint64 = 1234
359+
360+
// we just make up a vbuuid that won't match
361+
var vbuuidMismatch uint64 = 99999
362+
363+
_, err := xdcrClient.CheckDocument(context.Background(), &internal_xdcr_v1.CheckDocumentRequest{
364+
BucketName: s.bucketName,
365+
ScopeName: s.scopeName,
366+
CollectionName: s.collectionName,
367+
Key: docId,
368+
StoreCas: docCreateCas,
369+
ContentFlags: TEST_CONTENT_FLAGS,
370+
ExpiryTime: nil, // no expiry
371+
Revno: 1,
372+
VbUuid: &vbuuidMismatch,
373+
}, grpc.PerRPCCredentials(s.basicRpcCreds))
374+
assertRpcStatus(s.T(), err, codes.Aborted)
375+
assertRpcErrorDetails(s.T(), err, func(d *epb.ErrorInfo) {
376+
assert.Equal(s.T(), "VBUUID_MISMATCH", d.Reason)
377+
})
378+
})
353379
})
354380

355381
s.Run("Set", func() {
@@ -404,6 +430,36 @@ func (s *GatewayOpsTestSuite) TestXdcrCheckDocument() {
404430
})
405431
})
406432

433+
s.Run("VbUuidMismatch", func() {
434+
docId := s.testDocId()
435+
// we just make up a vbuuid that won't match
436+
var vbuuidMismatch uint64 = 99999
437+
438+
getResp, err := xdcrClient.GetDocument(context.Background(), &internal_xdcr_v1.GetDocumentRequest{
439+
BucketName: s.bucketName,
440+
ScopeName: s.scopeName,
441+
CollectionName: s.collectionName,
442+
Key: docId,
443+
}, grpc.PerRPCCredentials(s.basicRpcCreds))
444+
requireRpcSuccess(s.T(), getResp, err)
445+
446+
_, err = xdcrClient.CheckDocument(context.Background(), &internal_xdcr_v1.CheckDocumentRequest{
447+
BucketName: s.bucketName,
448+
ScopeName: s.scopeName,
449+
CollectionName: s.collectionName,
450+
Key: docId,
451+
StoreCas: getResp.Cas + 10,
452+
ContentFlags: TEST_CONTENT_FLAGS,
453+
ExpiryTime: nil, // no expiry
454+
Revno: getResp.Revno + 10,
455+
VbUuid: &vbuuidMismatch,
456+
}, grpc.PerRPCCredentials(s.basicRpcCreds))
457+
assertRpcStatus(s.T(), err, codes.Aborted)
458+
assertRpcErrorDetails(s.T(), err, func(d *epb.ErrorInfo) {
459+
assert.Equal(s.T(), "VBUUID_MISMATCH", d.Reason)
460+
})
461+
})
462+
407463
s.Run("Xattr", func() {
408464
s.Run("Both", func() {
409465
docId := s.randomDocId()
@@ -569,6 +625,36 @@ func (s *GatewayOpsTestSuite) TestXdcrCheckDocument() {
569625
requireRpcSuccess(s.T(), delResp, err)
570626
})
571627

628+
s.Run("VbUuidMismatch", func() {
629+
docId := s.testDocId()
630+
// we just make up a vbuuid that won't match
631+
var vbuuidMismatch uint64 = 99999
632+
633+
getResp, err := xdcrClient.GetDocument(context.Background(), &internal_xdcr_v1.GetDocumentRequest{
634+
BucketName: s.bucketName,
635+
ScopeName: s.scopeName,
636+
CollectionName: s.collectionName,
637+
Key: docId,
638+
IncludeContent: false,
639+
}, grpc.PerRPCCredentials(s.basicRpcCreds))
640+
requireRpcSuccess(s.T(), getResp, err)
641+
642+
_, err = xdcrClient.CheckDocument(context.Background(), &internal_xdcr_v1.CheckDocumentRequest{
643+
BucketName: s.bucketName,
644+
ScopeName: s.scopeName,
645+
CollectionName: s.collectionName,
646+
Key: docId,
647+
StoreCas: getResp.Cas + 10,
648+
Revno: getResp.Revno + 10,
649+
IsDeleted: true,
650+
VbUuid: &vbuuidMismatch,
651+
}, grpc.PerRPCCredentials(s.basicRpcCreds))
652+
assertRpcStatus(s.T(), err, codes.Aborted)
653+
assertRpcErrorDetails(s.T(), err, func(d *epb.ErrorInfo) {
654+
assert.Equal(s.T(), "VBUUID_MISMATCH", d.Reason)
655+
})
656+
})
657+
572658
s.Run("LwwFail", func() {
573659
docId := s.testDocId()
574660

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ require (
99
github.com/aws/aws-sdk-go-v2/config v1.32.8
1010
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.41.1
1111
github.com/couchbase/gocbcorex v0.0.0-20260302200007-00087f22161f
12-
github.com/couchbase/goprotostellar v1.0.6-0.20260317184007-a27c5e150d66
12+
github.com/couchbase/goprotostellar v1.0.6-0.20260407143512-d7af25156dcc
1313
github.com/couchbaselabs/gocbconnstr v1.0.5
1414
github.com/couchbaselabs/gocbconnstr/v2 v2.0.0
1515
github.com/fsnotify/fsnotify v1.9.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/T
7070
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI=
7171
github.com/couchbase/gocbcorex v0.0.0-20260302200007-00087f22161f h1:eGRME9PeeeSGK+g/2Ixz5CiEaQbuo2lN7/NMA50p+To=
7272
github.com/couchbase/gocbcorex v0.0.0-20260302200007-00087f22161f/go.mod h1:yhzN/7UDbjYEYD9Ee7gOMD5f4ViYT4QjnnjrATiwcoQ=
73-
github.com/couchbase/goprotostellar v1.0.6-0.20260317184007-a27c5e150d66 h1:HdbqY+99YI8W/ZgAVd6du7VNemPEV/HuNW+f46GCTug=
74-
github.com/couchbase/goprotostellar v1.0.6-0.20260317184007-a27c5e150d66/go.mod h1:X58ot5FRqlBTBkwG/oI4klunpu4MApjGktheqeRWQw0=
73+
github.com/couchbase/goprotostellar v1.0.6-0.20260407143512-d7af25156dcc h1:wQfvYGOutMCo9be0xnHtM1FqnwKcmPVGRPx6xXw5wOo=
74+
github.com/couchbase/goprotostellar v1.0.6-0.20260407143512-d7af25156dcc/go.mod h1:X58ot5FRqlBTBkwG/oI4klunpu4MApjGktheqeRWQw0=
7575
github.com/couchbaselabs/gocbconnstr v1.0.5 h1:e0JokB5qbcz7rfnxEhNRTKz8q1svoRvDoZihsiwNigA=
7676
github.com/couchbaselabs/gocbconnstr v1.0.5/go.mod h1:KV3fnIKMi8/AzX0O9zOrO9rofEqrRF1d2rG7qqjxC7o=
7777
github.com/couchbaselabs/gocbconnstr/v2 v2.0.0 h1:HU9DlAYYWR69jQnLN6cpg0fh0hxW/8d5hnglCXXjW78=

0 commit comments

Comments
 (0)