diff options
author | Tor Brede Vekterli <vekterli@verizonmedia.com> | 2021-05-06 12:46:23 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-06 12:46:23 +0200 |
commit | a6b228efce2e141a607b621c97697159a64b3d86 (patch) | |
tree | f61fb29a7e73d18b2a8150c11ba681ec9fae2231 | |
parent | e2d48e052b32aa946501c82f184ef5e4d953df75 (diff) | |
parent | 47a3665fad189ab23397541075b15ba4dcde88aa (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.java | 7 | ||||
-rw-r--r-- | document/src/test/resources/.gitattributes | 2 | ||||
-rw-r--r-- | document/src/test/resources/reference/reference_with_id__cpp | bin | 84 -> 83 bytes | |||
-rw-r--r-- | document/src/tests/serialization/vespadocumentserializer_test.cpp | 13 |
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 Binary files differindex d2668f8a5b1..6e9158827d7 100644 --- a/document/src/test/resources/reference/reference_with_id__cpp +++ b/document/src/test/resources/reference/reference_with_id__cpp 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); |