Skip to content

Commit 19ec79b

Browse files
committed
fix: smuggle storage id to metadata insert queries
Signed-off-by: Robin Appelman <robin@icewind.nl>
1 parent 31f4f67 commit 19ec79b

File tree

5 files changed

+41
-1
lines changed

5 files changed

+41
-1
lines changed

apps/dav/lib/Connector/Sabre/FilesPlugin.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
namespace OCA\DAV\Connector\Sabre;
99

1010
use OC\AppFramework\Http\Request;
11+
use OC\FilesMetadata\Model\FilesMetadata;
1112
use OCA\DAV\Connector\Sabre\Exception\InvalidPath;
1213
use OCP\Constants;
1314
use OCP\Files\ForbiddenException;
@@ -575,7 +576,9 @@ private function handleUpdatePropertiesMetadata(PropPatch $propPatch, Node $node
575576
$propPatch->handle(
576577
$mutation,
577578
function (mixed $value) use ($accessRight, $knownMetadata, $node, $mutation, $filesMetadataManager): bool {
579+
/** @var FilesMetadata $metadata */
578580
$metadata = $filesMetadataManager->getMetadata((int)$node->getFileId(), true);
581+
$metadata->setStorageId($node->getNode()->getStorage()->getCache()->getNumericStorageId());
579582
$metadataKey = substr($mutation, strlen(self::FILE_METADATA_PREFIX));
580583

581584
// confirm metadata key is editable via PROPPATCH

apps/files/lib/Listener/SyncLivePhotosListener.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
namespace OCA\Files\Listener;
1010

11+
use OC\FilesMetadata\Model\FilesMetadata;
1112
use OCA\Files\Service\LivePhotosService;
1213
use OCP\EventDispatcher\Event;
1314
use OCP\EventDispatcher\IEventListener;
@@ -154,10 +155,14 @@ private function handleCopy(NodeCopiedEvent $event, Node $peerFile): void {
154155
* We have everything to update metadata and keep the link between the 2 copies.
155156
*/
156157
$newPeerFile = $peerFile->copy($targetParent->getPath() . '/' . $peerTargetName);
158+
/** @var FilesMetadata $targetMetadata */
157159
$targetMetadata = $this->filesMetadataManager->getMetadata($targetFile->getId(), true);
160+
$targetMetadata->setStorageId($targetFile->getStorage()->getCache()->getNumericStorageId());
158161
$targetMetadata->setString('files-live-photo', (string)$newPeerFile->getId());
159162
$this->filesMetadataManager->saveMetadata($targetMetadata);
163+
/** @var FilesMetadata $peerMetadata */
160164
$peerMetadata = $this->filesMetadataManager->getMetadata($newPeerFile->getId(), true);
165+
$peerMetadata->setStorageId($newPeerFile->getStorage()->getCache()->getNumericStorageId());
161166
$peerMetadata->setString('files-live-photo', (string)$targetFile->getId());
162167
$this->filesMetadataManager->saveMetadata($peerMetadata);
163168
}

lib/private/FilesMetadata/FilesMetadataManager.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,13 @@ public function refreshMetadata(
7777
int $process = self::PROCESS_LIVE,
7878
string $namedEvent = '',
7979
): IFilesMetadata {
80+
$storageId = $node->getStorage()->getCache()->getNumericStorageId();
8081
try {
82+
/** @var FilesMetadata $metadata */
8183
$metadata = $this->metadataRequestService->getMetadataFromFileId($node->getId());
84+
$metadata->setStorageId($storageId);
8285
} catch (FilesMetadataNotFoundException) {
83-
$metadata = new FilesMetadata($node->getId());
86+
$metadata = new FilesMetadata($node->getId(), $storageId);
8487
}
8588

8689
// if $process is LIVE, we enforce LIVE

lib/private/FilesMetadata/Model/FilesMetadata.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class FilesMetadata implements IFilesMetadata {
3030

3131
public function __construct(
3232
private int $fileId = 0,
33+
private ?int $storageId = null,
3334
) {
3435
}
3536

@@ -42,6 +43,14 @@ public function getFileId(): int {
4243
return $this->fileId;
4344
}
4445

46+
public function getStorageId(): ?int {
47+
return $this->storageId;
48+
}
49+
50+
public function setStorageId(int $storageId): void {
51+
$this->storageId = $storageId;
52+
}
53+
4554
/**
4655
* @inheritDoc
4756
* @return int timestamp

lib/private/FilesMetadata/Service/MetadataRequestService.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,24 @@ public function __construct(
2828
) {
2929
}
3030

31+
private function getStorageId(IFilesMetadata $filesMetadata): int {
32+
if ($filesMetadata instanceof FilesMetadata && $filesMetadata->getStorageId()) {
33+
return $filesMetadata->getStorageId();
34+
}
35+
// all code paths that lead to saving metadata *should* have the storage id set
36+
// this fallback is there just in case
37+
$query = $this->dbConnection->getQueryBuilder();
38+
$query->select('storage')
39+
->from('filecache')
40+
->where($query->expr()->eq('fileid', $query->createNamedParameter($filesMetadata->getFileId(), IQueryBuilder::PARAM_INT)));
41+
$storageId = $query->executeQuery()->fetchColumn();
42+
43+
if ($filesMetadata instanceof FilesMetadata) {
44+
$filesMetadata->setStorageId($storageId);
45+
}
46+
return $storageId;
47+
}
48+
3149
/**
3250
* store metadata into database
3351
*
@@ -38,6 +56,7 @@ public function __construct(
3856
public function store(IFilesMetadata $filesMetadata): void {
3957
$qb = $this->dbConnection->getQueryBuilder();
4058
$qb->insert(self::TABLE_METADATA)
59+
->hintShardKey('storage', $this->getStorageId($filesMetadata))
4160
->setValue('file_id', $qb->createNamedParameter($filesMetadata->getFileId(), IQueryBuilder::PARAM_INT))
4261
->setValue('json', $qb->createNamedParameter(json_encode($filesMetadata->jsonSerialize())))
4362
->setValue('sync_token', $qb->createNamedParameter($this->generateSyncToken()))
@@ -134,6 +153,7 @@ public function updateMetadata(IFilesMetadata $filesMetadata): int {
134153
$expr = $qb->expr();
135154

136155
$qb->update(self::TABLE_METADATA)
156+
->hintShardKey('files_metadata', $this->getStorageId($filesMetadata))
137157
->set('json', $qb->createNamedParameter(json_encode($filesMetadata->jsonSerialize())))
138158
->set('sync_token', $qb->createNamedParameter($this->generateSyncToken()))
139159
->set('last_update', $qb->createFunction('NOW()'))

0 commit comments

Comments
 (0)