Fix dehydration

Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
Signed-off-by: Hannah von Reth <h.vonreth@opencloud.eu>
This commit is contained in:
Hannah von Reth 2025-06-04 14:57:35 +02:00 committed by Jyrki Gadinger
parent a2fed5b08a
commit b24ea4acf9
9 changed files with 30 additions and 27 deletions

View File

@ -179,7 +179,7 @@ public:
* If the remote metadata changes, the local placeholder's metadata should possibly
* change as well.
*/
[[nodiscard]] virtual Result<void, QString> updateMetadata(const QString &filePath, time_t modtime, qint64 size, const QByteArray &fileId) = 0;
[[nodiscard]] virtual OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> updateMetadata(const SyncFileItem &syncItem, const QString &filePath, const QString &replacesFile) = 0;
[[nodiscard]] virtual Result<Vfs::ConvertToPlaceholderResult, QString> updatePlaceholderMarkInSync(const QString &filePath, const QByteArray &fileId) = 0;
@ -320,7 +320,7 @@ public:
[[nodiscard]] bool socketApiPinStateActionsShown() const override { return false; }
[[nodiscard]] bool isHydrating() const override { return false; }
Result<void, QString> updateMetadata(const QString &, time_t, qint64, const QByteArray &) override { return {}; }
OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> updateMetadata(const SyncFileItem &, const QString &, const QString &) override { return {OCC::Vfs::ConvertToPlaceholderResult::Ok}; }
Result<Vfs::ConvertToPlaceholderResult, QString> updatePlaceholderMarkInSync(const QString &filePath, const QByteArray &fileId) override {Q_UNUSED(filePath) Q_UNUSED(fileId) return {QString{}};}
[[nodiscard]] bool isPlaceHolderInSync(const QString &filePath) const override { Q_UNUSED(filePath) return true; }
Result<void, QString> createPlaceholder(const SyncFileItem &) override { return {}; }

View File

