mirror of
https://github.com/nextcloud/server.git
synced 2026-04-29 18:11:41 -04:00
Merge pull request #31713 from nextcloud/fed-performance
Federated share performance improvements
This commit is contained in:
commit
9834350ac3
7 changed files with 55 additions and 6 deletions
9
apps/files_sharing/lib/External/Storage.php
vendored
9
apps/files_sharing/lib/External/Storage.php
vendored
|
|
@ -43,12 +43,13 @@ use OCP\Constants;
|
|||
use OCP\Federation\ICloudId;
|
||||
use OCP\Files\NotFoundException;
|
||||
use OCP\Files\Storage\IDisableEncryptionStorage;
|
||||
use OCP\Files\Storage\IReliableEtagStorage;
|
||||
use OCP\Files\StorageInvalidException;
|
||||
use OCP\Files\StorageNotAvailableException;
|
||||
use OCP\Http\Client\LocalServerException;
|
||||
use OCP\Http\Client\IClientService;
|
||||
|
||||
class Storage extends DAV implements ISharedStorage, IDisableEncryptionStorage {
|
||||
class Storage extends DAV implements ISharedStorage, IDisableEncryptionStorage, IReliableEtagStorage {
|
||||
/** @var ICloudId */
|
||||
private $cloudId;
|
||||
/** @var string */
|
||||
|
|
@ -369,6 +370,8 @@ class Storage extends DAV implements ISharedStorage, IDisableEncryptionStorage {
|
|||
} elseif (isset($response['{http://open-cloud-mesh.org/ns}share-permissions'])) {
|
||||
// permissions provided by the OCM API
|
||||
$permissions = $this->ocmPermissions2ncPermissions($response['{http://open-collaboration-services.org/ns}share-permissions'], $path);
|
||||
} elseif (isset($response['{http://owncloud.org/ns}permissions'])) {
|
||||
return $this->parsePermissions($response['{http://owncloud.org/ns}permissions']);
|
||||
} else {
|
||||
// use default permission if remote server doesn't provide the share permissions
|
||||
$permissions = $this->getDefaultPermissions($path);
|
||||
|
|
@ -426,4 +429,8 @@ class Storage extends DAV implements ISharedStorage, IDisableEncryptionStorage {
|
|||
|
||||
return $permissions;
|
||||
}
|
||||
|
||||
public function free_space($path) {
|
||||
return parent::free_space("");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -327,6 +327,7 @@ return array(
|
|||
'OCP\\Files\\Storage\\IDisableEncryptionStorage' => $baseDir . '/lib/public/Files/Storage/IDisableEncryptionStorage.php',
|
||||
'OCP\\Files\\Storage\\ILockingStorage' => $baseDir . '/lib/public/Files/Storage/ILockingStorage.php',
|
||||
'OCP\\Files\\Storage\\INotifyStorage' => $baseDir . '/lib/public/Files/Storage/INotifyStorage.php',
|
||||
'OCP\\Files\\Storage\\IReliableEtagStorage' => $baseDir . '/lib/public/Files/Storage/IReliableEtagStorage.php',
|
||||
'OCP\\Files\\Storage\\IStorage' => $baseDir . '/lib/public/Files/Storage/IStorage.php',
|
||||
'OCP\\Files\\Storage\\IStorageFactory' => $baseDir . '/lib/public/Files/Storage/IStorageFactory.php',
|
||||
'OCP\\Files\\Storage\\IWriteStreamStorage' => $baseDir . '/lib/public/Files/Storage/IWriteStreamStorage.php',
|
||||
|
|
|
|||
|
|
@ -356,6 +356,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
|
|||
'OCP\\Files\\Storage\\IDisableEncryptionStorage' => __DIR__ . '/../../..' . '/lib/public/Files/Storage/IDisableEncryptionStorage.php',
|
||||
'OCP\\Files\\Storage\\ILockingStorage' => __DIR__ . '/../../..' . '/lib/public/Files/Storage/ILockingStorage.php',
|
||||
'OCP\\Files\\Storage\\INotifyStorage' => __DIR__ . '/../../..' . '/lib/public/Files/Storage/INotifyStorage.php',
|
||||
'OCP\\Files\\Storage\\IReliableEtagStorage' => __DIR__ . '/../../..' . '/lib/public/Files/Storage/IReliableEtagStorage.php',
|
||||
'OCP\\Files\\Storage\\IStorage' => __DIR__ . '/../../..' . '/lib/public/Files/Storage/IStorage.php',
|
||||
'OCP\\Files\\Storage\\IStorageFactory' => __DIR__ . '/../../..' . '/lib/public/Files/Storage/IStorageFactory.php',
|
||||
'OCP\\Files\\Storage\\IWriteStreamStorage' => __DIR__ . '/../../..' . '/lib/public/Files/Storage/IWriteStreamStorage.php',
|
||||
|
|
|
|||
|
|
@ -21,10 +21,12 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OC\Files\Cache;
|
||||
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
use OCP\Files\Cache\IPropagator;
|
||||
use OCP\Files\Storage\IReliableEtagStorage;
|
||||
use OCP\IDBConnection;
|
||||
|
||||
/**
|
||||
|
|
@ -91,9 +93,11 @@ class Propagator implements IPropagator {
|
|||
|
||||
$builder->update('filecache')
|
||||
->set('mtime', $builder->func()->greatest('mtime', $builder->createNamedParameter((int)$time, IQueryBuilder::PARAM_INT)))
|
||||
->set('etag', $builder->createNamedParameter($etag, IQueryBuilder::PARAM_STR))
|
||||
->where($builder->expr()->eq('storage', $builder->createNamedParameter($storageId, IQueryBuilder::PARAM_INT)))
|
||||
->andWhere($builder->expr()->in('path_hash', $hashParams));
|
||||
if (!$this->storage->instanceOfStorage(IReliableEtagStorage::class)) {
|
||||
$builder->set('etag', $builder->createNamedParameter($etag, IQueryBuilder::PARAM_STR));
|
||||
}
|
||||
|
||||
$builder->execute();
|
||||
|
||||
|
|
@ -141,7 +145,7 @@ class Propagator implements IPropagator {
|
|||
$this->batch[$internalPath] = [
|
||||
'hash' => md5($internalPath),
|
||||
'time' => $time,
|
||||
'size' => $sizeDifference
|
||||
'size' => $sizeDifference,
|
||||
];
|
||||
} else {
|
||||
$this->batch[$internalPath]['size'] += $sizeDifference;
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ use OC\Files\Storage\Wrapper\Encoding;
|
|||
use OC\Hooks\BasicEmitter;
|
||||
use OCP\Files\Cache\IScanner;
|
||||
use OCP\Files\ForbiddenException;
|
||||
use OCP\Files\Storage\IReliableEtagStorage;
|
||||
use OCP\ILogger;
|
||||
use OCP\Lock\ILockingProvider;
|
||||
|
||||
|
|
@ -208,7 +209,7 @@ class Scanner extends BasicEmitter implements IScanner {
|
|||
if (($reuseExisting & self::REUSE_SIZE) && ($data['size'] === -1)) {
|
||||
$data['size'] = $cacheData['size'];
|
||||
}
|
||||
if ($reuseExisting & self::REUSE_ETAG) {
|
||||
if ($reuseExisting & self::REUSE_ETAG && !$this->storage->instanceOfStorage(IReliableEtagStorage::class)) {
|
||||
$data['etag'] = $etag;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -275,6 +275,7 @@ class DAV extends Common {
|
|||
'{http://open-collaboration-services.org/ns}share-permissions',
|
||||
'{DAV:}resourcetype',
|
||||
'{DAV:}getetag',
|
||||
'{DAV:}quota-available-bytes',
|
||||
]
|
||||
);
|
||||
$this->statCache->set($path, $response);
|
||||
|
|
@ -428,8 +429,7 @@ class DAV extends Common {
|
|||
$this->init();
|
||||
$path = $this->cleanPath($path);
|
||||
try {
|
||||
// TODO: cacheable ?
|
||||
$response = $this->client->propfind($this->encodePath($path), ['{DAV:}quota-available-bytes']);
|
||||
$response = $this->propfind($path);
|
||||
if ($response === false) {
|
||||
return FileInfo::SPACE_UNKNOWN;
|
||||
}
|
||||
|
|
|
|||
35
lib/public/Files/Storage/IReliableEtagStorage.php
Normal file
35
lib/public/Files/Storage/IReliableEtagStorage.php
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* @copyright Copyright (c) 2022 Robin Appelman <robin@icewind.nl>
|
||||
*
|
||||
* @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\Storage;
|
||||
|
||||
/**
|
||||
* Marks a storage as providing reliable etags according to expected behavior of etags within nextcloud:
|
||||
*
|
||||
* - Etag are stable as long as no changes are made to the files
|
||||
* - Changes inside a folder cause etag changes of the parent folders
|
||||
*
|
||||
* @since 24.0.0
|
||||
*/
|
||||
interface IReliableEtagStorage extends IStorage {
|
||||
}
|
||||
Loading…
Reference in a new issue