diff options
author | Geir Storli <geirst@oath.com> | 2017-11-17 12:02:30 +0000 |
---|---|---|
committer | Geir Storli <geirst@oath.com> | 2017-11-17 12:27:49 +0000 |
commit | d8bb2c0e72e7aca945c8e852c0d23deb882950a8 (patch) | |
tree | b18ec9c100da6f216a6f7163ad7e00baeb920564 | |
parent | 7f1b100fe071c8a3a759a42008f7425730e9ef36 (diff) |
Add protocol serialization version with encoding and decoding of bucket space to almost all commands.
This version is not yet activated by default, only in unit tests.
7 files changed, 157 insertions, 7 deletions
diff --git a/storageapi/src/tests/mbusprot/storageprotocoltest.cpp b/storageapi/src/tests/mbusprot/storageprotocoltest.cpp index cb0cf756586..a04b0d71e96 100644 --- a/storageapi/src/tests/mbusprot/storageprotocoltest.cpp +++ b/storageapi/src/tests/mbusprot/storageprotocoltest.cpp @@ -46,6 +46,8 @@ struct StorageProtocolTest : public CppUnit::TestFixture { vespalib::Version _version5_0{5, 0, 12}; vespalib::Version _version5_1{5, 1, 0}; vespalib::Version _version5_2{5, 93, 30}; + // TODO: Set correct version when bucket space serialization is activated by default + vespalib::Version _version6_0{6, 999, 0}; documentapi::LoadTypeSet _loadTypes; mbusprot::StorageProtocol _protocol; static std::vector<std::string> _nonVerboseMessageStrings; @@ -58,7 +60,7 @@ struct StorageProtocolTest : public CppUnit::TestFixture { _testDoc(_docMan.createDocument()), _testDocId(_testDoc->getId()), _bucket(makeDocumentBucket(document::BucketId(16, 0x51))), - _protocol(_docMan.getTypeRepoSP(), _loadTypes) + _protocol(_docMan.getTypeRepoSP(), _loadTypes, true) { _loadTypes.addLoadType(34, "foo", documentapi::Priority::PRI_NORMAL_2); } @@ -102,6 +104,10 @@ struct StorageProtocolTest : public CppUnit::TestFixture { void testUpdateCommand52(); void testRemoveCommand52(); + void testPutCommandWithBucketSpace6_0(); + void testCreateVisitorWithBucketSpace6_0(); + void testRequestBucketInfoWithBucketSpace6_0(); + CPPUNIT_TEST_SUITE(StorageProtocolTest); // Enable to see string outputs of messages @@ -139,6 +145,11 @@ struct StorageProtocolTest : public CppUnit::TestFixture { CPPUNIT_TEST(testUpdateCommand52); CPPUNIT_TEST(testRemoveCommand52); + // 6.0 tests + CPPUNIT_TEST(testPutCommandWithBucketSpace6_0); + CPPUNIT_TEST(testCreateVisitorWithBucketSpace6_0); + CPPUNIT_TEST(testRequestBucketInfoWithBucketSpace6_0); + CPPUNIT_TEST_SUITE_END(); }; @@ -947,6 +958,44 @@ StorageProtocolTest::testRemoveCommand52() } void +StorageProtocolTest::testPutCommandWithBucketSpace6_0() +{ + ScopedName test("testPutCommandWithBucketSpace6_0"); + + document::Bucket bucket(document::BucketSpace(5), _bucket.getBucketId()); + auto cmd = std::make_shared<PutCommand>(bucket, _testDoc, 14); + + auto cmd2 = copyCommand(cmd, _version6_0); + CPPUNIT_ASSERT_EQUAL(bucket, cmd2->getBucket()); +} + +void +StorageProtocolTest::testCreateVisitorWithBucketSpace6_0() +{ + ScopedName test("testCreateVisitorWithBucketSpace6_0"); + + document::BucketSpace bucketSpace(5); + auto cmd = std::make_shared<CreateVisitorCommand>(bucketSpace, "library", "id", "doc selection"); + + auto cmd2 = copyCommand(cmd, _version6_0); + CPPUNIT_ASSERT_EQUAL(bucketSpace, cmd2->getBucketSpace()); +} + +void +StorageProtocolTest::testRequestBucketInfoWithBucketSpace6_0() +{ + ScopedName test("testRequestBucketInfoWithBucketSpace6_0"); + + document::BucketSpace bucketSpace(5); + std::vector<document::BucketId> ids = {document::BucketId(3)}; + auto cmd = std::make_shared<RequestBucketInfoCommand>(bucketSpace, ids); + + auto cmd2 = copyCommand(cmd, _version6_0); + CPPUNIT_ASSERT_EQUAL(bucketSpace, cmd2->getBucketSpace()); + CPPUNIT_ASSERT_EQUAL(ids, cmd2->getBuckets()); +} + +void StorageProtocolTest::testStringOutputs() { std::cerr << "\nNon verbose output:\n"; diff --git a/storageapi/src/vespa/storageapi/mbusprot/CMakeLists.txt b/storageapi/src/vespa/storageapi/mbusprot/CMakeLists.txt index c59dd83663d..d5952d7cb91 100644 --- a/storageapi/src/vespa/storageapi/mbusprot/CMakeLists.txt +++ b/storageapi/src/vespa/storageapi/mbusprot/CMakeLists.txt @@ -10,5 +10,6 @@ vespa_add_library(storageapi_mbusprot OBJECT protocolserialization5_0.cpp protocolserialization5_1.cpp protocolserialization5_2.cpp + protocolserialization6_0.cpp DEPENDS ) diff --git a/storageapi/src/vespa/storageapi/mbusprot/protocolserialization5_0.cpp b/storageapi/src/vespa/storageapi/mbusprot/protocolserialization5_0.cpp index d6d47d877e5..e5c8c490a53 100644 --- a/storageapi/src/vespa/storageapi/mbusprot/protocolserialization5_0.cpp +++ b/storageapi/src/vespa/storageapi/mbusprot/protocolserialization5_0.cpp @@ -23,6 +23,7 @@ void ProtocolSerialization5_0::putBucket(const document::Bucket& bucket, vespalib::GrowableByteBuffer& buf) const { buf.putLong(bucket.getBucketId().getRawId()); + assert(bucket.getBucketSpace() == document::BucketSpace::placeHolder()); } document::BucketSpace @@ -32,8 +33,9 @@ ProtocolSerialization5_0::getBucketSpace(document::ByteBuffer&) const } void -ProtocolSerialization5_0::putBucketSpace(document::BucketSpace, vespalib::GrowableByteBuffer&) const +ProtocolSerialization5_0::putBucketSpace(document::BucketSpace bucketSpace, vespalib::GrowableByteBuffer&) const { + assert(bucketSpace == document::BucketSpace::placeHolder()); } api::BucketInfo diff --git a/storageapi/src/vespa/storageapi/mbusprot/protocolserialization6_0.cpp b/storageapi/src/vespa/storageapi/mbusprot/protocolserialization6_0.cpp new file mode 100644 index 00000000000..7257b6bc284 --- /dev/null +++ b/storageapi/src/vespa/storageapi/mbusprot/protocolserialization6_0.cpp @@ -0,0 +1,43 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "protocolserialization6_0.h" +#include "serializationhelper.h" + +namespace storage { +namespace mbusprot { + +ProtocolSerialization6_0::ProtocolSerialization6_0(const document::DocumentTypeRepo::SP &repo, + const documentapi::LoadTypeSet &loadTypes) + : ProtocolSerialization5_2(repo, loadTypes) +{ +} + +document::Bucket +ProtocolSerialization6_0::getBucket(document::ByteBuffer &buf) const +{ + document::BucketSpace bucketSpace(SH::getLong(buf)); + document::BucketId bucketId(SH::getLong(buf)); + return document::Bucket(bucketSpace, bucketId); +} + +void +ProtocolSerialization6_0::putBucket(const document::Bucket &bucket, vespalib::GrowableByteBuffer &buf) const +{ + buf.putLong(bucket.getBucketSpace().getId()); + buf.putLong(bucket.getBucketId().getRawId()); +} + +document::BucketSpace +ProtocolSerialization6_0::getBucketSpace(document::ByteBuffer &buf) const +{ + return document::BucketSpace(SH::getLong(buf)); +} + +void +ProtocolSerialization6_0::putBucketSpace(document::BucketSpace bucketSpace, vespalib::GrowableByteBuffer &buf) const +{ + buf.putLong(bucketSpace.getId()); +} + +} +} diff --git a/storageapi/src/vespa/storageapi/mbusprot/protocolserialization6_0.h b/storageapi/src/vespa/storageapi/mbusprot/protocolserialization6_0.h new file mode 100644 index 00000000000..015ec33b32f --- /dev/null +++ b/storageapi/src/vespa/storageapi/mbusprot/protocolserialization6_0.h @@ -0,0 +1,29 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include "protocolserialization5_2.h" +#include <vespa/document/repo/documenttyperepo.h> +#include <vespa/documentapi/loadtypes/loadtypeset.h> + +namespace storage { +namespace mbusprot { + +/** + * Protocol serialization version adding decoding and encoding + * of bucket space to almost all commands. + */ +class ProtocolSerialization6_0 : public ProtocolSerialization5_2 +{ +public: + ProtocolSerialization6_0(const document::DocumentTypeRepo::SP &repo, + const documentapi::LoadTypeSet &loadTypes); + + document::Bucket getBucket(document::ByteBuffer &buf) const override; + void putBucket(const document::Bucket &bucket, vespalib::GrowableByteBuffer &buf) const override; + document::BucketSpace getBucketSpace(document::ByteBuffer &buf) const override; + void putBucketSpace(document::BucketSpace bucketSpace, vespalib::GrowableByteBuffer &buf) const override; +}; + +} +} diff --git a/storageapi/src/vespa/storageapi/mbusprot/storageprotocol.cpp b/storageapi/src/vespa/storageapi/mbusprot/storageprotocol.cpp index 70be64800ca..edc8ca6a3b6 100644 --- a/storageapi/src/vespa/storageapi/mbusprot/storageprotocol.cpp +++ b/storageapi/src/vespa/storageapi/mbusprot/storageprotocol.cpp @@ -15,10 +15,13 @@ namespace storage::mbusprot { mbus::string StorageProtocol::NAME = "StorageProtocol"; StorageProtocol::StorageProtocol(const document::DocumentTypeRepo::SP repo, - const documentapi::LoadTypeSet& loadTypes) + const documentapi::LoadTypeSet& loadTypes, + bool activateBucketSpaceSerialization) : _serializer5_0(repo, loadTypes), _serializer5_1(repo, loadTypes), - _serializer5_2(repo, loadTypes) + _serializer5_2(repo, loadTypes), + _serializer6_0(repo, loadTypes), + _activateBucketSpaceSerialization(activateBucketSpaceSerialization) { } @@ -31,6 +34,8 @@ StorageProtocol::createPolicy(const mbus::string&, const mbus::string&) const } namespace { + // TODO: Set correct version when bucket space serialization is activated by default + vespalib::Version version6_0(6, 999, 0); vespalib::Version version5_2(5, 93, 30); vespalib::Version version5_1(5, 1, 0); vespalib::Version version5_0(5, 0, 12); @@ -93,7 +98,15 @@ StorageProtocol::encode(const vespalib::Version& version, } else if (version < version5_2) { return encodeMessage(_serializer5_1, routable, message, version5_1, version); } else { - return encodeMessage(_serializer5_2, routable, message, version5_2, version); + if (!_activateBucketSpaceSerialization) { + return encodeMessage(_serializer5_2, routable, message, version5_2, version); + } else { + if (version < version6_0) { + return encodeMessage(_serializer5_2, routable, message, version5_2, version); + } else { + return encodeMessage(_serializer6_0, routable, message, version6_0, version); + } + } } } catch (std::exception & e) { @@ -156,7 +169,15 @@ StorageProtocol::decode(const vespalib::Version & version, } else if (version < version5_2) { return decodeMessage(_serializer5_1, data, type, version5_1, version); } else { - return decodeMessage(_serializer5_2, data, type, version5_2, version); + if (!_activateBucketSpaceSerialization) { + return decodeMessage(_serializer5_2, data, type, version5_2, version); + } else { + if (version < version6_0) { + return decodeMessage(_serializer5_2, data, type, version5_2, version); + } else { + return decodeMessage(_serializer6_0, data, type, version6_0, version); + } + } } } catch (std::exception & e) { std::ostringstream ost; diff --git a/storageapi/src/vespa/storageapi/mbusprot/storageprotocol.h b/storageapi/src/vespa/storageapi/mbusprot/storageprotocol.h index 10289adaf1a..437be5dcbe6 100644 --- a/storageapi/src/vespa/storageapi/mbusprot/storageprotocol.h +++ b/storageapi/src/vespa/storageapi/mbusprot/storageprotocol.h @@ -2,6 +2,7 @@ #pragma once #include "protocolserialization5_2.h" +#include "protocolserialization6_0.h" #include <vespa/messagebus/iprotocol.h> namespace storage::mbusprot { @@ -13,7 +14,9 @@ public: static mbus::string NAME; - StorageProtocol(const document::DocumentTypeRepo::SP, const documentapi::LoadTypeSet& loadTypes); + StorageProtocol(const document::DocumentTypeRepo::SP, + const documentapi::LoadTypeSet& loadTypes, + bool activateBucketSpaceSerialization = false); ~StorageProtocol(); const mbus::string& getName() const override { return NAME; } @@ -25,6 +28,8 @@ private: ProtocolSerialization5_0 _serializer5_0; ProtocolSerialization5_1 _serializer5_1; ProtocolSerialization5_2 _serializer5_2; + ProtocolSerialization6_0 _serializer6_0; + bool _activateBucketSpaceSerialization; }; } |