Conversation
|
Follow-up scenario verification found one additional Local FS replacement edge case and it is now included in A compressed write creates an The uncompressed paths now remove the stale sidecar only after a successful copy. I also expanded both replacement regressions to cover shorter, longer, equal-length, and empty payloads. Fresh verification after the update:
The Docker-backed integration tests remain unavailable locally because rootless Docker is not installed. |
|
Thanks for the Local FS overwrite fix! The change has been merged here: a334b20 |
Summary
.uncompressed-sizesidecars after successful uncompressed replacementsPutand uncompressedStoreFileacross shorter, longer, equal-length, and empty replacementsWhy
The Local FS backend opened existing files without
O_TRUNC. Writing a shorter replacement started at offset zero but retained the previous suffix, unlike object-storage put semantics.A compressed object also leaves an
.uncompressed-sizesidecar thatSize()prefers. If the same object is later replaced through an uncompressed path, that sidecar must be removed orSize()reports the old value even when the replacement bytes are correct.The truncation flag remains limited to
getHandle(false), whose only callers are complete-object replacement paths. Sidecar cleanup happens only after a successful uncompressed copy. Read/range-read and compressedStoreFilebehavior remain unchanged.Validation
Putand uncompressedStoreFile: shorter, longer, equal-length, and emptygolangci-lint run --new-from-rev=upstream/main ./...frompackages/shared(0 issues)The complete storage suite was also attempted; its Docker-backed Azure, GCS, and S3 integration tests cannot start locally because rootless Docker is unavailable.
Closes #3642.