Merge pull request #11518 from nextcloud/feature/noid/save-s3-requests
S3 reuse information from listObject and skip headObject
This commit is contained in:
commit
2a9e006355
|
@ -61,10 +61,14 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
|||
/** @var CappedMemoryCache|Result[] */
|
||||
private $objectCache;
|
||||
|
||||
/** @var CappedMemoryCache|array */
|
||||
private $filesCache;
|
||||
|
||||
public function __construct($parameters) {
|
||||
parent::__construct($parameters);
|
||||
$this->parseParams($parameters);
|
||||
$this->objectCache = new CappedMemoryCache();
|
||||
$this->filesCache = new CappedMemoryCache();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -94,6 +98,7 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
|||
|
||||
private function clearCache() {
|
||||
$this->objectCache = new CappedMemoryCache();
|
||||
$this->filesCache = new CappedMemoryCache();
|
||||
}
|
||||
|
||||
private function invalidateCache($key) {
|
||||
|
@ -105,6 +110,7 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
|||
unset($this->objectCache[$existingKey]);
|
||||
}
|
||||
}
|
||||
unset($this->filesCache[$key]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -301,6 +307,12 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
|||
isset($object['Key']) ? $object['Key'] : $object['Prefix']
|
||||
);
|
||||
$files[] = $file;
|
||||
|
||||
// store this information for later usage
|
||||
$this->filesCache[$file] = [
|
||||
'ContentLength' => $object['Size'],
|
||||
'LastModified' => (string)$object['LastModified'],
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -316,20 +328,14 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
|||
$path = $this->normalizePath($path);
|
||||
|
||||
try {
|
||||
$stat = array();
|
||||
$stat = [];
|
||||
if ($this->is_dir($path)) {
|
||||
//folders don't really exist
|
||||
$stat['size'] = -1; //unknown
|
||||
$stat['mtime'] = time() - $this->rescanDelay * 1000;
|
||||
} else {
|
||||
$result = $this->headObject($path);
|
||||
|
||||
$stat['size'] = $result['ContentLength'] ? $result['ContentLength'] : 0;
|
||||
if (isset($result['Metadata']['lastmodified'])) {
|
||||
$stat['mtime'] = strtotime($result['Metadata']['lastmodified']);
|
||||
} else {
|
||||
$stat['mtime'] = strtotime($result['LastModified']);
|
||||
}
|
||||
$stat['size'] = $this->getContentLength($path);
|
||||
$stat['mtime'] = strtotime($this->getLastModified($path));
|
||||
}
|
||||
$stat['atime'] = time();
|
||||
|
||||
|
@ -340,6 +346,50 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return content length for object
|
||||
*
|
||||
* When the information is already present (e.g. opendir has been called before)
|
||||
* this value is return. Otherwise a headObject is emitted.
|
||||
*
|
||||
* @param $path
|
||||
* @return int|mixed
|
||||
*/
|
||||
private function getContentLength($path) {
|
||||
if (isset($this->filesCache[$path])) {
|
||||
return $this->filesCache[$path]['ContentLength'];
|
||||
}
|
||||
|
||||
$result = $this->headObject($path);
|
||||
if (isset($result['ContentLength'])) {
|
||||
return $result['ContentLength'];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return last modified for object
|
||||
*
|
||||
* When the information is already present (e.g. opendir has been called before)
|
||||
* this value is return. Otherwise a headObject is emitted.
|
||||
*
|
||||
* @param $path
|
||||
* @return mixed|string
|
||||
*/
|
||||
private function getLastModified($path) {
|
||||
if (isset($this->filesCache[$path])) {
|
||||
return $this->filesCache[$path]['LastModified'];
|
||||
}
|
||||
|
||||
$result = $this->headObject($path);
|
||||
if (isset($result['LastModified'])) {
|
||||
return $result['LastModified'];
|
||||
}
|
||||
|
||||
return 'now';
|
||||
}
|
||||
|
||||
public function is_dir($path) {
|
||||
$path = $this->normalizePath($path);
|
||||
try {
|
||||
|
|
Loading…
Reference in New Issue