Merge pull request #4798 from nextcloud/multibucket-root-fs

Setup root FS for multibucket object storage
This commit is contained in:
Morris Jobke 2017-05-10 16:50:19 -05:00 committed by GitHub
commit 1c2ccd2206
2 changed files with 47 additions and 2 deletions

View File

@ -884,7 +884,7 @@ class Server extends ServerContainer implements IServerContainer {
$c->getConfig(),
$c->getThemingDefaults(),
\OC::$SERVERROOT,
$cacheFactory->createLocal('SCSS')
$cacheFactory->create('SCSS')
);
});
$this->registerService(EventDispatcher::class, function () {

View File

@ -119,6 +119,46 @@ class OC_Util {
}
}
/**
* mounting an object storage as the root fs will in essence remove the
* necessity of a data folder being present.
*
* @param array $config containing 'class' and optional 'arguments'
*/
private static function initObjectStoreMultibucketRootFS($config) {
// check misconfiguration
if (empty($config['class'])) {
\OCP\Util::writeLog('files', 'No class given for objectstore', \OCP\Util::ERROR);
}
if (!isset($config['arguments'])) {
$config['arguments'] = array();
}
// instantiate object store implementation
$name = $config['class'];
if (strpos($name, 'OCA\\') === 0 && substr_count($name, '\\') >= 2) {
$segments = explode('\\', $name);
OC_App::loadApp(strtolower($segments[1]));
}
if (!isset($config['arguments']['bucket'])) {
$config['arguments']['bucket'] = '';
}
// put the root FS always in first bucket for multibucket configuration
$config['arguments']['bucket'] .= '0';
$config['arguments']['objectstore'] = new $config['class']($config['arguments']);
// mount with plain / root object store implementation
$config['class'] = '\OC\Files\ObjectStore\ObjectStoreStorage';
// mount object storage as root
\OC\Files\Filesystem::initMountManager();
if (!self::$rootMounted) {
\OC\Files\Filesystem::mount($config['class'], $config['arguments'], '/');
self::$rootMounted = true;
}
}
/**
* Can be set up
*
@ -215,7 +255,12 @@ class OC_Util {
//check if we are using an object storage
$objectStore = \OC::$server->getSystemConfig()->getValue('objectstore', null);
if (isset($objectStore)) {
$objectStoreMultibucket = \OC::$server->getSystemConfig()->getValue('objectstore_multibucket', null);
// use the same order as in ObjectHomeMountProvider
if (isset($objectStoreMultibucket)) {
self::initObjectStoreMultibucketRootFS($objectStoreMultibucket);
} elseif (isset($objectStore)) {
self::initObjectStoreRootFS($objectStore);
} else {
self::initLocalStorageRootFS();