]> source.dussan.org Git - nextcloud-server.git/commitdiff
apply object store copy optimization when 'cross storage' copy is within the same... 25722/head
authorRobin Appelman <robin@icewind.nl>
Fri, 19 Feb 2021 14:52:58 +0000 (15:52 +0100)
committerRoeland Jago Douma <roeland@famdouma.nl>
Tue, 9 Mar 2021 19:31:27 +0000 (20:31 +0100)
Signed-off-by: Robin Appelman <robin@icewind.nl>
lib/private/Files/ObjectStore/ObjectStoreStorage.php
lib/private/Files/Storage/Wrapper/Jail.php
tests/lib/Files/ObjectStore/ObjectStoreStorageTest.php

index 3378f00c4dd35f91a6874237dda98236f697aa1d..23483b3ab21e6def7e428ebb797d826837b3c0cb 100644 (file)
@@ -39,6 +39,7 @@ use OCP\Files\Cache\ICacheEntry;
 use OCP\Files\FileInfo;
 use OCP\Files\NotFoundException;
 use OCP\Files\ObjectStore\IObjectStore;
+use OCP\Files\Storage\IStorage;
 
 class ObjectStoreStorage extends \OC\Files\Storage\Common {
        use CopyDirectory;
@@ -530,6 +531,19 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common {
                return $this->objectStore;
        }
 
+       public function copyFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath, $preserveMtime = false) {
+               if ($sourceStorage->instanceOfStorage(ObjectStoreStorage::class)) {
+                       /** @var ObjectStoreStorage $sourceStorage */
+                       if ($sourceStorage->getObjectStore()->getStorageId() === $this->getObjectStore()->getStorageId()) {
+                               $sourceEntry = $sourceStorage->getCache()->get($sourceInternalPath);
+                               $this->copyInner($sourceEntry, $targetInternalPath);
+                               return true;
+                       }
+               }
+
+               return parent::copyFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath);
+       }
+
        public function copy($path1, $path2) {
                $path1 = $this->normalizePath($path1);
                $path2 = $this->normalizePath($path2);
index b7933708da8617e0e5b70dfb055ebbc5d8c654a0..276f00af33cd608e21a669a34b60c42f32a7b71c 100644 (file)
@@ -48,7 +48,7 @@ class Jail extends Wrapper {
        protected $rootPath;
 
        /**
-        * @param array $arguments ['storage' => $storage, 'mask' => $root]
+        * @param array $arguments ['storage' => $storage, 'root' => $root]
         *
         * $storage: The storage that will be wrapper
         * $root: The folder in the wrapped storage that will become the root folder of the wrapped storage
index fa8ec535061cb352cc253425c94ddf4e492bf548..85a68be3daf27e4f6f8bcd1ddaeedfc332c9b384 100644 (file)
@@ -22,6 +22,7 @@ namespace Test\Files\ObjectStore;
 
 use OC\Files\ObjectStore\StorageObjectStore;
 use OC\Files\Storage\Temporary;
+use OC\Files\Storage\Wrapper\Jail;
 use OCP\Files\ObjectStore\IObjectStore;
 use Test\Files\Storage\Storage;
 
@@ -204,4 +205,27 @@ class ObjectStoreStorageTest extends Storage {
                $this->assertTrue($cache->inCache('foo'));
                $this->assertTrue($cache->inCache('foo/test.txt'));
        }
+
+       public function testCopyBetweenJails() {
+               $this->instance->mkdir('a');
+               $this->instance->mkdir('b');
+               $jailA = new Jail([
+                       'storage' => $this->instance,
+                       'root' => 'a'
+               ]);
+               $jailB = new Jail([
+                       'storage' => $this->instance,
+                       'root' => 'b'
+               ]);
+               $jailA->mkdir('sub');
+               $jailA->file_put_contents('1.txt', '1');
+               $jailA->file_put_contents('sub/2.txt', '2');
+               $jailA->file_put_contents('sub/3.txt', '3');
+
+               $jailB->copyFromStorage($jailA, '', 'target');
+
+               $this->assertEquals('1', $this->instance->file_get_contents('b/target/1.txt'));
+               $this->assertEquals('2', $this->instance->file_get_contents('b/target/sub/2.txt'));
+               $this->assertEquals('3', $this->instance->file_get_contents('b/target/sub/3.txt'));
+       }
 }