Skip to content

Commit

Permalink
Merge pull request #26091 from nextcloud/backport/25722/stable20
Browse files Browse the repository at this point in the history
[stable20] apply object store copy optimization when 'cross storage' copy is wit…
  • Loading branch information
MorrisJobke authored Mar 17, 2021
2 parents c4da8d4 + 5827a15 commit 71b793f
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 1 deletion.
14 changes: 14 additions & 0 deletions lib/private/Files/ObjectStore/ObjectStoreStorage.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
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;
Expand Down Expand Up @@ -530,6 +531,19 @@ public function getObjectStore(): IObjectStore {
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);
Expand Down
2 changes: 1 addition & 1 deletion lib/private/Files/Storage/Wrapper/Jail.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,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
Expand Down
24 changes: 24 additions & 0 deletions tests/lib/Files/ObjectStore/ObjectStoreStorageTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

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;

Expand Down Expand Up @@ -204,4 +205,27 @@ public function testDeleteObjectFailureKeepCache() {
$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'));
}
}

0 comments on commit 71b793f

Please sign in to comment.