summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@verizonmedia.com>2021-05-06 12:46:23 +0200
committerGitHub <noreply@github.com>2021-05-06 12:46:23 +0200
commita6b228efce2e141a607b621c97697159a64b3d86 (patch)
treef61fb29a7e73d18b2a8150c11ba681ec9fae2231
parente2d48e052b32aa946501c82f184ef5e4d953df75 (diff)
parent47a3665fad189ab23397541075b15ba4dcde88aa (diff)
Merge pull request #17759 from vespa-engine/havardpe/avoid-file-read-write-race
avoid read/write conflict by doing atomic move
-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);