mirror of
https://github.com/nextcloud/server.git
synced 2026-06-11 09:42:09 -04:00
fix: get child ids for folder in a separate query during move
Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
parent
3024d71f1b
commit
d4cfe32c57
1 changed files with 24 additions and 8 deletions
|
|
@ -708,6 +708,11 @@ class Cache implements ICache {
|
|||
if ($sourceData['mimetype'] === 'httpd/unix-directory') {
|
||||
//update all child entries
|
||||
$sourceLength = mb_strlen($sourcePath);
|
||||
|
||||
$childIds = $this->getChildIds($sourceStorageId, $sourcePath);
|
||||
|
||||
$childChunks = array_chunk($childIds, 1000);
|
||||
|
||||
$query = $this->connection->getQueryBuilder();
|
||||
|
||||
$fun = $query->func();
|
||||
|
|
@ -720,7 +725,7 @@ class Cache implements ICache {
|
|||
->set('path_hash', $fun->md5($newPathFunction))
|
||||
->set('path', $newPathFunction)
|
||||
->where($query->expr()->eq('storage', $query->createNamedParameter($sourceStorageId, IQueryBuilder::PARAM_INT)))
|
||||
->andWhere($query->expr()->like('path', $query->createNamedParameter($this->connection->escapeLikeParameter($sourcePath) . '/%')));
|
||||
->andWhere($query->expr()->in('fileid', $query->createParameter('files')));
|
||||
|
||||
// when moving from an encrypted storage to a non-encrypted storage remove the `encrypted` mark
|
||||
if ($sourceCache->hasEncryptionWrapper() && !$this->hasEncryptionWrapper()) {
|
||||
|
|
@ -731,13 +736,15 @@ class Cache implements ICache {
|
|||
// Retry up to 4 times because we should receive up to 4 concurrent requests from the frontend
|
||||
$retryLimit = 4;
|
||||
for ($i = 1; $i <= $retryLimit; $i++) {
|
||||
try {
|
||||
$this->connection->beginTransaction();
|
||||
$query->executeStatement();
|
||||
break;
|
||||
} catch (\OC\DatabaseException $e) {
|
||||
$this->connection->rollBack();
|
||||
throw $e;
|
||||
try {
|
||||
$this->connection->beginTransaction();
|
||||
foreach ($childChunks as $chunk) {
|
||||
$query->setParameter('files', $chunk, IQueryBuilder::PARAM_INT_ARRAY);
|
||||
$query->execute();
|
||||
}
|
||||
} catch (\OC\DatabaseException $e) {
|
||||
$this->connection->rollBack();
|
||||
throw $e;
|
||||
} catch (RetryableException $e) {
|
||||
// Simply throw if we already retried 4 times.
|
||||
if ($i === $retryLimit) {
|
||||
|
|
@ -787,6 +794,15 @@ class Cache implements ICache {
|
|||
}
|
||||
}
|
||||
|
||||
private function getChildIds(int $storageId, string $path): array {
|
||||
$query = $this->connection->getQueryBuilder();
|
||||
$query->select('fileid')
|
||||
->from('filecache')
|
||||
->where($query->expr()->eq('storage', $query->createNamedParameter($storageId, IQueryBuilder::PARAM_INT)))
|
||||
->andWhere($query->expr()->like('path', $query->createNamedParameter($this->connection->escapeLikeParameter($path) . '/%')));
|
||||
return $query->executeQuery()->fetchAll(\PDO::FETCH_COLUMN);
|
||||
}
|
||||
|
||||
/**
|
||||
* remove all entries for files that are stored on the storage from the cache
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in a new issue