Skip to content

Commit

Permalink
Merge pull request #7772 from nextcloud/feature/capabilities-chunk-si…
Browse files Browse the repository at this point in the history
…ze-server

sync: Respect maximum chunk size provided in server capabilities
  • Loading branch information
mgallien authored Jan 23, 2025
2 parents 0f867d4 + 46dc2a7 commit 9046f75
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 5 deletions.
21 changes: 16 additions & 5 deletions src/gui/folder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1144,20 +1144,31 @@ SyncOptions Folder::initializeSyncOptions() const
{
SyncOptions opt;
ConfigFile cfgFile;
const auto account = _accountState->account();

auto newFolderLimit = cfgFile.newBigFolderSizeLimit();
opt._newBigFolderSizeLimit = newFolderLimit.first ? newFolderLimit.second * 1000LL * 1000LL : -1; // convert from MB to B
opt._confirmExternalStorage = cfgFile.confirmExternalStorage();
opt._moveFilesToTrash = cfgFile.moveToTrash();
opt._vfs = _vfs;
opt._parallelNetworkJobs = _accountState->account()->isHttp2Supported() ? 20 : 6;

const auto capsMaxConcurrentChunkUploads = account->capabilities().maxConcurrentChunkUploads();
opt._parallelNetworkJobs = capsMaxConcurrentChunkUploads > 0
? capsMaxConcurrentChunkUploads
: account->isHttp2Supported() ? 20 : 6;

// Chunk V2: Size of chunks must be between 5MB and 5GB, except for the last chunk which can be smaller
opt.setMinChunkSize(cfgFile.minChunkSize());
opt.setMaxChunkSize(cfgFile.maxChunkSize());
opt._initialChunkSize = ::qBound(opt.minChunkSize(), cfgFile.chunkSize(), opt.maxChunkSize());
opt._targetChunkUploadDuration = cfgFile.targetChunkUploadDuration();
const auto cfgMinChunkSize = cfgFile.minChunkSize();
opt.setMinChunkSize(cfgMinChunkSize);

if (const auto capsMaxChunkSize = account->capabilities().maxChunkSize(); capsMaxChunkSize) {
opt.setMaxChunkSize(capsMaxChunkSize);
opt._initialChunkSize = capsMaxChunkSize;
} else {
const auto cfgMaxChunkSize = cfgFile.maxChunkSize();
opt.setMaxChunkSize(cfgMaxChunkSize);
opt._initialChunkSize = ::qBound(cfgMinChunkSize, cfgFile.chunkSize(), cfgMaxChunkSize);
}
opt.fillFromEnvironmentVariables();
opt.verifyChunkSizes();

Expand Down
10 changes: 10 additions & 0 deletions src/libsync/capabilities.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,16 @@ bool Capabilities::chunkingNg() const
return _capabilities["dav"].toMap()["chunking"].toByteArray() >= "1.0";
}

qint64 Capabilities::maxChunkSize() const
{
return _capabilities["files"].toMap()["chunked_upload"].toMap()["max_size"].toLongLong();
}

int Capabilities::maxConcurrentChunkUploads() const
{
return _capabilities["files"].toMap()["chunked_upload"].toMap()["max_parallel_count"].toInt();
}

bool Capabilities::bulkUpload() const
{
return _capabilities["dav"].toMap()["bulkupload"].toByteArray() >= "1.0";
Expand Down
2 changes: 2 additions & 0 deletions src/libsync/capabilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ class OWNCLOUDSYNC_EXPORT Capabilities
[[nodiscard]] bool shareResharing() const;
[[nodiscard]] int shareDefaultPermissions() const;
[[nodiscard]] bool chunkingNg() const;
[[nodiscard]] qint64 maxChunkSize() const;
[[nodiscard]] int maxConcurrentChunkUploads() const;
[[nodiscard]] bool bulkUpload() const;
[[nodiscard]] bool filesLockAvailable() const;
[[nodiscard]] bool filesLockTypeAvailable() const;
Expand Down

0 comments on commit 9046f75

Please sign in to comment.