Browse Source

Add config option to enable multibucket preview distribution

Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Morris Jobke 3 years ago
parent
commit
45428e4948

+ 17 - 0
config/config.sample.php

@@ -1354,6 +1354,23 @@ $CONFIG = [
 	],
 ],
 
+/**
+ * If this is set to true and a multibucket object store is configured then
+ * newly created previews are put into 256 dedicated buckets.
+ *
+ * Those buckets are named like the mulibucket version but with the postfix
+ * ``-preview-NUMBER`` where NUMBER is between 0 and 255.
+ *
+ * Keep in mind that only previews of files are put in there that don't have
+ * some already. Otherwise the old bucket will be used.
+ *
+ * To migrate existing previews to this new multibucket distribution of previews
+ * use the occ command ``preview:repair``. For now this will only migrate
+ * previews that were generated before Nextcloud 19 in the flat
+ * ``appdata_INSTANCEID/previews/FILEID`` folder structure.
+ */
+'objectstore.multibucket.preview-distribution' => false,
+
 
 /**
  * Sharing

+ 3 - 0
lib/private/Files/Mount/ObjectStorePreviewCacheMountProvider.php

@@ -55,6 +55,9 @@ class ObjectStorePreviewCacheMountProvider implements IRootMountProvider {
 		if (!is_array($this->config->getSystemValue('objectstore_multibucket'))) {
 			return [];
 		}
+		if ($this->config->getSystemValue('objectstore.multibucket.preview-distribution', false) !== true) {
+			return [];
+		}
 
 		$instanceId = $this->config->getSystemValueString('instanceid', '');
 		$mountPoints = [];

+ 9 - 9
lib/private/Preview/Storage/Root.php

@@ -32,23 +32,23 @@ use OCP\Files\NotFoundException;
 use OCP\Files\SimpleFS\ISimpleFolder;
 
 class Root extends AppData {
+	private $isMultibucketPreviewDistributionEnabled = false;
 	public function __construct(IRootFolder $rootFolder, SystemConfig $systemConfig) {
 		parent::__construct($rootFolder, $systemConfig, 'preview');
+
+		$this->isMultibucketPreviewDistributionEnabled = $systemConfig->getValue('objectstore.multibucket.preview-distribution', false) === true;
 	}
 
 
 	public function getFolder(string $name): ISimpleFolder {
 		$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
+		if ($this->isMultibucketPreviewDistributionEnabled) {
+			try {
+				return parent::getFolder('old-multibucket/' . $internalFolder);
+			} catch (NotFoundException $e) {
+				// not in multibucket fallback
+			}
 		}
 
 		try {

+ 21 - 14
tests/lib/Files/Mount/ObjectStorePreviewCacheMountProviderTest.php

@@ -71,22 +71,29 @@ class ObjectStorePreviewCacheMountProviderTest extends \Test\TestCase {
 	}
 
 	public function testMultibucketObjectStorage() {
+		$objectstoreConfig = [
+			'class' => S3::class,
+			'arguments' => [
+				'bucket' => 'abc',
+				'num_buckets' => 64,
+				'key' => 'KEY',
+				'secret' => 'SECRET',
+				'hostname' => 'IP',
+				'port' => 'PORT',
+				'use_ssl' => false,
+				'use_path_style' => true,
+			],
+		];
 		$this->config->expects($this->any())
 			->method('getSystemValue')
-			->with('objectstore_multibucket')
-			->willReturn([
-				'class' => S3::class,
-				'arguments' => [
-					'bucket' => 'abc',
-					'num_buckets' => 64,
-					'key' => 'KEY',
-					'secret' => 'SECRET',
-					'hostname' => 'IP',
-					'port' => 'PORT',
-					'use_ssl' => false,
-					'use_path_style' => true,
-				],
-			]);
+			->willReturnCallback(function ($config) use ($objectstoreConfig) {
+				if ($config === 'objectstore_multibucket') {
+					return $objectstoreConfig;
+				} elseif ($config === 'objectstore.multibucket.preview-distribution') {
+					return true;
+				}
+				return null;
+			});
 		$this->config->expects($this->once())
 			->method('getSystemValueString')
 			->with('instanceid')