@ -396,7 +396,7 @@ void OCC::SyncEngine::slotItemDiscovered(const OCC::SyncFileItemPtr &item)
// Update on-disk virtual file metadata
if (modificationHappened && item->_type == ItemTypeVirtualFile) {
auto r = _syncOptions._vfs->updateMetadata(filePath, item->_modtime, item->_size, item->_fileId);
auto r = _syncOptions._vfs->updateMetadata(*item, filePath, {});
if (!r) {
item->_status = SyncFileItem::Status::NormalError;
item->_instruction = CSYNC_INSTRUCTION_ERROR;

View File

@ -327,7 +327,6 @@ OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> updatePlaceholderStat
OCC::Utility::UnixTimeToLargeIntegerFiletime(modtime, &metadata.BasicInfo.LastAccessTime);
OCC::Utility::UnixTimeToLargeIntegerFiletime(modtime, &metadata.BasicInfo.ChangeTime);
OCC::CfApiWrapper::setPinState(path, OCC::PinState::Unspecified, OCC::CfApiWrapper::SetPinRecurseMode::NoRecurse);
qCInfo(lcCfApiWrapper) << "updatePlaceholderState" << path << modtime;
const qint64 result =

View File

@ -177,19 +177,19 @@ bool VfsCfApi::isHydrating() const
return !d->hydrationJobs.isEmpty();
}
Result<void, QString> VfsCfApi::updateMetadata(const QString &filePath, time_t modtime, qint64 size, const QByteArray &fileId)
OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> VfsCfApi::updateMetadata(const SyncFileItem &syncItem, const QString &filePath, const QString &replacesFile)
{
const auto localPath = QDir::toNativeSeparators(filePath);
if (cfapi::handleForPath(localPath)) {
auto result = cfapi::updatePlaceholderInfo(localPath, modtime, size, fileId);
if (result) {
return {};
} else {
return result.error();
}
const auto replacesPath = QDir::toNativeSeparators(replacesFile);
if (syncItem._type == ItemTypeVirtualFileDehydration) {
return cfapi::dehydratePlaceholder(localPath, syncItem._modtime, syncItem._size, syncItem._fileId);
} else {
qCWarning(lcCfApi) << "Couldn't update metadata for non existing file" << localPath;
return {QStringLiteral("Couldn't update metadata")};
if (cfapi::findPlaceholderInfo(localPath)) {
return cfapi::updatePlaceholderInfo(localPath, syncItem._modtime, syncItem._size, syncItem._fileId, replacesPath);
} else {
return cfapi::convertToPlaceholder(localPath, syncItem._modtime, syncItem._size, syncItem._fileId, replacesPath);
}
}
}

View File

@ -32,7 +32,7 @@ public:
bool socketApiPinStateActionsShown() const override;
bool isHydrating() const override;
Result<void, QString> updateMetadata(const QString &filePath, time_t modtime, qint64 size, const QByteArray &fileId) override;
OCC::Result<ConvertToPlaceholderResult, QString> updateMetadata(const SyncFileItem &syncItem, const QString &filePath, const QString &replacesFile) override;
Result<Vfs::ConvertToPlaceholderResult, QString> updatePlaceholderMarkInSync(const QString &filePath, const QByteArray &fileId) override;

View File

@ -66,15 +66,17 @@ bool VfsSuffix::isHydrating() const
return false;
}
Result<void, QString> VfsSuffix::updateMetadata(const QString &filePath, time_t modtime, qint64, const QByteArray &)
OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> VfsSuffix::updateMetadata(const SyncFileItem &syncItem, const QString &filePath, const QString &replacesFile)
{
if (modtime <= 0) {
Q_UNUSED(replacesFile)
if (syncItem._modtime <= 0) {
return {tr("Error updating metadata due to invalid modification time")};
}
qCDebug(lcVfsSuffix()) << "setModTime" << filePath << modtime;
FileSystem::setModTime(filePath, modtime);
return {};
qCDebug(lcVfsSuffix()) << "setModTime" << filePath << syncItem._modtime;
FileSystem::setModTime(filePath, syncItem._modtime);
return {OCC::Vfs::ConvertToPlaceholderResult::Ok};
}
Result<void, QString> VfsSuffix::createPlaceholder(const SyncFileItem &item)

View File

@ -30,7 +30,7 @@ public:
[[nodiscard]] bool socketApiPinStateActionsShown() const override { return true; }
[[nodiscard]] bool isHydrating() const override;
Result<void, QString> updateMetadata(const QString &filePath, time_t modtime, qint64 size, const QByteArray &fileId) override;
OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> updateMetadata(const SyncFileItem &syncItem, const QString &filePath, const QString &replacesFile) override;
Result<Vfs::ConvertToPlaceholderResult, QString> updatePlaceholderMarkInSync(const QString &filePath, const QByteArray &fileId) override {Q_UNUSED(filePath) Q_UNUSED(fileId) return {QString{}};}
[[nodiscard]] bool isPlaceHolderInSync(const QString &filePath) const override { Q_UNUSED(filePath) return true; }

View File

@ -60,15 +60,17 @@ bool VfsXAttr::isHydrating() const
return false;
}
Result<void, QString> VfsXAttr::updateMetadata(const QString &filePath, time_t modtime, qint64, const QByteArray &)
OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> VfsXAttr::updateMetadata(const SyncFileItem &syncItem, const QString &filePath, const QString &replacesFile)
{
if (modtime <= 0) {
Q_UNUSED(replacesFile)
if (syncItem._modtime <= 0) {
return {tr("Error updating metadata due to invalid modification time")};
}
qCDebug(lcVfsXAttr()) << "setModTime" << filePath << modtime;
FileSystem::setModTime(filePath, modtime);
return {};
qCDebug(lcVfsXAttr()) << "setModTime" << filePath << syncItem._modtime;
FileSystem::setModTime(filePath, syncItem._modtime);
return {OCC::Vfs::ConvertToPlaceholderResult::Ok};
}
Result<void, QString> VfsXAttr::createPlaceholder(const SyncFileItem &item)

View File

@ -29,7 +29,7 @@ public:
[[nodiscard]] bool socketApiPinStateActionsShown() const override;
[[nodiscard]] bool isHydrating() const override;
Result<void, QString> updateMetadata(const QString &filePath, time_t modtime, qint64 size, const QByteArray &fileId) override;
OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> updateMetadata(const SyncFileItem &syncItem, const QString &filePath, const QString &replacesFile) override;
Result<Vfs::ConvertToPlaceholderResult, QString> updatePlaceholderMarkInSync(const QString &filePath, const QByteArray &fileId) override {Q_UNUSED(filePath) Q_UNUSED(fileId) return {QString{}};}
[[nodiscard]] bool isPlaceHolderInSync(const QString &filePath) const override { Q_UNUSED(filePath) return true; }