Skip to content

Commit 1c02ea3

Browse files
committed
update the grpc path for checksum
1 parent 0a2f3c0 commit 1c02ea3

File tree

5 files changed

+38
-6
lines changed

5 files changed

+38
-6
lines changed

google/cloud/storage/internal/grpc/object_request_parser.cc

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,15 @@ Status Finalize(google::storage::v2::WriteObjectRequest& write_request,
851851
Merge(std::move(hashes), hash_function.Finish()));
852852
}
853853

854+
Status Finalize(google::storage::v2::WriteObjectRequest& write_request,
855+
grpc::WriteOptions& options,
856+
storage::internal::HashValues hashes) {
857+
write_request.set_finish_write(true);
858+
options.set_last_message();
859+
return FinalizeChecksums(*write_request.mutable_object_checksums(),
860+
std::move(hashes));
861+
}
862+
854863
Status Finalize(google::storage::v2::BidiWriteObjectRequest& write_request,
855864
grpc::WriteOptions& options,
856865
storage::internal::HashFunction& hash_function,
@@ -879,8 +888,11 @@ Status MaybeFinalize(google::storage::v2::WriteObjectRequest& write_request,
879888
bool chunk_has_more) {
880889
if (!chunk_has_more) options.set_last_message();
881890
if (!request.last_chunk() || chunk_has_more) return {};
882-
return Finalize(write_request, options, request.hash_function(),
883-
request.known_object_hashes());
891+
if (request.hash_function_ptr()) {
892+
return Finalize(write_request, options, request.hash_function(),
893+
request.known_object_hashes());
894+
}
895+
return Finalize(write_request, options, request.known_object_hashes());
884896
}
885897

886898
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END

google/cloud/storage/internal/grpc/object_request_parser.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ Status Finalize(google::storage::v2::WriteObjectRequest& write_request,
8787
storage::internal::HashFunction& hash_function,
8888
storage::internal::HashValues = {});
8989

90+
Status Finalize(google::storage::v2::WriteObjectRequest& write_request,
91+
grpc::WriteOptions& options,
92+
storage::internal::HashValues hashes);
93+
9094
Status Finalize(google::storage::v2::BidiWriteObjectRequest& write_request,
9195
grpc::WriteOptions& options,
9296
storage::internal::HashFunction& hash_function,

google/cloud/storage/internal/grpc/stub.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,9 @@ StatusOr<storage::internal::QueryResumableUploadResponse> GrpcStub::UploadChunk(
630630
auto& data = *proto_request.mutable_checksummed_data();
631631
SetMutableContent(data, splitter.Next());
632632
data.set_crc32c(Crc32c(GetContent(data)));
633-
request.hash_function().Update(offset, GetContent(data), data.crc32c());
633+
if (request.hash_function_ptr()) {
634+
request.hash_function().Update(offset, GetContent(data), data.crc32c());
635+
}
634636
offset += GetContent(data).size();
635637

636638
auto wopts = grpc::WriteOptions();

google/cloud/storage/internal/object_requests.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,10 @@ UploadChunkRequest UploadChunkRequest::RemainingChunk(
533533
HashValues FinishHashes(UploadChunkRequest const& request) {
534534
// Prefer the hashes provided via *Value options in the request. If those
535535
// are not set, use the computed hashes from the data.
536-
return Merge(request.known_object_hashes(), request.hash_function().Finish());
536+
if (auto hf = request.hash_function_ptr()) {
537+
return Merge(request.known_object_hashes(), hf->Finish());
538+
}
539+
return request.known_object_hashes();
537540
}
538541

539542
std::ostream& operator<<(std::ostream& os, UploadChunkRequest const& r) {

google/cloud/storage/tests/object_checksum_integration_test.cc

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,15 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectDefault) {
131131
auto client = MakeIntegrationTestClient();
132132
auto object_name = MakeRandomObjectName();
133133

134+
auto create = client.CreateBucket(
135+
bucket_name_, storage::BucketMetadata{}.set_location("us-west4")
136+
.set_storage_class("STANDARD"));
137+
if (!create && create.status().code() != StatusCode::kAlreadyExists) {
138+
GTEST_FAIL() << "cannot create bucket: " << create.status();
139+
} else {
140+
std::cout << "Bucket successfully created." << std::endl;
141+
}
142+
134143
auto os = client.WriteObject(bucket_name_, object_name, DisableMD5Hash(true),
135144
IfGenerationMatch(0));
136145
os << LoremIpsum();
@@ -322,8 +331,10 @@ TEST_F(ObjectChecksumIntegrationTest, WriteObjectWithIncorrectChecksumValue) {
322331
auto meta = os.metadata();
323332
EXPECT_THAT(meta, Not(IsOk()));
324333

325-
// The server returns FAILED_PRECONDITION (412) for checksum mismatches during
326-
// finalization
334+
if(UsingGrpc()) {
335+
EXPECT_THAT(meta, StatusIs(StatusCode::kInvalidArgument));
336+
return;
337+
}
327338
EXPECT_THAT(meta, StatusIs(StatusCode::kFailedPrecondition));
328339
}
329340

0 commit comments

Comments
 (0)