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);


Reply via email to