From 8b17820cc0367a3e35a951dabed21a9c2d3ab75e Mon Sep 17 00:00:00 2001 From: Håvard Pettersen Date: Tue, 18 Apr 2023 11:53:03 +0000 Subject: add create-if-non-existent flag for document put --- document/abi-spec.json | 6 ++- .../main/java/com/yahoo/document/DocumentPut.java | 10 +++++ documentapi/abi-spec.json | 6 ++- .../messagebus/protocol/PutDocumentMessage.java | 7 ++++ .../messagebus/protocol/RoutableFactories60.java | 9 +++++ .../protocol/test/Messages60TestCase.java | 26 ++++++++++++- .../messagebus/protocol/test/MessagesTestBase.java | 24 +++++++++++- documentapi/src/tests/messages/messages60test.cpp | 42 +++++++++++++++++++-- documentapi/src/tests/messages/testbase.cpp | 24 ++++++++++-- documentapi/src/tests/messages/testbase.h | 9 ++++- .../messagebus/messages/putdocumentmessage.h | 5 ++- .../documentapi/messagebus/routablefactories60.cpp | 12 +++++- documentapi/test/crosslanguagefiles/.gitattributes | 1 + .../6.221-cpp-PutDocumentMessage-create-pad.dat | Bin 0 -> 56 bytes ....221-cpp-PutDocumentMessage-create-truncate.dat | Bin 0 -> 54 bytes .../6.221-cpp-PutDocumentMessage-create.dat | Bin 0 -> 55 bytes .../6.221-cpp-PutDocumentMessage.dat | Bin 80 -> 81 bytes .../6.221-java-PutDocumentMessage-create-pad.dat | Bin 0 -> 56 bytes ...221-java-PutDocumentMessage-create-truncate.dat | Bin 0 -> 54 bytes .../6.221-java-PutDocumentMessage-create.dat | Bin 0 -> 55 bytes .../6.221-java-PutDocumentMessage.dat | Bin 80 -> 81 bytes 21 files changed, 165 insertions(+), 16 deletions(-) create mode 100644 documentapi/test/crosslanguagefiles/.gitattributes create mode 100644 documentapi/test/crosslanguagefiles/6.221-cpp-PutDocumentMessage-create-pad.dat create mode 100644 documentapi/test/crosslanguagefiles/6.221-cpp-PutDocumentMessage-create-truncate.dat create mode 100644 documentapi/test/crosslanguagefiles/6.221-cpp-PutDocumentMessage-create.dat create mode 100644 documentapi/test/crosslanguagefiles/6.221-java-PutDocumentMessage-create-pad.dat create mode 100644 documentapi/test/crosslanguagefiles/6.221-java-PutDocumentMessage-create-truncate.dat create mode 100644 documentapi/test/crosslanguagefiles/6.221-java-PutDocumentMessage-create.dat diff --git a/document/abi-spec.json b/document/abi-spec.json index 5f520f1a4d1..f3ed7c389a1 100644 --- a/document/abi-spec.json +++ b/document/abi-spec.json @@ -387,7 +387,9 @@ "public void (com.yahoo.document.DocumentPut, com.yahoo.document.Document)", "public boolean equals(java.lang.Object)", "public int hashCode()", - "public java.lang.String toString()" + "public java.lang.String toString()", + "public void setCreateIfNonExistent(boolean)", + "public boolean getCreateIfNonExistent()" ], "fields" : [ ] }, @@ -3549,4 +3551,4 @@ "protected com.yahoo.document.update.ValueUpdate$ValueUpdateClassID valueUpdateClassID" ] } -} \ No newline at end of file +} diff --git a/document/src/main/java/com/yahoo/document/DocumentPut.java b/document/src/main/java/com/yahoo/document/DocumentPut.java index bfadaa8d4da..a421d5b96d4 100644 --- a/document/src/main/java/com/yahoo/document/DocumentPut.java +++ b/document/src/main/java/com/yahoo/document/DocumentPut.java @@ -9,6 +9,7 @@ import java.util.Objects; public class DocumentPut extends DocumentOperation { private final Document document; + private boolean createIfNonExistent; public DocumentPut(Document document) { this.document = document; @@ -38,6 +39,7 @@ public class DocumentPut extends DocumentOperation { public DocumentPut(DocumentPut other) { super(other); this.document = new Document(other.getDocument()); + createIfNonExistent = other.createIfNonExistent; } /** @@ -46,6 +48,7 @@ public class DocumentPut extends DocumentOperation { public DocumentPut(DocumentPut other, Document newDocument) { super(other); this.document = newDocument; + createIfNonExistent = other.createIfNonExistent; } @Override @@ -54,6 +57,7 @@ public class DocumentPut extends DocumentOperation { if (o == null || getClass() != o.getClass()) return false; DocumentPut that = (DocumentPut) o; return document.equals(that.document) && + (createIfNonExistent == that.createIfNonExistent) && Objects.equals(getCondition(), that.getCondition()); } @@ -67,4 +71,10 @@ public class DocumentPut extends DocumentOperation { return "put of document " + getId(); } + public void setCreateIfNonExistent(boolean value) { + createIfNonExistent = value; + } + public boolean getCreateIfNonExistent() { + return createIfNonExistent; + } } diff --git a/documentapi/abi-spec.json b/documentapi/abi-spec.json index 37b8eb6a75d..dbea284e39e 100644 --- a/documentapi/abi-spec.json +++ b/documentapi/abi-spec.json @@ -2458,7 +2458,9 @@ "public long getSequenceId()", "public int getType()", "public com.yahoo.document.TestAndSetCondition getCondition()", - "public void setCondition(com.yahoo.document.TestAndSetCondition)" + "public void setCondition(com.yahoo.document.TestAndSetCondition)", + "public boolean getCreateIfNonExistent()", + "public void setCreateIfNonExistent(boolean)" ], "fields" : [ ] }, @@ -3291,4 +3293,4 @@ ], "fields" : [ ] } -} \ No newline at end of file +} diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/PutDocumentMessage.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/PutDocumentMessage.java index 4482e5bfc47..585b24550e3 100755 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/PutDocumentMessage.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/PutDocumentMessage.java @@ -129,4 +129,11 @@ public class PutDocumentMessage extends TestAndSetMessage { put.setCondition(condition); } + public void setCreateIfNonExistent(boolean value) { + put.setCreateIfNonExistent(value); + } + public boolean getCreateIfNonExistent() { + deserialize(); + return put.getCreateIfNonExistent(); + } } diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/RoutableFactories60.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/RoutableFactories60.java index 099839672a2..9812f214066 100644 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/RoutableFactories60.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/RoutableFactories60.java @@ -607,6 +607,10 @@ public abstract class RoutableFactories60 { msg.setDocumentPut(new DocumentPut(Document.createDocument(buf))); msg.setTimestamp(buf.getLong(null)); decodeTasCondition(msg, buf); + if (buf.getBuf().hasRemaining()) { + byte value = buf.getBuf().get(); + msg.setCreateIfNonExistent(value != 0); + } } @Override @@ -627,6 +631,11 @@ public abstract class RoutableFactories60 { msg.getDocumentPut().getDocument().serialize(buf); buf.putLong(null, msg.getTimestamp()); encodeTasCondition(buf, (TestAndSetMessage) obj); + if (msg.getCreateIfNonExistent()) { + buf.getBuf().put((byte)1); + } else { + buf.getBuf().put((byte)0); + } } return true; } diff --git a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/Messages60TestCase.java b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/Messages60TestCase.java index 35f8e7cf0c8..97cef53695a 100644 --- a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/Messages60TestCase.java +++ b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/Messages60TestCase.java @@ -597,6 +597,26 @@ public class Messages60TestCase extends MessagesTestBase { public class testPutDocumentMessage implements RunnableTest { + void verifyCreateIfNonExistentFlag() { + var msg = new PutDocumentMessage(new DocumentPut(new Document(protocol.getDocumentTypeManager().getDocumentType("testdoc"), "id:ns:testdoc::"))); + msg.setCreateIfNonExistent(true); + int size_of_create_if_non_existent_flag = 1; + int expected_serialized_size = BASE_MESSAGE_LENGTH + 45 + serializedLength(msg.getCondition().getSelection()) + size_of_create_if_non_existent_flag; + assertEquals(expected_serialized_size, serialize("PutDocumentMessage-create", msg)); + assertEquals(expected_serialized_size - 1, serialize("PutDocumentMessage-create-truncate", msg, data -> DataTamper.truncate(data, 1))); + assertEquals(expected_serialized_size + 1, serialize("PutDocumentMessage-create-pad", msg, data -> DataTamper.pad(data, 1))); + for (Language lang: LANGUAGES) { + var decoded = (PutDocumentMessage)deserialize("PutDocumentMessage-create", DocumentProtocol.MESSAGE_PUTDOCUMENT, lang); + var decoded_trunc = (PutDocumentMessage)deserialize("PutDocumentMessage-create-truncate", DocumentProtocol.MESSAGE_PUTDOCUMENT, lang); + var decoded_pad = (PutDocumentMessage)deserialize("PutDocumentMessage-create-pad", DocumentProtocol.MESSAGE_PUTDOCUMENT, lang); + assertEquals(true, decoded.getCreateIfNonExistent()); + assertEquals(false, decoded_trunc.getCreateIfNonExistent()); + assertEquals(true, decoded_pad.getCreateIfNonExistent()); + assertTrue(decoded.getDocumentPut().equals(decoded_pad.getDocumentPut())); + assertFalse(decoded.getDocumentPut().equals(decoded_trunc.getDocumentPut())); + } + } + @Override public void run() { PutDocumentMessage msg = new PutDocumentMessage(new DocumentPut(new Document(protocol.getDocumentTypeManager().getDocumentType("testdoc"), "id:ns:testdoc::"))); @@ -604,7 +624,9 @@ public class Messages60TestCase extends MessagesTestBase { msg.setTimestamp(666); msg.setCondition(new TestAndSetCondition(CONDITION_STRING)); - assertEquals(BASE_MESSAGE_LENGTH + 45 + serializedLength(msg.getCondition().getSelection()), serialize("PutDocumentMessage", msg)); + int size_of_create_if_non_existent_flag = 1; + int expected_serialized_size = BASE_MESSAGE_LENGTH + 45 + serializedLength(msg.getCondition().getSelection()) + size_of_create_if_non_existent_flag; + assertEquals(expected_serialized_size, serialize("PutDocumentMessage", msg)); for (Language lang : LANGUAGES) { final PutDocumentMessage deserializedMsg = (PutDocumentMessage)deserialize("PutDocumentMessage", DocumentProtocol.MESSAGE_PUTDOCUMENT, lang); @@ -612,7 +634,9 @@ public class Messages60TestCase extends MessagesTestBase { assertEquals(msg.getDocumentPut().getDocument().getId().toString(), deserializedMsg.getDocumentPut().getDocument().getId().toString()); assertEquals(msg.getTimestamp(), deserializedMsg.getTimestamp()); assertEquals(msg.getCondition().getSelection(), deserializedMsg.getCondition().getSelection()); + assertEquals(false, deserializedMsg.getCreateIfNonExistent()); } + verifyCreateIfNonExistentFlag(); } } diff --git a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/MessagesTestBase.java b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/MessagesTestBase.java index f43449646be..f0fded23d82 100755 --- a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/MessagesTestBase.java +++ b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/MessagesTestBase.java @@ -94,17 +94,36 @@ public abstract class MessagesTestBase { return Arrays.equals(existingData, dataToWrite); } + public interface DataTamper { + byte[] tamperWith(byte[] data); + static byte[] truncate(byte[] data, int bytes) { + int newLength = data.length - bytes; + assertTrue(newLength > 0); + byte[] res = new byte[newLength]; + System.arraycopy(data, 0, res, 0, newLength); + return res; + } + static byte[] pad(byte[] data, int bytes) { + int newLength = data.length + bytes; + byte[] res = new byte[newLength]; + System.arraycopy(data, 0, res, 0, data.length); + return res; + } + } + /** * Writes the content of the given routable to the given file. * * @param filename The name of the file to write to. * @param routable The routable to serialize. + * @param tamper allows tampering with serialized data * @return The size of the written file. */ - public int serialize(String filename, Routable routable) { + public int serialize(String filename, Routable routable, DataTamper tamper) { Version version = version(); String path = getPath(version + "-java-" + filename + ".dat"); byte[] data = protocol.encode(version, routable); + data = tamper.tamperWith(data); assertNotNull(data); assertTrue(data.length > 0); try { @@ -122,6 +141,9 @@ public abstract class MessagesTestBase { assertEquals(routable.getType(), protocol.decode(version, data).getType()); return data.length; } + public int serialize(String filename, Routable routable) { + return serialize(filename, routable, data -> data); + } /** * Reads the content of the given file and creates a corresponding routable. diff --git a/documentapi/src/tests/messages/messages60test.cpp b/documentapi/src/tests/messages/messages60test.cpp index 258e8821e0c..93c7b5ef7cb 100644 --- a/documentapi/src/tests/messages/messages60test.cpp +++ b/documentapi/src/tests/messages/messages60test.cpp @@ -15,6 +15,17 @@ using document::DataType; using document::DocumentTypeRepo; +template +struct Unwrap { + mbus::Routable::UP value; + const T *ptr = nullptr; + explicit Unwrap(mbus::Routable::UP value_in) : value(std::move(value_in)) { + ptr = dynamic_cast(value.get()); + ASSERT_TRUE(ptr != nullptr); + } + const T *operator->() const noexcept { return ptr; } +}; + /////////////////////////////////////////////////////////////////////////////// // // Setup @@ -399,10 +410,12 @@ Messages60Test::testPutDocumentMessage() EXPECT_EQUAL(sizeof(vespalib::string), sizeof(TestAndSetCondition)); EXPECT_EQUAL(112u, sizeof(DocumentMessage)); EXPECT_EQUAL(sizeof(TestAndSetCondition) + sizeof(DocumentMessage), sizeof(TestAndSetMessage)); - EXPECT_EQUAL(sizeof(TestAndSetMessage) + 24, sizeof(PutDocumentMessage)); + EXPECT_EQUAL(sizeof(TestAndSetMessage) + 32, sizeof(PutDocumentMessage)); + int size_of_create_if_non_existent_flag = 1; EXPECT_EQUAL(MESSAGE_BASE_LENGTH + 45u + - serializedLength(msg.getCondition().getSelection()), + serializedLength(msg.getCondition().getSelection()) + + size_of_create_if_non_existent_flag, serialize("PutDocumentMessage", msg)); for (uint32_t lang = 0; lang < NUM_LANGUAGES; ++lang) { @@ -413,11 +426,34 @@ Messages60Test::testPutDocumentMessage() EXPECT_EQUAL(msg.getDocument().getType().getName(), deserializedMsg.getDocument().getType().getName()); EXPECT_EQUAL(msg.getDocument().getId().toString(), deserializedMsg.getDocument().getId().toString()); EXPECT_EQUAL(msg.getTimestamp(), deserializedMsg.getTimestamp()); - EXPECT_EQUAL(71u, deserializedMsg.getApproxSize()); + EXPECT_EQUAL(72u, deserializedMsg.getApproxSize()); EXPECT_EQUAL(msg.getCondition().getSelection(), deserializedMsg.getCondition().getSelection()); + EXPECT_EQUAL(false, deserializedMsg.get_create_if_non_existent()); } } + //------------------------------------------------------------------------- + + PutDocumentMessage msg2(createDoc(getTypeRepo(), "testdoc", "id:ns:testdoc::")); + msg2.set_create_if_non_existent(true); + uint32_t expected_message_size = MESSAGE_BASE_LENGTH + 45u + + serializedLength(msg2.getCondition().getSelection()) + + size_of_create_if_non_existent_flag; + auto trunc1 = [](mbus::Blob x) noexcept { return truncate(std::move(x), 1); }; + auto pad1 = [](mbus::Blob x) noexcept { return pad(std::move(x), 1); }; + EXPECT_EQUAL(expected_message_size, serialize("PutDocumentMessage-create", msg2)); + EXPECT_EQUAL(expected_message_size - 1, serialize("PutDocumentMessage-create-truncate", msg2, trunc1)); + EXPECT_EQUAL(expected_message_size + 1, serialize("PutDocumentMessage-create-pad", msg2, pad1)); + + for (uint32_t lang = 0; lang < NUM_LANGUAGES; ++lang) { + auto decoded = Unwrap(deserialize("PutDocumentMessage-create", DocumentProtocol::MESSAGE_PUTDOCUMENT, lang)); + auto decoded_trunc = Unwrap(deserialize("PutDocumentMessage-create-truncate", DocumentProtocol::MESSAGE_PUTDOCUMENT, lang)); + auto decoded_pad = Unwrap(deserialize("PutDocumentMessage-create-pad", DocumentProtocol::MESSAGE_PUTDOCUMENT, lang)); + EXPECT_EQUAL(true, decoded->get_create_if_non_existent()); + EXPECT_EQUAL(false, decoded_trunc->get_create_if_non_existent()); + EXPECT_EQUAL(true, decoded_pad->get_create_if_non_existent()); + } + return true; } diff --git a/documentapi/src/tests/messages/testbase.cpp b/documentapi/src/tests/messages/testbase.cpp index db2c08704e1..ddce9f82a5d 100644 --- a/documentapi/src/tests/messages/testbase.cpp +++ b/documentapi/src/tests/messages/testbase.cpp @@ -76,6 +76,24 @@ TestBase::putTest(uint32_t type, TEST_METHOD_PT test) return *this; } +mbus::Blob +TestBase::truncate(mbus::Blob data, size_t bytes) +{ + ASSERT_GREATER(data.size(), bytes); + mbus::Blob res(data.size() - bytes); + memcpy(res.data(), data.data(), res.size()); + return res; +} + +mbus::Blob +TestBase::pad(mbus::Blob data, size_t bytes) +{ + mbus::Blob res(data.size() + bytes); + memset(res.data(), 0, res.size()); + memcpy(res.data(), data.data(), data.size()); + return res; +} + bool TestBase::testCoverage(const std::vector &expected, const std::vector &actual, bool report) const { @@ -119,13 +137,13 @@ bool TestBase::file_content_is_unchanged(const string& filename, const mbus::Blo } uint32_t -TestBase::serialize(const string &filename, const mbus::Routable &routable) +TestBase::serialize(const string &filename, const mbus::Routable &routable, Tamper tamper) { const vespalib::Version version = getVersion(); string path = getPath(version.toString() + "-cpp-" + filename + ".dat"); LOG(info, "Serializing to '%s'..", path.c_str()); - mbus::Blob blob = _protocol.encode(version, routable); + mbus::Blob blob = tamper(_protocol.encode(version, routable)); if (file_content_is_unchanged(path, blob)) { LOG(info, "Serialization for '%s' is unchanged; not overwriting it", path.c_str()); } else if (!EXPECT_TRUE(writeFile(path, blob))) { @@ -213,5 +231,3 @@ TestBase::readFile(const string &filename) const return blob; } - - diff --git a/documentapi/src/tests/messages/testbase.h b/documentapi/src/tests/messages/testbase.h index bf384fc2fb9..a2cd5ee5649 100644 --- a/documentapi/src/tests/messages/testbase.h +++ b/documentapi/src/tests/messages/testbase.h @@ -43,13 +43,20 @@ protected: int Main() override; public: + using Tamper = std::function; + static mbus::Blob truncate(mbus::Blob data, size_t bytes); + static mbus::Blob pad(mbus::Blob data, size_t bytes); + const document::DocumentTypeRepo &getTypeRepo() { return *_repo; } std::shared_ptr &getTypeRepoSp() { return _repo; } bool testCoverage(const std::vector &expected, const std::vector &actual, bool report = false) const; bool writeFile(const string &filename, const mbus::Blob& blob) const; mbus::Blob readFile(const string &filename) const; - uint32_t serialize(const string &filename, const mbus::Routable &routable); + uint32_t serialize(const string &filename, const mbus::Routable &routable, Tamper tamper); + uint32_t serialize(const string &filename, const mbus::Routable &routable) { + return serialize(filename, routable, [](auto x)noexcept{ return x; }); + } mbus::Routable::UP deserialize(const string &filename, uint32_t classId, uint32_t lang); void dump(const mbus::Blob &blob) const; diff --git a/documentapi/src/vespa/documentapi/messagebus/messages/putdocumentmessage.h b/documentapi/src/vespa/documentapi/messagebus/messages/putdocumentmessage.h index 5a7f8acb60a..018aea69a71 100644 --- a/documentapi/src/vespa/documentapi/messagebus/messages/putdocumentmessage.h +++ b/documentapi/src/vespa/documentapi/messagebus/messages/putdocumentmessage.h @@ -11,6 +11,7 @@ private: using DocumentSP = std::shared_ptr; DocumentSP _document; uint64_t _time; + bool _create_if_non_existent = false; protected: DocumentReply::UP doCreateReply() const override; @@ -65,7 +66,9 @@ public: uint64_t getSequenceId() const override; uint32_t getType() const override; string toString() const override { return "putdocumentmessage"; } + + void set_create_if_non_existent(bool value) { _create_if_non_existent = value; } + bool get_create_if_non_existent() const { return _create_if_non_existent; } }; } - diff --git a/documentapi/src/vespa/documentapi/messagebus/routablefactories60.cpp b/documentapi/src/vespa/documentapi/messagebus/routablefactories60.cpp index 0757db9f5fc..1dce7ff281f 100644 --- a/documentapi/src/vespa/documentapi/messagebus/routablefactories60.cpp +++ b/documentapi/src/vespa/documentapi/messagebus/routablefactories60.cpp @@ -532,6 +532,11 @@ RoutableFactories60::PutDocumentMessageFactory::decodeInto(PutDocumentMessage & msg.setDocument(decodeDocument(_repo, buf)); msg.setTimestamp(static_cast(decodeLong(buf))); decodeTasCondition(msg, buf); + if (buf.getRemaining() > 0) { + uint8_t value = 0; + buf.getByte(value); + msg.set_create_if_non_existent(value != 0); + } } bool @@ -544,7 +549,12 @@ RoutableFactories60::PutDocumentMessageFactory::doEncode(const DocumentMessage & buf.putBytes(stream.peek(), stream.size()); buf.putLong(static_cast(msg.getTimestamp())); encodeTasCondition(buf, msg); - + if (msg.get_create_if_non_existent()) { + buf.putByte(1); + } else { + buf.putByte(0); + } + return true; } diff --git a/documentapi/test/crosslanguagefiles/.gitattributes b/documentapi/test/crosslanguagefiles/.gitattributes new file mode 100644 index 00000000000..8697fef7d46 --- /dev/null +++ b/documentapi/test/crosslanguagefiles/.gitattributes @@ -0,0 +1 @@ +*.dat binary diff --git a/documentapi/test/crosslanguagefiles/6.221-cpp-PutDocumentMessage-create-pad.dat b/documentapi/test/crosslanguagefiles/6.221-cpp-PutDocumentMessage-create-pad.dat new file mode 100644 index 00000000000..bbe9bede8d6 Binary files /dev/null and b/documentapi/test/crosslanguagefiles/6.221-cpp-PutDocumentMessage-create-pad.dat differ diff --git a/documentapi/test/crosslanguagefiles/6.221-cpp-PutDocumentMessage-create-truncate.dat b/documentapi/test/crosslanguagefiles/6.221-cpp-PutDocumentMessage-create-truncate.dat new file mode 100644 index 00000000000..344d0a4b58c Binary files /dev/null and b/documentapi/test/crosslanguagefiles/6.221-cpp-PutDocumentMessage-create-truncate.dat differ diff --git a/documentapi/test/crosslanguagefiles/6.221-cpp-PutDocumentMessage-create.dat b/documentapi/test/crosslanguagefiles/6.221-cpp-PutDocumentMessage-create.dat new file mode 100644 index 00000000000..7f7c55b2b88 Binary files /dev/null and b/documentapi/test/crosslanguagefiles/6.221-cpp-PutDocumentMessage-create.dat differ diff --git a/documentapi/test/crosslanguagefiles/6.221-cpp-PutDocumentMessage.dat b/documentapi/test/crosslanguagefiles/6.221-cpp-PutDocumentMessage.dat index 706a002c8c9..93f85f7e419 100644 Binary files a/documentapi/test/crosslanguagefiles/6.221-cpp-PutDocumentMessage.dat and b/documentapi/test/crosslanguagefiles/6.221-cpp-PutDocumentMessage.dat differ diff --git a/documentapi/test/crosslanguagefiles/6.221-java-PutDocumentMessage-create-pad.dat b/documentapi/test/crosslanguagefiles/6.221-java-PutDocumentMessage-create-pad.dat new file mode 100644 index 00000000000..bbe9bede8d6 Binary files /dev/null and b/documentapi/test/crosslanguagefiles/6.221-java-PutDocumentMessage-create-pad.dat differ diff --git a/documentapi/test/crosslanguagefiles/6.221-java-PutDocumentMessage-create-truncate.dat b/documentapi/test/crosslanguagefiles/6.221-java-PutDocumentMessage-create-truncate.dat new file mode 100644 index 00000000000..344d0a4b58c Binary files /dev/null and b/documentapi/test/crosslanguagefiles/6.221-java-PutDocumentMessage-create-truncate.dat differ diff --git a/documentapi/test/crosslanguagefiles/6.221-java-PutDocumentMessage-create.dat b/documentapi/test/crosslanguagefiles/6.221-java-PutDocumentMessage-create.dat new file mode 100644 index 00000000000..7f7c55b2b88 Binary files /dev/null and b/documentapi/test/crosslanguagefiles/6.221-java-PutDocumentMessage-create.dat differ diff --git a/documentapi/test/crosslanguagefiles/6.221-java-PutDocumentMessage.dat b/documentapi/test/crosslanguagefiles/6.221-java-PutDocumentMessage.dat index 706a002c8c9..93f85f7e419 100644 Binary files a/documentapi/test/crosslanguagefiles/6.221-java-PutDocumentMessage.dat and b/documentapi/test/crosslanguagefiles/6.221-java-PutDocumentMessage.dat differ -- cgit v1.2.3 From 021caaf5074b7f2d561c15068e3f2d52ca0e36f2 Mon Sep 17 00:00:00 2001 From: Håvard Pettersen Date: Wed, 19 Apr 2023 12:19:18 +0000 Subject: add requested annotations --- document/src/main/java/com/yahoo/document/DocumentPut.java | 4 ++++ .../com/yahoo/documentapi/messagebus/protocol/PutDocumentMessage.java | 4 ++++ .../yahoo/documentapi/messagebus/protocol/test/MessagesTestBase.java | 1 + .../src/vespa/documentapi/messagebus/messages/putdocumentmessage.h | 4 ++-- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/document/src/main/java/com/yahoo/document/DocumentPut.java b/document/src/main/java/com/yahoo/document/DocumentPut.java index a421d5b96d4..f91ef9a9ee2 100644 --- a/document/src/main/java/com/yahoo/document/DocumentPut.java +++ b/document/src/main/java/com/yahoo/document/DocumentPut.java @@ -2,6 +2,7 @@ package com.yahoo.document; import java.util.Objects; +import com.yahoo.api.annotations.Beta; /** * @author Vegard Sjonfjell @@ -71,9 +72,12 @@ public class DocumentPut extends DocumentOperation { return "put of document " + getId(); } + @Beta public void setCreateIfNonExistent(boolean value) { createIfNonExistent = value; } + + @Beta public boolean getCreateIfNonExistent() { return createIfNonExistent; } diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/PutDocumentMessage.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/PutDocumentMessage.java index 585b24550e3..3e04b2ab669 100755 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/PutDocumentMessage.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/PutDocumentMessage.java @@ -1,6 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.documentapi.messagebus.protocol; +import com.yahoo.api.annotations.Beta; import com.yahoo.document.DocumentPut; import com.yahoo.document.TestAndSetCondition; import com.yahoo.document.serialization.DocumentDeserializer; @@ -129,9 +130,12 @@ public class PutDocumentMessage extends TestAndSetMessage { put.setCondition(condition); } + @Beta public void setCreateIfNonExistent(boolean value) { put.setCreateIfNonExistent(value); } + + @Beta public boolean getCreateIfNonExistent() { deserialize(); return put.getCreateIfNonExistent(); diff --git a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/MessagesTestBase.java b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/MessagesTestBase.java index f0fded23d82..71cae9d136a 100755 --- a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/MessagesTestBase.java +++ b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/MessagesTestBase.java @@ -94,6 +94,7 @@ public abstract class MessagesTestBase { return Arrays.equals(existingData, dataToWrite); } + @FunctionalInterface public interface DataTamper { byte[] tamperWith(byte[] data); static byte[] truncate(byte[] data, int bytes) { diff --git a/documentapi/src/vespa/documentapi/messagebus/messages/putdocumentmessage.h b/documentapi/src/vespa/documentapi/messagebus/messages/putdocumentmessage.h index 018aea69a71..a1fabd38c3c 100644 --- a/documentapi/src/vespa/documentapi/messagebus/messages/putdocumentmessage.h +++ b/documentapi/src/vespa/documentapi/messagebus/messages/putdocumentmessage.h @@ -67,8 +67,8 @@ public: uint32_t getType() const override; string toString() const override { return "putdocumentmessage"; } - void set_create_if_non_existent(bool value) { _create_if_non_existent = value; } - bool get_create_if_non_existent() const { return _create_if_non_existent; } + void set_create_if_non_existent(bool value) noexcept { _create_if_non_existent = value; } + bool get_create_if_non_existent() const noexcept { return _create_if_non_existent; } }; } -- cgit v1.2.3