From f664a31deca2b4c0034b93a439456307aedd23d7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Mon, 6 Oct 2014 11:08:21 +0200 Subject: [PATCH] extract batchDelete(), better comments --- apps/files_external/lib/amazons3.php | 62 ++++++++++++++-------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/apps/files_external/lib/amazons3.php b/apps/files_external/lib/amazons3.php index 8e893b0aac6..808de16c8a8 100644 --- a/apps/files_external/lib/amazons3.php +++ b/apps/files_external/lib/amazons3.php @@ -72,6 +72,9 @@ class AmazonS3 extends \OC\Files\Storage\Common { return $path; } + /** + * when running the tests wait to let the buckets catch up + */ private function testTimeout() { if ($this->test) { sleep($this->timeout); @@ -208,51 +211,48 @@ class AmazonS3 extends \OC\Files\Storage\Common { return false; } + return $this->batchDelete($path); + } + + protected function clearBucket() { try { - 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->clearBucket($this->bucket); + return true; + // clearBucket() is not working with Ceph, so if it fails we try the slower approach + } catch (\Exception $e) { + return $this->batchDelete(); + } + return false; + } + + private function batchDelete ($path = null) { + $params = array( + '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( 'Bucket' => $this->bucket, 'Objects' => $objects['Contents'] )); $this->testTimeout(); + // we reached the end when the list is no longer truncated } while ($objects['IsTruncated']); } catch (S3Exception $e) { \OCP\Util::logException('files_external', $e); return false; } - return true; } - protected function clearBucket() { - try { - $this->connection->clearBucket($this->bucket); - // clearBucket() is not working with Ceph, so if it fails we try the slower approach - } catch (\Exception $e) { - try { - do { // batches of 1000 - $objects = $this->connection->listObjects(array( - 'Bucket' => $this->bucket - )); - $this->connection->deleteObjects(array( - 'Bucket' => $this->bucket, - 'Objects' => $objects['Contents'] // delete 1000 objects in one http call - )); - $this->testTimeout(); - } while ($objects['IsTruncated']); - } catch (S3Exception $e) { - \OCP\Util::logException('files_external', $e); - return false; - } - } - } - public function opendir($path) { $path = $this->normalizePath($path); -- 2.39.5