Skip to content

Commit

Permalink
support for atomic writes for gcp
Browse files Browse the repository at this point in the history
  • Loading branch information
sandeepvinayak authored and Sandeep Pal committed Feb 17, 2025
1 parent 4d1f585 commit 2a9a605
Show file tree
Hide file tree
Showing 23 changed files with 29 additions and 2 deletions.
29 changes: 28 additions & 1 deletion docstore/gcpfirestore/fs.go
Original file line number Diff line number Diff line change
Expand Up @@ -265,8 +265,9 @@ func (c *collection) RevisionField() string {
// RunActions implements driver.RunActions.
func (c *collection) RunActions(ctx context.Context, actions []*driver.Action, opts *driver.RunActionsOptions) driver.ActionListError {
errs := make([]error, len(actions))
beforeGets, gets, writes, _, afterGets := driver.GroupActions(actions)
beforeGets, gets, writes, writesTx, afterGets := driver.GroupActions(actions)
calls := c.buildCommitCalls(writes, errs)
atomicWritesCall := c.buildAtomicWritesCommitCall(writesTx, errs)
// runGets does not issue concurrent RPCs, so it doesn't need a throttle.
c.runGets(ctx, beforeGets, errs, opts)
t := driver.NewThrottle(c.opts.MaxOutstandingActionRPCs)
Expand All @@ -278,6 +279,15 @@ func (c *collection) RunActions(ctx context.Context, actions []*driver.Action, o
c.doCommitCall(ctx, call, errs, opts)
}()
}
// commit the atomic writes
if atomicWritesCall != nil {
t.Acquire()
go func() {
defer t.Release()
c.doCommitCall(ctx, atomicWritesCall, errs, opts)
}()
}

t.Acquire()
c.runGets(ctx, gets, errs, opts)
t.Release()
Expand Down Expand Up @@ -407,6 +417,23 @@ func (c *collection) buildCommitCalls(actions []*driver.Action, errs []error) []
return append(pCalls, nCall)
}

// Construct a set of concurrently runnable calls to Commit.
func (c *collection) buildAtomicWritesCommitCall(actions []*driver.Action, errs []error) *commitCall {
atomicWritesCommitCall := &commitCall{}
for _, a := range actions {
ws, nn, err := c.actionToWrites(a)
if err != nil {
errs[a.Index] = err
return nil
} else {
atomicWritesCommitCall.writes = append(atomicWritesCommitCall.writes, ws...)
atomicWritesCommitCall.actions = append(atomicWritesCommitCall.actions, a)
atomicWritesCommitCall.newNames = append(atomicWritesCommitCall.newNames, nn)
}
}
return atomicWritesCommitCall
}

// Convert an action to one or more Firestore Write protos.
func (c *collection) actionToWrites(a *driver.Action) ([]*pb.Write, string, error) {
var (
Expand Down
2 changes: 1 addition & 1 deletion docstore/gcpfirestore/fs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import (

const (
// projectID is the project ID that was used during the last test run using --record.
projectID = "go-cloud-test-216917"
projectID = "go-cloud-test-216918"
collectionName1 = "docstore-test-1"
collectionName2 = "docstore-test-2"
collectionName3 = "docstore-test-3"
Expand Down
Binary file not shown.
Binary file not shown.
Binary file modified docstore/gcpfirestore/testdata/TestConformance/As/verify_As.replay
Binary file not shown.
Binary file not shown.
Binary file modified docstore/gcpfirestore/testdata/TestConformance/BeforeDo.replay
Binary file not shown.
Binary file modified docstore/gcpfirestore/testdata/TestConformance/BeforeQuery.replay
Binary file not shown.
Binary file modified docstore/gcpfirestore/testdata/TestConformance/Create.replay
Binary file not shown.
Binary file modified docstore/gcpfirestore/testdata/TestConformance/Data.replay
Binary file not shown.
Binary file modified docstore/gcpfirestore/testdata/TestConformance/Delete.replay
Binary file not shown.
Binary file modified docstore/gcpfirestore/testdata/TestConformance/ExampleInDoc.replay
Binary file not shown.
Binary file modified docstore/gcpfirestore/testdata/TestConformance/Get.replay
Binary file not shown.
Binary file modified docstore/gcpfirestore/testdata/TestConformance/GetQuery.replay
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified docstore/gcpfirestore/testdata/TestConformance/Proto.replay
Binary file not shown.
Binary file modified docstore/gcpfirestore/testdata/TestConformance/Put.replay
Binary file not shown.
Binary file modified docstore/gcpfirestore/testdata/TestConformance/Replace.replay
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified docstore/gcpfirestore/testdata/TestConformance/Update.replay
Binary file not shown.

0 comments on commit 2a9a605

Please sign in to comment.