diff options
author | Geir Storli <geirst@verizonmedia.com> | 2020-12-02 19:35:04 +0000 |
---|---|---|
committer | Geir Storli <geirst@verizonmedia.com> | 2020-12-04 11:00:47 +0000 |
commit | 4cacb47cb45ca45309ac77c83695da48bfa8eb06 (patch) | |
tree | d66ae75651cc1f3efe1c072a36f56800001bba4d /storage | |
parent | 2f1937241896f37dc32434ad18e316cb6913755a (diff) |
Use the super bucket key when resolving which RPC target to use to handle a command.
Diffstat (limited to 'storage')
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())); |