Author: catholicon
Date: Tue Sep 12 22:56:22 2017
New Revision: 1808187
URL: http://svn.apache.org/viewvc?rev=1808187&view=rev
Log:
OAK-6562: OakDirectory should recreate file node upon create
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/OakDirectory.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/OakDirectoryTest.java
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/OakDirectory.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/OakDirectory.java?rev=1808187&r1=1808186&r2=1808187&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/OakDirectory.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/OakDirectory.java
Tue Sep 12 22:56:22 2017
@@ -175,16 +175,20 @@ public class OakDirectory extends Direct
throws IOException {
checkArgument(!readOnly, "Read only directory");
NodeBuilder file;
- if (!directoryBuilder.hasChildNode(name)) {
- file = directoryBuilder.child(name);
- byte[] uniqueKey = new byte[UNIQUE_KEY_SIZE];
- secureRandom.nextBytes(uniqueKey);
- String key = StringUtils.convertBytesToHex(uniqueKey);
- file.setProperty(PROP_UNIQUE_KEY, key);
- file.setProperty(PROP_BLOB_SIZE, definition.getBlobSize());
- } else {
- file = directoryBuilder.child(name);
+
+ // OAK-6562: Learn from FSDirectory and delete existing file
+ // on creating output
+ if (directoryBuilder.hasChildNode(name)) {
+ directoryBuilder.getChildNode(name).remove();
}
+
+ file = directoryBuilder.child(name);
+ byte[] uniqueKey = new byte[UNIQUE_KEY_SIZE];
+ secureRandom.nextBytes(uniqueKey);
+ String key = StringUtils.convertBytesToHex(uniqueKey);
+ file.setProperty(PROP_UNIQUE_KEY, key);
+ file.setProperty(PROP_BLOB_SIZE, definition.getBlobSize());
+
fileNames.add(name);
markDirty();
return new OakIndexOutput(name, file, indexName, blobFactory);
Modified:
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/OakDirectoryTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/OakDirectoryTest.java?rev=1808187&r1=1808186&r2=1808187&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/OakDirectoryTest.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/OakDirectoryTest.java
Tue Sep 12 22:56:22 2017
@@ -28,6 +28,7 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.api.Type.BINARIES;
import static
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.INDEX_DATA_CHILD_NAME;
import static
org.apache.jackrabbit.oak.plugins.index.lucene.directory.OakDirectory.PROP_BLOB_SIZE;
+import static
org.apache.jackrabbit.oak.plugins.index.lucene.directory.OakDirectory.PROP_UNIQUE_KEY;
import static
org.apache.jackrabbit.oak.plugins.index.lucene.directory.OakDirectory.UNIQUE_KEY_SIZE;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
@@ -179,6 +180,26 @@ public class OakDirectoryTest {
assertEquals(fileNames, files);
}
+ // OAK-6562
+ @Test
+ public void createOutputReInitsFile() throws Exception {
+ builder.setProperty(LuceneIndexConstants.SAVE_DIR_LISTING, true);
+ Directory dir = createDir(builder, false, "/foo");
+
+ final String fileName = "foo";
+ dir.createOutput(fileName, IOContext.DEFAULT);
+ String firstUniqueKey = builder.getChildNode(INDEX_DATA_CHILD_NAME)
+ .getChildNode(fileName).getString(PROP_UNIQUE_KEY);
+
+ dir.createOutput(fileName, IOContext.DEFAULT);
+ String secondUniqueKey = builder.getChildNode(INDEX_DATA_CHILD_NAME)
+ .getChildNode(fileName).getString(PROP_UNIQUE_KEY);
+
+ assertFalse("Unique key must change on re-incarnating output with same
name",
+ firstUniqueKey.equals(secondUniqueKey));
+
+ }
+
byte[] assertWrites(Directory dir, int blobSize) throws IOException {
byte[] data = randomBytes(fileSize);
IndexOutput o = dir.createOutput("test", IOContext.DEFAULT);