aboutsummaryrefslogtreecommitdiffstats
path: root/storageapi
diff options
context:
space:
mode:
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;
};
}