-
-
Notifications
You must be signed in to change notification settings - Fork 3.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Distribute preview folders in appdata in multibucket setup to multipl…
…e buckets * introduces a new IRootMountProvider to register mount points inside the root storage * adds a AppdataPreviewObjectStoreStorage to handle the split between preview folders and bucket number Ref #22033 Signed-off-by: Morris Jobke <hey@morrisjobke.de>
- Loading branch information
1 parent
c24f3d1
commit 438ac23
Showing
9 changed files
with
226 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
102 changes: 102 additions & 0 deletions
102
lib/private/Files/Mount/ObjectStorePreviewCacheMountProvider.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
/** | ||
* @copyright Copyright (c) 2020, Morris Jobke <hey@morrisjobke.de> | ||
* | ||
* @author Morris Jobke <hey@morrisjobke.de> | ||
* | ||
* @license GNU AGPL version 3 or any later version | ||
* | ||
* This program is free software: you can redistribute it and/or modify | ||
* it under the terms of the GNU Affero General Public License as | ||
* published by the Free Software Foundation, either version 3 of the | ||
* License, or (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU Affero General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU Affero General Public License | ||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
* | ||
*/ | ||
|
||
namespace OC\Files\Mount; | ||
|
||
use OC\Files\ObjectStore\AppdataPreviewObjectStoreStorage; | ||
use OCP\Files\Config\IRootMountProvider; | ||
use OCP\Files\Storage\IStorageFactory; | ||
use OCP\IConfig; | ||
use OCP\ILogger; | ||
|
||
/** | ||
* Mount provider for object store app data folder for previews | ||
*/ | ||
class ObjectStorePreviewCacheMountProvider implements IRootMountProvider { | ||
/** @var ILogger */ | ||
private $logger; | ||
/** @var IConfig */ | ||
private $config; | ||
|
||
public function __construct(ILogger $logger, IConfig $config) { | ||
$this->logger = $logger; | ||
$this->config = $config; | ||
} | ||
|
||
public function getRootMounts(IStorageFactory $loader): array { | ||
if (!is_array($this->config->getSystemValue('objectstore_multibucket'))) { | ||
return []; | ||
} | ||
|
||
$instanceId = $this->config->getSystemValueString('instanceid', ''); | ||
$mountPoints = []; | ||
$directoryRange = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']; | ||
$i = 0; | ||
foreach ($directoryRange as $parent) { | ||
foreach ($directoryRange as $child) { | ||
$mountPoints[] = new MountPoint( | ||
AppdataPreviewObjectStoreStorage::class, | ||
'/appdata_' . $instanceId . '/preview/' . $parent . '/' . $child, | ||
$this->getMultiBucketObjectStore($i), | ||
$loader | ||
); | ||
$i++; | ||
} | ||
} | ||
return $mountPoints; | ||
} | ||
|
||
/** | ||
* @return array | ||
*/ | ||
protected function getMultiBucketObjectStore(int $number): 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'] = ''; | ||
} | ||
$numBuckets = isset($config['arguments']['num_buckets']) ? $config['arguments']['num_buckets'] : 64; | ||
$config['arguments']['bucket'] .= (string)($number % $numBuckets); | ||
|
||
// instantiate object store implementation | ||
$config['arguments']['objectstore'] = new $config['class']($config['arguments']); | ||
|
||
$config['arguments']['internal-id'] = $number; | ||
|
||
return $config['arguments']; | ||
} | ||
} |
44 changes: 44 additions & 0 deletions
44
lib/private/Files/ObjectStore/AppdataPreviewObjectStoreStorage.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
/** | ||
* @copyright Copyright (c) 2020, Morris Jobke <hey@morrisjobke.de> | ||
* | ||
* @author Morris Jobke <hey@morrisjobke.de> | ||
* | ||
* @license GNU AGPL version 3 or any later version | ||
* | ||
* This program is free software: you can redistribute it and/or modify | ||
* it under the terms of the GNU Affero General Public License as | ||
* published by the Free Software Foundation, either version 3 of the | ||
* License, or (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU Affero General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU Affero General Public License | ||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
* | ||
*/ | ||
|
||
namespace OC\Files\ObjectStore; | ||
|
||
class AppdataPreviewObjectStoreStorage extends ObjectStoreStorage { | ||
|
||
/** @var string */ | ||
private $internalId; | ||
|
||
public function __construct($params) { | ||
if (!isset($params['internal-id'])) { | ||
throw new \Exception('missing id in parameters'); | ||
} | ||
$this->internalId = (string)$params['internal-id']; | ||
parent::__construct($params); | ||
} | ||
|
||
public function getId() { | ||
return 'object::appdata::preview:' . $this->internalId; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,6 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
/** | ||
* @copyright Copyright (c) 2020, Roeland Jago Douma <roeland@famdouma.nl> | ||
* | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
/** | ||
* @copyright Copyright (c) 2020, Morris Jobke <hey@morrisjobke.de> | ||
* | ||
* @author Morris Jobke <hey@morrisjobke.de> | ||
* | ||
* @license GNU AGPL version 3 or any later version | ||
* | ||
* This program is free software: you can redistribute it and/or modify | ||
* it under the terms of the GNU Affero General Public License as | ||
* published by the Free Software Foundation, either version 3 of the | ||
* License, or (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU Affero General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU Affero General Public License | ||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
* | ||
*/ | ||
|
||
namespace OCP\Files\Config; | ||
|
||
use OCP\Files\Storage\IStorageFactory; | ||
|
||
/** | ||
* @since 20.0.0 | ||
*/ | ||
interface IRootMountProvider { | ||
/** | ||
* Get all root mountpoints | ||
* | ||
* @return \OCP\Files\Mount\IMountPoint[] | ||
* @since 20.0.0 | ||
*/ | ||
public function getRootMounts(IStorageFactory $loader): array; | ||
} |