From 049bcae29ebf6106b33dd44f3be30e2a8486cd98 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 2 Nov 2016 14:42:36 +0100 Subject: [PATCH] Allow setting a maximun number of buckets for multibucket Signed-off-by: Robin Appelman --- .../Files/Mount/ObjectHomeMountProvider.php | 3 ++- lib/private/Files/ObjectStore/Mapper.php | 8 +++++--- .../Files/Mount/ObjectHomeMountProviderTest.php | 8 ++++---- tests/lib/Files/ObjectStore/MapperTest.php | 14 +++++++++----- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/lib/private/Files/Mount/ObjectHomeMountProvider.php b/lib/private/Files/Mount/ObjectHomeMountProvider.php index c1eea34a72..87878562a4 100644 --- a/lib/private/Files/Mount/ObjectHomeMountProvider.php +++ b/lib/private/Files/Mount/ObjectHomeMountProvider.php @@ -121,7 +121,8 @@ class ObjectHomeMountProvider implements IHomeMountProvider { $config['arguments']['bucket'] = ''; } $mapper = new \OC\Files\ObjectStore\Mapper($user); - $config['arguments']['bucket'] .= $mapper->getBucket(); + $numBuckets = isset($config['arguments']['num_buckets']) ? $config['arguments']['num_buckets'] : 64; + $config['arguments']['bucket'] .= $mapper->getBucket($numBuckets); $this->config->setUserValue($user->getUID(), 'homeobjectstore', 'bucket', $config['arguments']['bucket']); } else { diff --git a/lib/private/Files/ObjectStore/Mapper.php b/lib/private/Files/ObjectStore/Mapper.php index bfb4e99815..81f8a9e3fa 100644 --- a/lib/private/Files/ObjectStore/Mapper.php +++ b/lib/private/Files/ObjectStore/Mapper.php @@ -44,10 +44,12 @@ class Mapper { } /** + * @param int $numBuckets * @return string */ - public function getBucket() { + public function getBucket($numBuckets = 64) { $hash = md5($this->user->getUID()); - return substr($hash, 0, 3); + $num = hexdec(substr($hash, 0, 4)); + return (string)($num % $numBuckets); } -} \ No newline at end of file +} diff --git a/tests/lib/Files/Mount/ObjectHomeMountProviderTest.php b/tests/lib/Files/Mount/ObjectHomeMountProviderTest.php index 0af90991d6..9aa0143b4a 100644 --- a/tests/lib/Files/Mount/ObjectHomeMountProviderTest.php +++ b/tests/lib/Files/Mount/ObjectHomeMountProviderTest.php @@ -80,7 +80,7 @@ class ObjectHomeMountProviderTest extends \Test\TestCase { $this->equalTo('uid'), $this->equalTo('homeobjectstore'), $this->equalTo('bucket'), - $this->equalTo('987'), + $this->equalTo('49'), $this->equalTo(null) ); @@ -94,7 +94,7 @@ class ObjectHomeMountProviderTest extends \Test\TestCase { $this->assertArrayHasKey('objectstore', $config['arguments']); $this->assertInstanceOf('Test\Files\Mount\FakeObjectStore', $config['arguments']['objectstore']); $this->assertArrayHasKey('bucket', $config['arguments']); - $this->assertEquals('987', $config['arguments']['bucket']); + $this->assertEquals('49', $config['arguments']['bucket']); } public function testMultiBucketWithPrefix() { @@ -127,7 +127,7 @@ class ObjectHomeMountProviderTest extends \Test\TestCase { $this->equalTo('uid'), $this->equalTo('homeobjectstore'), $this->equalTo('bucket'), - $this->equalTo('myBucketPrefix987'), + $this->equalTo('myBucketPrefix49'), $this->equalTo(null) ); @@ -141,7 +141,7 @@ class ObjectHomeMountProviderTest extends \Test\TestCase { $this->assertArrayHasKey('objectstore', $config['arguments']); $this->assertInstanceOf('Test\Files\Mount\FakeObjectStore', $config['arguments']['objectstore']); $this->assertArrayHasKey('bucket', $config['arguments']); - $this->assertEquals('myBucketPrefix987', $config['arguments']['bucket']); + $this->assertEquals('myBucketPrefix49', $config['arguments']['bucket']); } public function testMultiBucketBucketAlreadySet() { diff --git a/tests/lib/Files/ObjectStore/MapperTest.php b/tests/lib/Files/ObjectStore/MapperTest.php index 18bdcdfd00..19451622fa 100644 --- a/tests/lib/Files/ObjectStore/MapperTest.php +++ b/tests/lib/Files/ObjectStore/MapperTest.php @@ -28,24 +28,28 @@ class MapperTest extends \Test\TestCase { public function dataGetBucket() { return [ - ['user', substr(md5('user'), 0, 3)], - ['USER', substr(md5('USER'), 0, 3)], - ['bc0e8b52-a66c-1035-90c6-d9663bda9e3f', substr(md5('bc0e8b52-a66c-1035-90c6-d9663bda9e3f'), 0, 3)], + ['user', 64, '17'], + ['USER', 64, '0'], + ['bc0e8b52-a66c-1035-90c6-d9663bda9e3f', 64, '56'], + ['user', 8, '1'], + ['user', 2, '1'], + ['USER', 2, '0'], ]; } /** * @dataProvider dataGetBucket * @param string $username + * @param int $numBuckets * @param string $expectedBucket */ - public function testGetBucket($username, $expectedBucket) { + public function testGetBucket($username, $numBuckets, $expectedBucket) { $user = $this->createMock(IUser::class); $user->method('getUID') ->willReturn($username); $mapper = new Mapper($user); - $this->assertSame($expectedBucket, $mapper->getBucket()); + $this->assertSame($expectedBucket, $mapper->getBucket($numBuckets)); } }