aboutsummaryrefslogtreecommitdiffstats
path: root/storageapi
diff options
context:
space:
mode:
authorGeir Storli <geirst@oath.com>2017-11-17 12:02:30 +0000
committerGeir Storli <geirst@oath.com>2017-11-17 12:27:49 +0000
commitd8bb2c0e72e7aca945c8e852c0d23deb882950a8 (patch)
treeb18ec9c100da6f216a6f7163ad7e00baeb920564 /storageapi
parent7f1b100fe071c8a3a759a42008f7425730e9ef36 (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.
Diffstat (limited to 'storageapi')
-rw-r--r--storageapi/src/tests/mbusprot/storageprotocoltest.cpp51
-rw-r--r--storageapi/src/vespa/storageapi/mbusprot/CMakeLists.txt1
-rw-r--r--storageapi/src/vespa/storageapi/mbusprot/protocolserialization5_0.cpp4
-rw-r--r--storageapi/src/vespa/storageapi/mbusprot/protocolserialization6_0.cpp43
-rw-r--r--storageapi/src/vespa/storageapi/mbusprot/protocolserialization6_0.h29
-rw-r--r--storageapi/src/vespa/storageapi/mbusprot/storageprotocol.cpp29
-rw-r--r--storageapi/src/vespa/storageapi/mbusprot/storageprotocol.h7
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;
};
}