Reduce the ListRequests for a recursive put for targets ending in "/" #821
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Recently we have found that
s3.put("/var/tmp/", "s3://test/wibble")
ands3.put("/var/tmp/", "s3://test/wibble/")
result in one ListObjectsV2 per directory which is written.Investigation indicates it is the _exists check to see if the bucket you are writing to really exists. It does this for every directory. In practice we have seen 12 ListObjectsV2 calls for 1 PutObject.
This pull request resolves this for targets with do not end in "/" because it leverages the dircache state from the
isdir()
call to see if this bucket already exists. Targets which do end in "/" skip theisdir()
call and still exhibit the old behaviour. Best would be if there would be a way to cache the _exists result or maybe disable the bucket creation entirely.I didn't know how to cache the _exists result in the current
DirCache
setup.To test this properly I created a fixture which allows you to count the requests made to S3. That may be useful for other similar problems as well.