Skip to content

Commit 6d86ef0

Browse files
authored
feat: update appendable blob metadata crc32c field (#722)
* feat: update appendable blob metadata crc32c field * remove extra line * remove extra line
1 parent e839baa commit 6d86ef0

File tree

2 files changed

+29
-19
lines changed

2 files changed

+29
-19
lines changed

gcs/upload.py

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,27 @@ def response(msg):
433433
msg.resource.size = obj_len
434434
return msg
435435

436+
def update_upload_checksums(upload_metadata, object_checksums):
437+
if object_checksums is None:
438+
upload_metadata.metadata["x_emulator_no_crc32c"] = "true"
439+
upload_metadata.metadata["x_emulator_no_md5"] = "true"
440+
else:
441+
if object_checksums.HasField("crc32c"):
442+
upload_metadata.metadata[
443+
"x_emulator_crc32c"
444+
] = testbench.common.rest_crc32c_from_proto(object_checksums.crc32c)
445+
else:
446+
upload_metadata.metadata["x_emulator_no_crc32c"] = "true"
447+
if (
448+
object_checksums.md5_hash is not None
449+
and object_checksums.md5_hash != b""
450+
):
451+
upload_metadata.metadata[
452+
"x_emulator_md5"
453+
] = testbench.common.rest_md5_from_proto(object_checksums.md5_hash)
454+
else:
455+
upload_metadata.metadata["x_emulator_no_md5"] = "true"
456+
436457
for request in request_iterator:
437458
if request.HasField("first_message"):
438459
testbench.error.invalid("Multiple first_message", context)
@@ -511,9 +532,12 @@ def response(msg):
511532
# TODO(#720): (b) Decide if the testbench checks for flush or/and performs a background force-close.
512533
if is_appendable:
513534

535+
update_upload_checksums(upload.metadata, object_checksums)
536+
514537
def update_appendable_blob(blob, unused_generation):
515538
blob.media = upload.media
516539
blob.metadata.size = len(upload.media)
540+
blob.metadata.checksums.crc32c = crc32c.crc32c(upload.media)
517541
return blob
518542

519543
blob = db.do_update_object(
@@ -540,25 +564,8 @@ def update_appendable_blob(blob, unused_generation):
540564
)
541565
)
542566

543-
if object_checksums is None:
544-
upload.metadata.metadata["x_emulator_no_crc32c"] = "true"
545-
upload.metadata.metadata["x_emulator_no_md5"] = "true"
546-
else:
547-
if object_checksums.HasField("crc32c"):
548-
upload.metadata.metadata[
549-
"x_emulator_crc32c"
550-
] = testbench.common.rest_crc32c_from_proto(object_checksums.crc32c)
551-
else:
552-
upload.metadata.metadata["x_emulator_no_crc32c"] = "true"
553-
if (
554-
object_checksums.md5_hash is not None
555-
and object_checksums.md5_hash != b""
556-
):
557-
upload.metadata.metadata[
558-
"x_emulator_md5"
559-
] = testbench.common.rest_md5_from_proto(object_checksums.md5_hash)
560-
else:
561-
upload.metadata.metadata["x_emulator_no_md5"] = "true"
567+
# Update metadata checksums fields on the upload instance.
568+
update_upload_checksums(upload.metadata, object_checksums)
562569

563570
# Create a new object when the write is completed.
564571
if upload.complete:

tests/test_grpc_server.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2149,6 +2149,9 @@ def test_bidi_write_object_appendable_unfinalized_persisted_media_size(self):
21492149
crc32c.crc32c(media),
21502150
crc32c.crc32c(b"".join([c.checksummed_data.content for c in chunks])),
21512151
)
2152+
self.assertEqual(
2153+
[crc32c.crc32c(media)], [c.metadata.checksums.crc32c for c in chunks]
2154+
)
21522155

21532156
def test_bidi_write_object_no_requests(self):
21542157
# The code depends on `context.abort()` raising an exception.

0 commit comments

Comments
 (0)