Skip to content

Commit af172b3

Browse files
Merge pull request #54920 from nextcloud/object-store-unique-buckets-names
2 parents 491c64d + 0c1d5e8 commit af172b3

File tree

2 files changed

+31
-11
lines changed

2 files changed

+31
-11
lines changed

lib/private/Files/ObjectStore/PrimaryObjectStoreConfig.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public function getObjectStoreConfigs(): ?array {
115115
// new-style multibucket config uses the same 'objectstore' key but sets `'multibucket' => true`, transparently upgrade older style config
116116
if ($objectStoreMultiBucket) {
117117
$objectStoreMultiBucket['arguments']['multibucket'] = true;
118-
return [
118+
$configs = [
119119
'default' => 'server1',
120120
'server1' => $this->validateObjectStoreConfig($objectStoreMultiBucket),
121121
'root' => 'server1',
@@ -135,10 +135,23 @@ public function getObjectStoreConfigs(): ?array {
135135
if (!is_string($objectStore['default'])) {
136136
throw new InvalidObjectStoreConfigurationException('The \'default\' object storage configuration is required to be a reference to another configuration.');
137137
}
138-
return array_map($this->validateObjectStoreConfig(...), $objectStore);
138+
$configs = array_map($this->validateObjectStoreConfig(...), $objectStore);
139139
} else {
140140
return null;
141141
}
142+
143+
$usedBuckets = [];
144+
foreach ($configs as $config) {
145+
if (is_array($config)) {
146+
$bucket = $config['arguments']['bucket'] ?? '';
147+
if (in_array($bucket, $usedBuckets)) {
148+
throw new InvalidObjectStoreConfigurationException('Each object store configuration must use distinct bucket names');
149+
}
150+
$usedBuckets[] = $bucket;
151+
}
152+
}
153+
154+
return $configs;
142155
}
143156

144157
/**

tests/lib/Files/ObjectStore/PrimaryObjectStoreConfigTest.php

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,14 @@ public function testExistingUserKeepsStorage() {
9191
'class' => StorageObjectStore::class,
9292
'arguments' => [
9393
'host' => 'server1',
94+
'bucket' => '1',
9495
],
9596
],
9697
'server2' => [
9798
'class' => StorageObjectStore::class,
9899
'arguments' => [
99100
'host' => 'server2',
101+
'bucket' => '2',
100102
],
101103
],
102104
]);
@@ -119,6 +121,7 @@ public function testNestedAliases() {
119121
'class' => StorageObjectStore::class,
120122
'arguments' => [
121123
'host' => 'server1',
124+
'bucket' => '1',
122125
],
123126
],
124127
]);
@@ -134,14 +137,14 @@ public function testMultibucketChangedConfig() {
134137
'host' => 'server1',
135138
'multibucket' => true,
136139
'num_buckets' => 8,
137-
'bucket' => 'bucket-'
140+
'bucket' => 'bucket1-'
138141
],
139142
],
140143
]);
141144

142145
$result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('test'));
143146
$this->assertEquals('server1', $result['arguments']['host']);
144-
$this->assertEquals('bucket-7', $result['arguments']['bucket']);
147+
$this->assertEquals('bucket1-7', $result['arguments']['bucket']);
145148

146149
$this->setConfig('objectstore', [
147150
'default' => 'server1',
@@ -151,18 +154,18 @@ public function testMultibucketChangedConfig() {
151154
'host' => 'server1',
152155
'multibucket' => true,
153156
'num_buckets' => 64,
154-
'bucket' => 'bucket-'
157+
'bucket' => 'bucket1-'
155158
],
156159
],
157160
]);
158161

159162
$result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('test'));
160163
$this->assertEquals('server1', $result['arguments']['host']);
161-
$this->assertEquals('bucket-7', $result['arguments']['bucket']);
164+
$this->assertEquals('bucket1-7', $result['arguments']['bucket']);
162165

163166
$result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('test-foo'));
164167
$this->assertEquals('server1', $result['arguments']['host']);
165-
$this->assertEquals('bucket-40', $result['arguments']['bucket']);
168+
$this->assertEquals('bucket1-40', $result['arguments']['bucket']);
166169

167170
$this->setConfig('objectstore', [
168171
'default' => 'server2',
@@ -172,7 +175,7 @@ public function testMultibucketChangedConfig() {
172175
'host' => 'server1',
173176
'multibucket' => true,
174177
'num_buckets' => 64,
175-
'bucket' => 'bucket-'
178+
'bucket' => 'bucket1-'
176179
],
177180
],
178181
'server2' => [
@@ -181,18 +184,18 @@ public function testMultibucketChangedConfig() {
181184
'host' => 'server2',
182185
'multibucket' => true,
183186
'num_buckets' => 16,
184-
'bucket' => 'bucket-'
187+
'bucket' => 'bucket2-'
185188
],
186189
],
187190
]);
188191

189192
$result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('test'));
190193
$this->assertEquals('server1', $result['arguments']['host']);
191-
$this->assertEquals('bucket-7', $result['arguments']['bucket']);
194+
$this->assertEquals('bucket1-7', $result['arguments']['bucket']);
192195

193196
$result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('test-bar'));
194197
$this->assertEquals('server2', $result['arguments']['host']);
195-
$this->assertEquals('bucket-4', $result['arguments']['bucket']);
198+
$this->assertEquals('bucket2-4', $result['arguments']['bucket']);
196199
}
197200

198201
public function testMultibucketOldConfig() {
@@ -249,12 +252,14 @@ public function testRoot() {
249252
'class' => StorageObjectStore::class,
250253
'arguments' => [
251254
'host' => 'server1',
255+
'bucket' => '1',
252256
],
253257
],
254258
'server2' => [
255259
'class' => StorageObjectStore::class,
256260
'arguments' => [
257261
'host' => 'server2',
262+
'bucket' => '2',
258263
],
259264
],
260265
]);
@@ -269,12 +274,14 @@ public function testRoot() {
269274
'class' => StorageObjectStore::class,
270275
'arguments' => [
271276
'host' => 'server1',
277+
'bucket' => '1',
272278
],
273279
],
274280
'server2' => [
275281
'class' => StorageObjectStore::class,
276282
'arguments' => [
277283
'host' => 'server2',
284+
'bucket' => '2',
278285
],
279286
],
280287
]);

0 commit comments

Comments
 (0)