aboutsummaryrefslogtreecommitdiffstats
path: root/storage
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2020-12-02 19:35:04 +0000
committerGeir Storli <geirst@verizonmedia.com>2020-12-04 11:00:47 +0000
commit4cacb47cb45ca45309ac77c83695da48bfa8eb06 (patch)
treed66ae75651cc1f3efe1c072a36f56800001bba4d /storage
parent2f1937241896f37dc32434ad18e316cb6913755a (diff)
Use the super bucket key when resolving which RPC target to use to handle a command.
Diffstat (limited to 'storage')
-rw-r--r--storage/src/tests/common/CMakeLists.txt1
-rw-r--r--storage/src/tests/common/bucket_utils_test.cpp30
-rw-r--r--storage/src/tests/storageserver/rpc/storage_api_rpc_service_test.cpp12
-rw-r--r--storage/src/vespa/storage/common/bucket_utils.h25
-rw-r--r--storage/src/vespa/storage/storageserver/rpc/storage_api_rpc_service.cpp10
5 files changed, 68 insertions, 10 deletions
diff --git a/storage/src/tests/common/CMakeLists.txt b/storage/src/tests/common/CMakeLists.txt
index 9e18a3ca7ca..400255964d6 100644
--- a/storage/src/tests/common/CMakeLists.txt
+++ b/storage/src/tests/common/CMakeLists.txt
@@ -12,6 +12,7 @@ vespa_add_library(storage_testcommon TEST
vespa_add_executable(storage_common_gtest_runner_app TEST
SOURCES
+ bucket_utils_test.cpp
global_bucket_space_distribution_converter_test.cpp
gtest_runner.cpp
metricstest.cpp
diff --git a/storage/src/tests/common/bucket_utils_test.cpp b/storage/src/tests/common/bucket_utils_test.cpp
new file mode 100644
index 00000000000..7cf6ee0af9f
--- /dev/null
+++ b/storage/src/tests/common/bucket_utils_test.cpp
@@ -0,0 +1,30 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/document/bucket/bucketid.h>
+#include <vespa/storage/common/bucket_utils.h>
+#include <vespa/vespalib/gtest/gtest.h>
+
+using document::BucketId;
+using storage::get_super_bucket_key;
+constexpr uint8_t MUB = storage::spi::BucketLimits::MinUsedBits;
+
+TEST(SuperBucketKeyTest, super_bucket_key_is_min_used_bits_of_msb_of_bucket_id_key)
+{
+ // Note that bits are reversed when creating a key from the bucket id
+ EXPECT_EQ(0x0F, get_super_bucket_key(BucketId(MUB, 0x1F0)));
+ EXPECT_EQ(0x0F, get_super_bucket_key(BucketId(MUB + 1, 0x1F0)));
+ EXPECT_EQ(0x0F, get_super_bucket_key(BucketId(MUB, 0x2F0)));
+ EXPECT_EQ(0x0F, get_super_bucket_key(BucketId(MUB + 1, 0x2F0)));
+
+ EXPECT_EQ(0xF4, get_super_bucket_key(BucketId(MUB, 0x12F)));
+ EXPECT_EQ(0xF4, get_super_bucket_key(BucketId(MUB + 1, 0x12F)));
+ EXPECT_EQ(0xF4, get_super_bucket_key(BucketId(MUB, 0x22F)));
+ EXPECT_EQ(0xF4, get_super_bucket_key(BucketId(MUB + 1, 0x22F)));
+}
+
+TEST(SuperBucketKeyTest, super_bucket_key_is_zero_when_bucket_id_is_zero)
+{
+ EXPECT_EQ(0, get_super_bucket_key(BucketId()));
+ EXPECT_EQ(0, get_super_bucket_key(BucketId(0)));
+}
+
diff --git a/storage/src/tests/storageserver/rpc/storage_api_rpc_service_test.cpp b/storage/src/tests/storageserver/rpc/storage_api_rpc_service_test.cpp
index 630ad7685e4..d1cdd649787 100644
--- a/storage/src/tests/storageserver/rpc/storage_api_rpc_service_test.cpp
+++ b/storage/src/tests/storageserver/rpc/storage_api_rpc_service_test.cpp
@@ -1,5 +1,6 @@
// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <tests/common/testhelper.h>
#include <vespa/document/base/testdocman.h>
#include <vespa/document/repo/documenttyperepo.h>
#include <vespa/document/test/make_document_bucket.h>
@@ -7,15 +8,14 @@
#include <vespa/fnet/frt/target.h>
#include <vespa/messagebus/testlib/slobrok.h>
#include <vespa/slobrok/sbmirror.h>
-#include <vespa/storage/storageserver/rpc/storage_api_rpc_service.h>
-#include <vespa/storage/storageserver/rpc/shared_rpc_resources.h>
-#include <vespa/storage/storageserver/rpc/message_codec_provider.h>
-#include <vespa/storage/storageserver/rpc/caching_rpc_target_resolver.h>
#include <vespa/storage/storageserver/communicationmanager.h>
-#include <vespa/storage/storageserver/rpcrequestwrapper.h>
#include <vespa/storage/storageserver/message_dispatcher.h>
+#include <vespa/storage/storageserver/rpc/caching_rpc_target_resolver.h>
+#include <vespa/storage/storageserver/rpc/message_codec_provider.h>
+#include <vespa/storage/storageserver/rpc/shared_rpc_resources.h>
+#include <vespa/storage/storageserver/rpc/storage_api_rpc_service.h>
+#include <vespa/storage/storageserver/rpcrequestwrapper.h>
#include <vespa/storageapi/message/persistence.h>
-#include <tests/common/testhelper.h>
#include <vespa/vespalib/gtest/gtest.h>
#include <vespa/vespalib/util/host_name.h>
#include <vespa/vespalib/util/stringfmt.h>
diff --git a/storage/src/vespa/storage/common/bucket_utils.h b/storage/src/vespa/storage/common/bucket_utils.h
new file mode 100644
index 00000000000..019cb7e1c5b
--- /dev/null
+++ b/storage/src/vespa/storage/common/bucket_utils.h
@@ -0,0 +1,25 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/document/bucket/bucketid.h>
+#include <vespa/persistence/spi/bucket_limits.h>
+#include <cassert>
+
+namespace storage {
+
+/**
+ * Returns the super bucket key of the given bucket id key based on the minimum used bits allowed.
+ *
+ * For a bucket id that is explicit zero, the super bucket key is zero as well.
+ */
+inline uint64_t get_super_bucket_key(const document::BucketId& bucket_id) noexcept {
+ if (bucket_id == document::BucketId(0)) {
+ return 0;
+ }
+ assert(bucket_id.getUsedBits() >= spi::BucketLimits::MinUsedBits);
+ // Since bucket keys have count-bits at the LSB positions, we want to look at the MSBs instead.
+ return (bucket_id.toKey() >> (64 - spi::BucketLimits::MinUsedBits));
+}
+
+}
diff --git a/storage/src/vespa/storage/storageserver/rpc/storage_api_rpc_service.cpp b/storage/src/vespa/storage/storageserver/rpc/storage_api_rpc_service.cpp
index c465315a5a6..4a5bbfec8c4 100644
--- a/storage/src/vespa/storage/storageserver/rpc/storage_api_rpc_service.cpp
+++ b/storage/src/vespa/storage/storageserver/rpc/storage_api_rpc_service.cpp
@@ -1,22 +1,23 @@
// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-#include "storage_api_rpc_service.h"
#include "caching_rpc_target_resolver.h"
#include "message_codec_provider.h"
-#include "shared_rpc_resources.h"
#include "rpc_envelope_proto.h"
+#include "shared_rpc_resources.h"
+#include "storage_api_rpc_service.h"
#include <vespa/fnet/frt/supervisor.h>
#include <vespa/fnet/frt/target.h>
#include <vespa/slobrok/sbmirror.h>
+#include <vespa/storage/common/bucket_utils.h>
#include <vespa/storage/storageserver/communicationmanager.h>
#include <vespa/storage/storageserver/message_dispatcher.h>
#include <vespa/storage/storageserver/rpcrequestwrapper.h>
#include <vespa/storageapi/mbusprot/protocolserialization7.h>
#include <vespa/storageapi/messageapi/storagecommand.h>
#include <vespa/vespalib/data/databuffer.h>
+#include <vespa/vespalib/trace/tracelevel.h>
#include <vespa/vespalib/util/compressor.h>
#include <vespa/vespalib/util/stringfmt.h>
-#include <vespa/vespalib/trace/tracelevel.h>
#include <cassert>
#include <vespa/log/log.h>
@@ -220,7 +221,8 @@ void StorageApiRpcService::send_rpc_v1_request(std::shared_ptr<api::StorageComma
cmd->getType().getName().c_str(), cmd->getAddress()->toString().c_str());
assert(cmd->getAddress() != nullptr);
- auto target = _target_resolver->resolve_rpc_target(*cmd->getAddress(), cmd->getBucketId().getId());
+ auto target = _target_resolver->resolve_rpc_target(*cmd->getAddress(),
+ get_super_bucket_key(cmd->getBucketId()));
if (!target) {
auto reply = cmd->makeReply();
reply->setResult(make_no_address_for_service_error(*cmd->getAddress()));