Merge pull request #52789 from nextcloud/backport/51920/stable30

[stable30] fix: improve handling of newFolder race condition handling
This commit is contained in:
Robin Appelman 2025-05-15 13:41:34 +02:00 committed by GitHub
commit e3a2a35fdf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -138,8 +138,21 @@ class Folder extends Node implements \OCP\Files\Folder {
$fullPath = $this->getFullPath($path);
$nonExisting = new NonExistingFolder($this->root, $this->view, $fullPath);
$this->sendHooks(['preWrite', 'preCreate'], [$nonExisting]);
if (!$this->view->mkdir($fullPath) && !$this->view->is_dir($fullPath)) {
throw new NotPermittedException('Could not create folder "' . $fullPath . '"');
if (!$this->view->mkdir($fullPath)) {
// maybe another concurrent process created the folder already
if (!$this->view->is_dir($fullPath)) {
throw new NotPermittedException('Could not create folder "' . $fullPath . '"');
} else {
// we need to ensure we don't return before the concurrent request has finished updating the cache
$tries = 5;
while (!$this->view->getFileInfo($fullPath)) {
if ($tries < 1) {
throw new NotPermittedException('Could not create folder "' . $fullPath . '", folder exists but unable to get cache entry');
}
usleep(5 * 1000);
$tries--;
}
}
}
$parent = dirname($fullPath) === $this->getPath() ? $this : null;
$node = new Folder($this->root, $this->view, $fullPath, null, $parent);