summaryrefslogtreecommitdiffstats
path: root/document
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2021-05-06 09:57:33 +0000
committerHåvard Pettersen <havardpe@oath.com>2021-05-06 09:57:33 +0000
commit47a3665fad189ab23397541075b15ba4dcde88aa (patch)
treea19b0a0ba94dc4f3c1f96d3632f520dbba916ddf /document
parent580fdf55b7bbb24093f21500438c58c718c564e4 (diff)
avoid read/write conflict by doing atomic move
Diffstat (limited to 'document')
-rw-r--r--document/src/test/java/com/yahoo/document/serialization/SerializationTestUtils.java7
-rw-r--r--document/src/test/resources/.gitattributes2
-rw-r--r--document/src/test/resources/reference/reference_with_id__cppbin84 -> 83 bytes
-rw-r--r--document/src/tests/serialization/vespadocumentserializer_test.cpp13
4 files changed, 17 insertions, 5 deletions
diff --git a/document/src/test/java/com/yahoo/document/serialization/SerializationTestUtils.java b/document/src/test/java/com/yahoo/document/serialization/SerializationTestUtils.java
index 25021b0d2f8..951ee802e58 100644
--- a/document/src/test/java/com/yahoo/document/serialization/SerializationTestUtils.java
+++ b/document/src/test/java/com/yahoo/document/serialization/SerializationTestUtils.java
@@ -12,6 +12,7 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
+import java.nio.file.StandardCopyOption;
import static org.junit.Assert.assertEquals;
@@ -50,8 +51,10 @@ public class SerializationTestUtils {
public static void assertSerializationMatchesCpp(String binaryFilesFolder, String fileName,
Document document, TestDocumentFactory factory) throws IOException {
byte[] buf = serializeDocument(document);
- Files.write(Paths.get(binaryFilesFolder, fileName + "__java"), buf,
- StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING);
+ Files.write(Paths.get(binaryFilesFolder, fileName + "__java.new"), buf,
+ StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING);
+ Files.move(Paths.get(binaryFilesFolder, fileName + "__java.new"),
+ Paths.get(binaryFilesFolder, fileName + "__java"), StandardCopyOption.ATOMIC_MOVE);
assertDeserializeFromFile(Paths.get(binaryFilesFolder, fileName + "__java"), document, factory);
assertDeserializeFromFile(Paths.get(binaryFilesFolder, fileName + "__cpp"), document, factory);
diff --git a/document/src/test/resources/.gitattributes b/document/src/test/resources/.gitattributes
new file mode 100644
index 00000000000..7ab6af7a4f4
--- /dev/null
+++ b/document/src/test/resources/.gitattributes
@@ -0,0 +1,2 @@
+*__cpp binary
+*__java binary
diff --git a/document/src/test/resources/reference/reference_with_id__cpp b/document/src/test/resources/reference/reference_with_id__cpp
index d2668f8a5b1..6e9158827d7 100644
--- a/document/src/test/resources/reference/reference_with_id__cpp
+++ b/document/src/test/resources/reference/reference_with_id__cpp
Binary files differ
diff --git a/document/src/tests/serialization/vespadocumentserializer_test.cpp b/document/src/tests/serialization/vespadocumentserializer_test.cpp
index 0c9dfaf2e56..60ec692e078 100644
--- a/document/src/tests/serialization/vespadocumentserializer_test.cpp
+++ b/document/src/tests/serialization/vespadocumentserializer_test.cpp
@@ -713,7 +713,9 @@ void checkDeserialization(const string &name, std::unique_ptr<Slime> slime) {
const string data_dir = TEST_PATH("../../test/resources/predicates/");
PredicateFieldValue value(std::move(slime));
- serializeToFile(value, data_dir + name + "__cpp");
+ serializeToFile(value, data_dir + name + "__cpp.new");
+ vespalib::rename(data_dir + name + "__cpp.new",
+ data_dir + name + "__cpp");
deserializeAndCheck(data_dir + name + "__cpp", value);
deserializeAndCheck(data_dir + name + "__java", value);
@@ -841,7 +843,10 @@ void checkDeserialization(const string &name, std::unique_ptr<vespalib::eval::Va
if (tensor) {
value = std::move(tensor);
}
- serializeToFile(value, data_dir + name + "__cpp");
+ serializeToFile(value, data_dir + name + "__cpp.new");
+ vespalib::rename(data_dir + name + "__cpp.new",
+ data_dir + name + "__cpp");
+
deserializeAndCheck(data_dir + name + "__cpp", value);
deserializeAndCheck(data_dir + name + "__java", value);
}
@@ -966,8 +971,10 @@ struct RefFixture {
const ReferenceFieldValue& value) {
const string data_dir = TEST_PATH("../../test/resources/reference/");
const string field_name = "ref_field";
- serializeToFile(value, data_dir + file_base_name + "__cpp",
+ serializeToFile(value, data_dir + file_base_name + "__cpp.new",
ref_doc_type, field_name);
+ vespalib::rename(data_dir + file_base_name + "__cpp.new",
+ data_dir + file_base_name + "__cpp");
deserializeAndCheck(data_dir + file_base_name + "__cpp",
value, fixed_repo, field_name);