Jets3tNativeFileSystemStore.copy(String, String) handles its exceptions with handleServiceException(String, ServiceException), which behaves like:
1) Throw FileNotFoundException if the exception's error code is NoSuchKey
2) Otherwise, throw IOException if the exception's cause is an IOException
3) Otherwise, LOG.debug a message and throw nothing
So S3 exceptions other than NoSuchKey (like RequestTimeout, ServiceUnavailable) are suppressed. This makes "copy" fail while still returning as if it succeeded. Furthermore since NativeS3FileSystem's "rename" is implemented as a copy followed by a delete, this means "rename" can delete the source key even though the copy has failed.