],
],
+/**
+ * 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
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 = [];
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 {
}
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')