Skip to content

Commit

Permalink
Merge pull request #42597 from nextcloud/perf/s3-mkdir-update-size
Browse files Browse the repository at this point in the history
perf: Avoid updating the folder size if we know the size difference
  • Loading branch information
juliushaertl committed Jan 23, 2024
2 parents 8ba7de8 + cc75294 commit 8c77714
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 16 deletions.
26 changes: 14 additions & 12 deletions lib/private/Files/Cache/Updater.php
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public function propagate($path, $time = null) {
* @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;
}
Expand All @@ -128,20 +128,22 @@ public function update($path, $time = null) {
}

$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);
}

/**
Expand Down
8 changes: 5 additions & 3 deletions lib/private/Files/View.php
Original file line number Diff line number Diff line change
Expand Up @@ -287,12 +287,12 @@ public function enableCacheUpdate(): void {
$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);
}
}

Expand Down Expand Up @@ -1173,7 +1173,9 @@ private function basicOperation(string $operation, string $path, array $hooks =
$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);
Expand Down
2 changes: 1 addition & 1 deletion lib/public/Files/Cache/IUpdater.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public function propagate($path, $time = null);
* @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
Expand Down

0 comments on commit 8c77714

Please sign in to comment.