]> source.dussan.org Git - nextcloud-server.git/commitdiff
extract batchDelete(), better comments
authorJörn Friedrich Dreyer <jfd@butonic.de>
Mon, 6 Oct 2014 09:08:21 +0000 (11:08 +0200)
committerVincent Petry <pvince81@owncloud.com>
Wed, 8 Oct 2014 16:50:02 +0000 (18:50 +0200)
apps/files_external/lib/amazons3.php

index 8e893b0aac627fe2308e202616f1de5f11570e02..808de16c8a82d992258b6644d37b142e7579fcf6 100644 (file)
@@ -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);