summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMorris Jobke <hey@morrisjobke.de>2020-07-30 23:53:54 +0200
committerMorris Jobke <hey@morrisjobke.de>2020-08-06 22:19:21 +0200
commit159f28cd521e94eff23e32b5bf3f4d2447da403f (patch)
tree7b15b649aff007c85a1a2e45be3d801b3441cbfa /lib
parent438ac23e2a3564fbce50e862336db56bbf0d747c (diff)
downloadnextcloud-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.php51
-rw-r--r--lib/private/Preview/Storage/Root.php11
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) {
/*