apply object store copy optimization when 'cross storage' copy is within the same object store
Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
parent
5063745cac
commit
c87b1a50d9
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue