mirror of
https://github.com/nextcloud/server.git
synced 2026-06-09 00:32:29 -04:00
perf: Avoid updating the folder size if we know the size difference
Signed-off-by: Julius Härtl <jus@bitgrid.net>
This commit is contained in:
parent
48628b9069
commit
cc75294eb6
3 changed files with 20 additions and 16 deletions
|
|
@ -119,7 +119,7 @@ class Updater implements IUpdater {
|
|||
* @param string $path
|
||||
* @param int $time
|
||||
*/
|
||||
public function update($path, $time = null) {
|
||||
public function update($path, $time = null, ?int $sizeDifference = null) {
|
||||
if (!$this->enabled or Scanner::isPartialFile($path)) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -128,20 +128,22 @@ class Updater implements IUpdater {
|
|||
}
|
||||
|
||||
$data = $this->scanner->scan($path, Scanner::SCAN_SHALLOW, -1, false);
|
||||
if (
|
||||
isset($data['oldSize']) && isset($data['size']) &&
|
||||
!$data['encrypted'] // encryption is a pita and touches the cache itself
|
||||
) {
|
||||
|
||||
if (isset($data['oldSize']) && isset($data['size'])) {
|
||||
$sizeDifference = $data['size'] - $data['oldSize'];
|
||||
} else {
|
||||
// scanner didn't provide size info, fallback to full size calculation
|
||||
$sizeDifference = 0;
|
||||
if ($this->cache instanceof Cache) {
|
||||
$this->cache->correctFolderSize($path, $data);
|
||||
}
|
||||
}
|
||||
|
||||
// encryption is a pita and touches the cache itself
|
||||
if (isset($data['encrypted']) && !!$data['encrypted']) {
|
||||
$sizeDifference = null;
|
||||
}
|
||||
|
||||
// scanner didn't provide size info, fallback to full size calculation
|
||||
if ($this->cache instanceof Cache && $sizeDifference === null) {
|
||||
$this->cache->correctFolderSize($path, $data);
|
||||
}
|
||||
$this->correctParentStorageMtime($path);
|
||||
$this->propagator->propagateChange($path, $time, $sizeDifference);
|
||||
$this->propagator->propagateChange($path, $time, $sizeDifference ?? 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -287,12 +287,12 @@ class View {
|
|||
$this->updaterEnabled = true;
|
||||
}
|
||||
|
||||
protected function writeUpdate(Storage $storage, string $internalPath, ?int $time = null): void {
|
||||
protected function writeUpdate(Storage $storage, string $internalPath, ?int $time = null, ?int $sizeDifference = null): void {
|
||||
if ($this->updaterEnabled) {
|
||||
if (is_null($time)) {
|
||||
$time = time();
|
||||
}
|
||||
$storage->getUpdater()->update($internalPath, $time);
|
||||
$storage->getUpdater()->update($internalPath, $time, $sizeDifference);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1173,7 +1173,9 @@ class View {
|
|||
$this->removeUpdate($storage, $internalPath);
|
||||
}
|
||||
if ($result !== false && in_array('write', $hooks, true) && $operation !== 'fopen' && $operation !== 'touch') {
|
||||
$this->writeUpdate($storage, $internalPath);
|
||||
$isCreateOperation = $operation === 'mkdir' || ($operation === 'file_put_contents' && in_array('create', $hooks, true));
|
||||
$sizeDifference = $operation === 'mkdir' ? 0 : $result;
|
||||
$this->writeUpdate($storage, $internalPath, null, $isCreateOperation ? $sizeDifference : null);
|
||||
}
|
||||
if ($result !== false && in_array('touch', $hooks)) {
|
||||
$this->writeUpdate($storage, $internalPath, $extraParam);
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ interface IUpdater {
|
|||
* @param int $time
|
||||
* @since 9.0.0
|
||||
*/
|
||||
public function update($path, $time = null);
|
||||
public function update($path, $time = null, ?int $sizeDifference = null);
|
||||
|
||||
/**
|
||||
* Remove $path from the cache and update the size, etag and mtime of the parent folders
|
||||
|
|
|
|||
Loading…
Reference in a new issue