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
DirCachesetup.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.