Skip to content
Snippets Groups Projects
Commit f664a31d authored by Jörn Friedrich Dreyer's avatar Jörn Friedrich Dreyer Committed by Vincent Petry
Browse files

extract batchDelete(), better comments

parent 0d0c9d0b
Branches
No related tags found
No related merge requests found
...@@ -72,6 +72,9 @@ class AmazonS3 extends \OC\Files\Storage\Common { ...@@ -72,6 +72,9 @@ class AmazonS3 extends \OC\Files\Storage\Common {
return $path; return $path;
} }
/**
* when running the tests wait to let the buckets catch up
*/
private function testTimeout() { private function testTimeout() {
if ($this->test) { if ($this->test) {
sleep($this->timeout); sleep($this->timeout);
...@@ -208,49 +211,46 @@ class AmazonS3 extends \OC\Files\Storage\Common { ...@@ -208,49 +211,46 @@ class AmazonS3 extends \OC\Files\Storage\Common {
return false; return false;
} }
try { return $this->batchDelete($path);
do { // batches of 1000
// Since there are no real directories on S3, we need
// to delete all objects prefixed with the path.
$objects = $this->connection->listObjects(array(
'Bucket' => $this->bucket,
'Prefix' => $path . '/'
));
$this->connection->deleteObjects(array(
'Bucket' => $this->bucket,
'Objects' => $objects['Contents']
));
$this->testTimeout();
} while ($objects['IsTruncated']);
} catch (S3Exception $e) {
\OCP\Util::logException('files_external', $e);
return false;
}
return true;
} }
protected function clearBucket() { protected function clearBucket() {
try { try {
$this->connection->clearBucket($this->bucket); $this->connection->clearBucket($this->bucket);
return true;
// clearBucket() is not working with Ceph, so if it fails we try the slower approach // clearBucket() is not working with Ceph, so if it fails we try the slower approach
} catch (\Exception $e) { } catch (\Exception $e) {
try { return $this->batchDelete();
do { // batches of 1000 }
$objects = $this->connection->listObjects(array( return false;
}
private function batchDelete ($path = null) {
$params = array(
'Bucket' => $this->bucket 'Bucket' => $this->bucket
)); );
if ($path !== null) {
$params['Prefix'] = $path . '/';
}
try {
// Since there are no real directories on S3, we need
// to delete all objects prefixed with the path.
do {
// instead of the iterator, manually loop over the list ...
$objects = $this->connection->listObjects($params);
// ... so we can delete the files in batches
$this->connection->deleteObjects(array( $this->connection->deleteObjects(array(
'Bucket' => $this->bucket, 'Bucket' => $this->bucket,
'Objects' => $objects['Contents'] // delete 1000 objects in one http call 'Objects' => $objects['Contents']
)); ));
$this->testTimeout(); $this->testTimeout();
// we reached the end when the list is no longer truncated
} while ($objects['IsTruncated']); } while ($objects['IsTruncated']);
} catch (S3Exception $e) { } catch (S3Exception $e) {
\OCP\Util::logException('files_external', $e); \OCP\Util::logException('files_external', $e);
return false; return false;
} }
} return true;
} }
public function opendir($path) { public function opendir($path) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment