Skip to content

Commit 95f5f47

Browse files
committed
enable fast resume for rapid object write streams
1 parent 5b52b68 commit 95f5f47

File tree

2 files changed

+11
-0
lines changed

2 files changed

+11
-0
lines changed

google/cloud/storage/internal/async/writer_connection_resumed.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,12 @@ class AsyncWriterConnectionResumedState
334334
append_object_spec.set_bucket(spec.bucket());
335335
append_object_spec.set_object(spec.object());
336336
}
337+
// Include write_handle to enable fast resume instead of slow
338+
// takeover. Without handle, server performs full state validation.
339+
if (first_response_.has_write_handle()) {
340+
*append_object_spec.mutable_write_handle() =
341+
first_response_.write_handle();
342+
}
337343
append_object_spec.set_generation(first_response_.resource().generation());
338344
ApplyWriteRedirectErrors(append_object_spec, std::move(proto_status));
339345

google/cloud/storage/internal/async/writer_connection_resumed_test.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,8 @@ TEST(WriteConnectionResumed, ResumeUsesWriteObjectSpecFromInitialRequest) {
268268
"test-object");
269269

270270
google::storage::v2::BidiWriteObjectResponse first_response;
271+
google::storage::v2::BidiWriteHandle write_handle;
272+
first_response.mutable_write_handle()->CopyFrom(write_handle);
271273
first_response.mutable_resource()->set_generation(12345);
272274

273275
EXPECT_CALL(*mock, PersistedState)
@@ -318,6 +320,7 @@ TEST(WriteConnectionResumed, ResumeUsesWriteObjectSpecFromInitialRequest) {
318320

319321
EXPECT_FALSE(captured_request.has_write_object_spec());
320322
EXPECT_TRUE(captured_request.has_append_object_spec());
323+
EXPECT_TRUE(captured_request.append_object_spec().has_write_handle());
321324
EXPECT_EQ(captured_request.append_object_spec().generation(), 12345);
322325
EXPECT_EQ(captured_request.append_object_spec().object(), "test-object");
323326
EXPECT_EQ(captured_request.append_object_spec().bucket(),
@@ -333,6 +336,7 @@ TEST(WriteConnectionResumed, ResumeUsesAppendObjectSpecFromInitialRequest) {
333336
initial_request.mutable_append_object_spec()->set_object("test-object");
334337

335338
google::storage::v2::BidiWriteObjectResponse first_response;
339+
first_response.clear_write_handle();
336340
first_response.mutable_resource()->set_generation(12345);
337341

338342
EXPECT_CALL(*mock, PersistedState)
@@ -383,6 +387,7 @@ TEST(WriteConnectionResumed, ResumeUsesAppendObjectSpecFromInitialRequest) {
383387

384388
EXPECT_FALSE(captured_request.has_write_object_spec());
385389
EXPECT_TRUE(captured_request.has_append_object_spec());
390+
EXPECT_FALSE(captured_request.append_object_spec().has_write_handle());
386391
EXPECT_EQ(captured_request.append_object_spec().generation(), 12345);
387392
EXPECT_EQ(captured_request.append_object_spec().object(), "test-object");
388393
EXPECT_EQ(captured_request.append_object_spec().bucket(),

0 commit comments

Comments
 (0)