fix(s3): include directory markers in ListObjects without delimiter (#8704)

* fix(s3): include directory markers in ListObjects without delimiter (#8698)

Directory key objects (zero-byte objects with keys ending in "/") created
via PutObject were omitted from ListObjects/ListObjectsV2 results when no
delimiter was specified. AWS S3 includes these as regular keys in Contents.

The issue was in doListFilerEntries: when recursing into directories in
non-delimiter mode, directory key objects were only emitted when
prefixEndsOnDelimiter was true. Added an else branch to emit them in the
general recursive case as well.

* remove issue reference from inline comment

* test: add child-under-marker and paginated listing coverage

Extend test 6 to place a child object under the directory marker
and paginate with MaxKeys=1 so the emit-then-recurse truncation
path is exercised.

* fix(test): skip directory markers in Spark temporary artifacts check

The listing check now correctly shows directory markers (keys ending
in "/") after the ListObjects fix. These 0-byte metadata objects are
not data artifacts — filter them from the listing check since the
HeadObject-based check already verifies their cleanup with a timeout.
This commit is contained in:
Chris Lu
2026-03-19 15:36:11 -07:00
committed by GitHub
parent 5e76f55077
commit 80f3079d2a
3 changed files with 255 additions and 3 deletions

View File

@@ -50,6 +50,12 @@ print("WRITE_COUNT=" + str(count))
keys := listObjectKeysByPrefix(t, env, "test", "issue-8285/")
var temporaryKeys []string
for _, key := range keys {
// Skip directory markers (keys ending in "/") — these are 0-byte
// metadata objects, not data artifacts. They are verified separately
// via HeadObject with a timeout below.
if strings.HasSuffix(key, "/") {
continue
}
if hasTemporaryPathSegment(key) {
temporaryKeys = append(temporaryKeys, key)
}