Skip to content

Commit 9046f75

Browse files
authored
Merge pull request #7772 from nextcloud/feature/capabilities-chunk-size-server
sync: Respect maximum chunk size provided in server capabilities
2 parents 0f867d4 + 46dc2a7 commit 9046f75

File tree

3 files changed

+28
-5
lines changed

3 files changed

+28
-5
lines changed

src/gui/folder.cpp

+16-5
Original file line numberDiff line numberDiff line change
@@ -1144,20 +1144,31 @@ SyncOptions Folder::initializeSyncOptions() const
11441144
{
11451145
SyncOptions opt;
11461146
ConfigFile cfgFile;
1147+
const auto account = _accountState->account();
11471148

11481149
auto newFolderLimit = cfgFile.newBigFolderSizeLimit();
11491150
opt._newBigFolderSizeLimit = newFolderLimit.first ? newFolderLimit.second * 1000LL * 1000LL : -1; // convert from MB to B
11501151
opt._confirmExternalStorage = cfgFile.confirmExternalStorage();
11511152
opt._moveFilesToTrash = cfgFile.moveToTrash();
11521153
opt._vfs = _vfs;
1153-
opt._parallelNetworkJobs = _accountState->account()->isHttp2Supported() ? 20 : 6;
1154+
1155+
const auto capsMaxConcurrentChunkUploads = account->capabilities().maxConcurrentChunkUploads();
1156+
opt._parallelNetworkJobs = capsMaxConcurrentChunkUploads > 0
1157+
? capsMaxConcurrentChunkUploads
1158+
: account->isHttp2Supported() ? 20 : 6;
11541159

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

1164+
if (const auto capsMaxChunkSize = account->capabilities().maxChunkSize(); capsMaxChunkSize) {
1165+
opt.setMaxChunkSize(capsMaxChunkSize);
1166+
opt._initialChunkSize = capsMaxChunkSize;
1167+
} else {
1168+
const auto cfgMaxChunkSize = cfgFile.maxChunkSize();
1169+
opt.setMaxChunkSize(cfgMaxChunkSize);
1170+
opt._initialChunkSize = ::qBound(cfgMinChunkSize, cfgFile.chunkSize(), cfgMaxChunkSize);
1171+
}
11611172
opt.fillFromEnvironmentVariables();
11621173
opt.verifyChunkSizes();
11631174

src/libsync/capabilities.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,16 @@ bool Capabilities::chunkingNg() const
245245
return _capabilities["dav"].toMap()["chunking"].toByteArray() >= "1.0";
246246
}
247247

248+
qint64 Capabilities::maxChunkSize() const
249+
{
250+
return _capabilities["files"].toMap()["chunked_upload"].toMap()["max_size"].toLongLong();
251+
}
252+
253+
int Capabilities::maxConcurrentChunkUploads() const
254+
{
255+
return _capabilities["files"].toMap()["chunked_upload"].toMap()["max_parallel_count"].toInt();
256+
}
257+
248258
bool Capabilities::bulkUpload() const
249259
{
250260
return _capabilities["dav"].toMap()["bulkupload"].toByteArray() >= "1.0";

src/libsync/capabilities.h

+2
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ class OWNCLOUDSYNC_EXPORT Capabilities
6464
[[nodiscard]] bool shareResharing() const;
6565
[[nodiscard]] int shareDefaultPermissions() const;
6666
[[nodiscard]] bool chunkingNg() const;
67+
[[nodiscard]] qint64 maxChunkSize() const;
68+
[[nodiscard]] int maxConcurrentChunkUploads() const;
6769
[[nodiscard]] bool bulkUpload() const;
6870
[[nodiscard]] bool filesLockAvailable() const;
6971
[[nodiscard]] bool filesLockTypeAvailable() const;

0 commit comments

Comments
 (0)