diff options
author | Morris Jobke <hey@morrisjobke.de> | 2020-07-30 23:53:54 +0200 |
---|---|---|
committer | Morris Jobke <hey@morrisjobke.de> | 2020-08-06 22:19:21 +0200 |
commit | 159f28cd521e94eff23e32b5bf3f4d2447da403f (patch) | |
tree | 7b15b649aff007c85a1a2e45be3d801b3441cbfa /lib | |
parent | 438ac23e2a3564fbce50e862336db56bbf0d747c (diff) | |
download | nextcloud-server-159f28cd521e94eff23e32b5bf3f4d2447da403f.tar.gz nextcloud-server-159f28cd521e94eff23e32b5bf3f4d2447da403f.zip |
Mount the old previews in a separate folder for the multi bucket setup and check in them before using the actual locations
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/private/Files/Mount/ObjectStorePreviewCacheMountProvider.php | 51 | ||||
-rw-r--r-- | lib/private/Preview/Storage/Root.php | 11 |
2 files changed, 59 insertions, 3 deletions
diff --git a/lib/private/Files/Mount/ObjectStorePreviewCacheMountProvider.php b/lib/private/Files/Mount/ObjectStorePreviewCacheMountProvider.php index a4acdb6bb0f..9ab0327684b 100644 --- a/lib/private/Files/Mount/ObjectStorePreviewCacheMountProvider.php +++ b/lib/private/Files/Mount/ObjectStorePreviewCacheMountProvider.php @@ -26,6 +26,8 @@ declare(strict_types=1); namespace OC\Files\Mount; use OC\Files\ObjectStore\AppdataPreviewObjectStoreStorage; +use OC\Files\ObjectStore\ObjectStoreStorage; +use OC\Files\Storage\Wrapper\Jail; use OCP\Files\Config\IRootMountProvider; use OCP\Files\Storage\IStorageFactory; use OCP\IConfig; @@ -45,6 +47,10 @@ class ObjectStorePreviewCacheMountProvider implements IRootMountProvider { $this->config = $config; } + /** + * @return MountPoint[] + * @throws \Exception + */ public function getRootMounts(IStorageFactory $loader): array { if (!is_array($this->config->getSystemValue('objectstore_multibucket'))) { return []; @@ -65,12 +71,25 @@ class ObjectStorePreviewCacheMountProvider implements IRootMountProvider { $i++; } } + + $rootStorageArguments = $this->getMultiBucketObjectStoreForRoot(); + $fakeRootStorage = new ObjectStoreStorage($rootStorageArguments); + $fakeRootStorageJail = new Jail([ + 'storage' => $fakeRootStorage, + 'root' => '/appdata_' . $instanceId . '/preview', + ]); + + // add a fallback location to be able to fetch existing previews from the old bucket + $mountPoints[] = new MountPoint( + $fakeRootStorageJail, + '/appdata_' . $instanceId . '/preview/old-multibucket', + null, + $loader + ); + return $mountPoints; } - /** - * @return array - */ protected function getMultiBucketObjectStore(int $number): array { $config = $this->config->getSystemValue('objectstore_multibucket'); @@ -99,4 +118,30 @@ class ObjectStorePreviewCacheMountProvider implements IRootMountProvider { return $config['arguments']; } + + protected function getMultiBucketObjectStoreForRoot(): array { + $config = $this->config->getSystemValue('objectstore_multibucket'); + + // sanity checks + if (empty($config['class'])) { + $this->logger->error('No class given for objectstore', ['app' => 'files']); + } + if (!isset($config['arguments'])) { + $config['arguments'] = []; + } + + /* + * Use any provided bucket argument as prefix + * and add the mapping from parent/child => bucket + */ + if (!isset($config['arguments']['bucket'])) { + $config['arguments']['bucket'] = ''; + } + $config['arguments']['bucket'] .= '0'; + + // instantiate object store implementation + $config['arguments']['objectstore'] = new $config['class']($config['arguments']); + + return $config['arguments']; + } } diff --git a/lib/private/Preview/Storage/Root.php b/lib/private/Preview/Storage/Root.php index 107d87c6301..37ae1758121 100644 --- a/lib/private/Preview/Storage/Root.php +++ b/lib/private/Preview/Storage/Root.php @@ -41,6 +41,17 @@ class Root extends AppData { $internalFolder = $this->getInternalFolder($name); try { + return parent::getFolder('old-multibucket/' . $internalFolder); + } catch (NotFoundException $e) { + // not in multibucket fallback #1 + } + try { + return parent::getFolder('old-multibucket/' . $name); + } catch (NotFoundException $e) { + // not in multibucket fallback #2 + } + + try { return parent::getFolder($internalFolder); } catch (NotFoundException $e) { /* |