mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-25 22:46:04 +03:00
Merge pull request #6846 from nextcloud/enh/add-cfapi-debug-logs
Add cfapi debug logs
This commit is contained in:
commit
b34a89a653
2 changed files with 76 additions and 5 deletions
|
@ -329,7 +329,7 @@ void GETFileJob::slotReadyRead()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reply()->isFinished() && (reply()->bytesAvailable() == 0 || !_saveBodyToFile)) {
|
if (reply()->isFinished() && (reply()->bytesAvailable() == 0 || !_saveBodyToFile)) {
|
||||||
qCDebug(lcGetJob) << "Actually finished!";
|
qCDebug(lcGetJob) << "Get file job finished bytesAvailable/_saveBodyToFile:" << reply()->bytesAvailable() << "/" << _saveBodyToFile ;
|
||||||
if (_bandwidthManager) {
|
if (_bandwidthManager) {
|
||||||
_bandwidthManager->unregisterDownloadJob(this);
|
_bandwidthManager->unregisterDownloadJob(this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,6 +133,10 @@ void cfApiSendTransferInfo(const CF_CONNECTION_KEY &connectionKey, const CF_TRAN
|
||||||
void CALLBACK cfApiFetchDataCallback(const CF_CALLBACK_INFO *callbackInfo, const CF_CALLBACK_PARAMETERS *callbackParameters)
|
void CALLBACK cfApiFetchDataCallback(const CF_CALLBACK_INFO *callbackInfo, const CF_CALLBACK_PARAMETERS *callbackParameters)
|
||||||
{
|
{
|
||||||
qDebug(lcCfApiWrapper) << "Fetch data callback called. File size:" << callbackInfo->FileSize.QuadPart;
|
qDebug(lcCfApiWrapper) << "Fetch data callback called. File size:" << callbackInfo->FileSize.QuadPart;
|
||||||
|
qDebug(lcCfApiWrapper) << "Desktop client proccess id:" << QCoreApplication::applicationPid();
|
||||||
|
qDebug(lcCfApiWrapper) << "Fetch data requested by proccess id:" << callbackInfo->ProcessInfo->ProcessId;
|
||||||
|
qDebug(lcCfApiWrapper) << "Fetch data requested by application id:" << QString(QString::fromWCharArray(callbackInfo->ProcessInfo->ApplicationId));
|
||||||
|
|
||||||
const auto sendTransferError = [=] {
|
const auto sendTransferError = [=] {
|
||||||
cfApiSendTransferInfo(callbackInfo->ConnectionKey,
|
cfApiSendTransferInfo(callbackInfo->ConnectionKey,
|
||||||
callbackInfo->TransferKey,
|
callbackInfo->TransferKey,
|
||||||
|
@ -158,6 +162,8 @@ void CALLBACK cfApiFetchDataCallback(const CF_CALLBACK_INFO *callbackInfo, const
|
||||||
const auto path = QString(QString::fromWCharArray(callbackInfo->VolumeDosName) + QString::fromWCharArray(callbackInfo->NormalizedPath));
|
const auto path = QString(QString::fromWCharArray(callbackInfo->VolumeDosName) + QString::fromWCharArray(callbackInfo->NormalizedPath));
|
||||||
const auto requestId = QString::number(callbackInfo->TransferKey.QuadPart, 16);
|
const auto requestId = QString::number(callbackInfo->TransferKey.QuadPart, 16);
|
||||||
|
|
||||||
|
qCDebug(lcCfApiWrapper) << "Request hydration for" << path << requestId;
|
||||||
|
|
||||||
const auto invokeResult = QMetaObject::invokeMethod(vfs, [=] { vfs->requestHydration(requestId, path); }, Qt::QueuedConnection);
|
const auto invokeResult = QMetaObject::invokeMethod(vfs, [=] { vfs->requestHydration(requestId, path); }, Qt::QueuedConnection);
|
||||||
if (!invokeResult) {
|
if (!invokeResult) {
|
||||||
qCCritical(lcCfApiWrapper) << "Failed to trigger hydration for" << path << requestId;
|
qCCritical(lcCfApiWrapper) << "Failed to trigger hydration for" << path << requestId;
|
||||||
|
@ -165,26 +171,33 @@ void CALLBACK cfApiFetchDataCallback(const CF_CALLBACK_INFO *callbackInfo, const
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qCDebug(lcCfApiWrapper) << "Successfully triggered hydration for" << path << requestId;
|
||||||
|
|
||||||
// Block and wait for vfs to signal back the hydration is ready
|
// Block and wait for vfs to signal back the hydration is ready
|
||||||
bool hydrationRequestResult = false;
|
bool hydrationRequestResult = false;
|
||||||
QEventLoop loop;
|
QEventLoop loop;
|
||||||
QObject::connect(vfs, &OCC::VfsCfApi::hydrationRequestReady, &loop, [&](const QString &id) {
|
QObject::connect(vfs, &OCC::VfsCfApi::hydrationRequestReady, &loop, [&](const QString &id) {
|
||||||
if (requestId == id) {
|
if (requestId == id) {
|
||||||
hydrationRequestResult = true;
|
hydrationRequestResult = true;
|
||||||
|
qCDebug(lcCfApiWrapper) << "Hydration request ready for" << path << requestId;
|
||||||
loop.quit();
|
loop.quit();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
QObject::connect(vfs, &OCC::VfsCfApi::hydrationRequestFailed, &loop, [&](const QString &id) {
|
QObject::connect(vfs, &OCC::VfsCfApi::hydrationRequestFailed, &loop, [&](const QString &id) {
|
||||||
if (requestId == id) {
|
if (requestId == id) {
|
||||||
hydrationRequestResult = false;
|
hydrationRequestResult = false;
|
||||||
|
qCDebug(lcCfApiWrapper) << "Hydration request failed for" << path << requestId;
|
||||||
loop.quit();
|
loop.quit();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
loop.exec();
|
|
||||||
QObject::disconnect(vfs, nullptr, &loop, nullptr);
|
|
||||||
qCInfo(lcCfApiWrapper) << "VFS replied for hydration of" << path << requestId << "status was:" << hydrationRequestResult;
|
|
||||||
|
|
||||||
|
qCDebug(lcCfApiWrapper) << "Starting event loop 1";
|
||||||
|
loop.exec();
|
||||||
|
QObject::disconnect(vfs, nullptr, &loop, nullptr); // Ensure we properly cancel hydration on server errors
|
||||||
|
|
||||||
|
qCInfo(lcCfApiWrapper) << "VFS replied for hydration of" << path << requestId << "status was:" << hydrationRequestResult;
|
||||||
if (!hydrationRequestResult) {
|
if (!hydrationRequestResult) {
|
||||||
|
qCCritical(lcCfApiWrapper) << "Failed to trigger hydration for" << path << requestId;
|
||||||
sendTransferError();
|
sendTransferError();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -212,6 +225,7 @@ void CALLBACK cfApiFetchDataCallback(const CF_CALLBACK_INFO *callbackInfo, const
|
||||||
auto hydrationRequestCancelled = false;
|
auto hydrationRequestCancelled = false;
|
||||||
QObject::connect(&signalSocket, &QLocalSocket::readyRead, &loop, [&] {
|
QObject::connect(&signalSocket, &QLocalSocket::readyRead, &loop, [&] {
|
||||||
hydrationRequestCancelled = true;
|
hydrationRequestCancelled = true;
|
||||||
|
qCCritical(lcCfApiWrapper) << "Hydration canceled for " << path << requestId;
|
||||||
});
|
});
|
||||||
|
|
||||||
// CFAPI expects sent blocks to be of a multiple of a block size.
|
// CFAPI expects sent blocks to be of a multiple of a block size.
|
||||||
|
@ -223,17 +237,25 @@ void CALLBACK cfApiFetchDataCallback(const CF_CALLBACK_INFO *callbackInfo, const
|
||||||
|
|
||||||
const auto alignAndSendData = [&](const QByteArray &receivedData) {
|
const auto alignAndSendData = [&](const QByteArray &receivedData) {
|
||||||
QByteArray data = protrudingData + receivedData;
|
QByteArray data = protrudingData + receivedData;
|
||||||
|
qCWarning(lcCfApiWrapper) << "protrudingData + receivedData:" << data;
|
||||||
protrudingData.clear();
|
protrudingData.clear();
|
||||||
if (data.size() < cfapiBlockSize) {
|
if (data.size() < cfapiBlockSize) {
|
||||||
protrudingData = data;
|
protrudingData = data;
|
||||||
|
qCWarning(lcCfApiWrapper) << "protrudingData:" << protrudingData;
|
||||||
|
sendTransferInfo(data, dataOffset);
|
||||||
|
dataOffset += data.size();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const auto protudingSize = data.size() % cfapiBlockSize;
|
const auto protudingSize = data.size() % cfapiBlockSize;
|
||||||
|
qCWarning(lcCfApiWrapper) << "protudingSize:" << protudingSize;
|
||||||
protrudingData = data.right(protudingSize);
|
protrudingData = data.right(protudingSize);
|
||||||
|
qCWarning(lcCfApiWrapper) << "data.right(protudingSize):" << protrudingData;
|
||||||
data.chop(protudingSize);
|
data.chop(protudingSize);
|
||||||
|
qCWarning(lcCfApiWrapper) << "data.chop(protudingSize)" << data;
|
||||||
|
qCWarning(lcCfApiWrapper) << "sendTransferInfo(data:" << data << ", dataOffset:" << dataOffset << ")";
|
||||||
sendTransferInfo(data, dataOffset);
|
sendTransferInfo(data, dataOffset);
|
||||||
dataOffset += data.size();
|
dataOffset += data.size();
|
||||||
|
qCWarning(lcCfApiWrapper) << "dataOffset:" << dataOffset;
|
||||||
};
|
};
|
||||||
|
|
||||||
QObject::connect(&socket, &QLocalSocket::readyRead, &loop, [&] {
|
QObject::connect(&socket, &QLocalSocket::readyRead, &loop, [&] {
|
||||||
|
@ -260,6 +282,7 @@ void CALLBACK cfApiFetchDataCallback(const CF_CALLBACK_INFO *callbackInfo, const
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
qCDebug(lcCfApiWrapper) << "Starting event loop 2";
|
||||||
loop.exec();
|
loop.exec();
|
||||||
|
|
||||||
if (!hydrationRequestCancelled && !protrudingData.isEmpty()) {
|
if (!hydrationRequestCancelled && !protrudingData.isEmpty()) {
|
||||||
|
@ -351,9 +374,57 @@ void CALLBACK cfApiCancelFetchData(const CF_CALLBACK_INFO *callbackInfo, const C
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CALLBACK cfApiNotifyFileOpenCompletion(const CF_CALLBACK_INFO *callbackInfo, const CF_CALLBACK_PARAMETERS * /*callbackParameters*/)
|
||||||
|
{
|
||||||
|
const auto path = QString(QString::fromWCharArray(callbackInfo->VolumeDosName) + QString::fromWCharArray(callbackInfo->NormalizedPath));
|
||||||
|
|
||||||
|
auto vfs = reinterpret_cast<OCC::VfsCfApi *>(callbackInfo->CallbackContext);
|
||||||
|
Q_ASSERT(vfs->metaObject()->className() == QByteArrayLiteral("OCC::VfsCfApi"));
|
||||||
|
const auto requestId = QString::number(callbackInfo->TransferKey.QuadPart, 16);
|
||||||
|
|
||||||
|
qCDebug(lcCfApiWrapper) << "Open file completion:" << path << requestId;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CALLBACK cfApiValidateData(const CF_CALLBACK_INFO *callbackInfo, const CF_CALLBACK_PARAMETERS * /*callbackParameters*/)
|
||||||
|
{
|
||||||
|
const auto path = QString(QString::fromWCharArray(callbackInfo->VolumeDosName) + QString::fromWCharArray(callbackInfo->NormalizedPath));
|
||||||
|
|
||||||
|
auto vfs = reinterpret_cast<OCC::VfsCfApi *>(callbackInfo->CallbackContext);
|
||||||
|
Q_ASSERT(vfs->metaObject()->className() == QByteArrayLiteral("OCC::VfsCfApi"));
|
||||||
|
const auto requestId = QString::number(callbackInfo->TransferKey.QuadPart, 16);
|
||||||
|
|
||||||
|
qCDebug(lcCfApiWrapper) << "Validate data:" << path << requestId;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CALLBACK cfApiCancelFetchPlaceHolders(const CF_CALLBACK_INFO *callbackInfo, const CF_CALLBACK_PARAMETERS * /*callbackParameters*/)
|
||||||
|
{
|
||||||
|
const auto path = QString(QString::fromWCharArray(callbackInfo->VolumeDosName) + QString::fromWCharArray(callbackInfo->NormalizedPath));
|
||||||
|
|
||||||
|
auto vfs = reinterpret_cast<OCC::VfsCfApi *>(callbackInfo->CallbackContext);
|
||||||
|
Q_ASSERT(vfs->metaObject()->className() == QByteArrayLiteral("OCC::VfsCfApi"));
|
||||||
|
const auto requestId = QString::number(callbackInfo->TransferKey.QuadPart, 16);
|
||||||
|
|
||||||
|
qCDebug(lcCfApiWrapper) << "Cancel fetch placeholder:" << path << requestId;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CALLBACK cfApiNotifyFileCloseCompletion(const CF_CALLBACK_INFO *callbackInfo, const CF_CALLBACK_PARAMETERS * /*callbackParameters*/)
|
||||||
|
{
|
||||||
|
const auto path = QString(QString::fromWCharArray(callbackInfo->VolumeDosName) + QString::fromWCharArray(callbackInfo->NormalizedPath));
|
||||||
|
|
||||||
|
auto vfs = reinterpret_cast<OCC::VfsCfApi *>(callbackInfo->CallbackContext);
|
||||||
|
Q_ASSERT(vfs->metaObject()->className() == QByteArrayLiteral("OCC::VfsCfApi"));
|
||||||
|
const auto requestId = QString::number(callbackInfo->TransferKey.QuadPart, 16);
|
||||||
|
|
||||||
|
qCDebug(lcCfApiWrapper) << "Close file completion:" << path << requestId;
|
||||||
|
}
|
||||||
|
|
||||||
CF_CALLBACK_REGISTRATION cfApiCallbacks[] = {
|
CF_CALLBACK_REGISTRATION cfApiCallbacks[] = {
|
||||||
{ CF_CALLBACK_TYPE_FETCH_DATA, cfApiFetchDataCallback },
|
{ CF_CALLBACK_TYPE_FETCH_DATA, cfApiFetchDataCallback },
|
||||||
{ CF_CALLBACK_TYPE_CANCEL_FETCH_DATA, cfApiCancelFetchData },
|
{ CF_CALLBACK_TYPE_CANCEL_FETCH_DATA, cfApiCancelFetchData },
|
||||||
|
{ CF_CALLBACK_TYPE_NOTIFY_FILE_OPEN_COMPLETION, cfApiNotifyFileOpenCompletion },
|
||||||
|
{ CF_CALLBACK_TYPE_NOTIFY_FILE_CLOSE_COMPLETION, cfApiNotifyFileCloseCompletion },
|
||||||
|
{ CF_CALLBACK_TYPE_VALIDATE_DATA, cfApiValidateData },
|
||||||
|
{ CF_CALLBACK_TYPE_CANCEL_FETCH_PLACEHOLDERS, cfApiCancelFetchPlaceHolders },
|
||||||
CF_CALLBACK_REGISTRATION_END
|
CF_CALLBACK_REGISTRATION_END
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue