You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ch...@apache.org on 2015/05/19 07:39:11 UTC

svn commit: r1680174 - in /jackrabbit/oak/branches/1.2: ./ oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopier.java oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopierTest.java

Author: chetanm
Date: Tue May 19 05:39:11 2015
New Revision: 1680174

URL: http://svn.apache.org/r1680174
Log:
OAK-2855 - CopyOnReadDirectory mode might delete a valid local file upon close

Merging 1678323

Modified:
    jackrabbit/oak/branches/1.2/   (props changed)
    jackrabbit/oak/branches/1.2/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopier.java
    jackrabbit/oak/branches/1.2/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopierTest.java

Propchange: jackrabbit/oak/branches/1.2/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue May 19 05:39:11 2015
@@ -1,3 +1,3 @@
 /jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1672350,1672468,1672537,1672603,1672642,1672644,1672834-1672835,1673351,1673410,1673414,1673436,1673644,1673662-1673664,1673669,1673695,1674046,1674065,1674075,1674107,1674228,1674880,1675055,1675332,1675354,1675357,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676725,1677579,1677581,1677609,1677611,1677939,1677991,1678173,1678758,1678938,1679165,1679191,1679235
+/jackrabbit/oak/trunk:1672350,1672468,1672537,1672603,1672642,1672644,1672834-1672835,1673351,1673410,1673414,1673436,1673644,1673662-1673664,1673669,1673695,1674046,1674065,1674075,1674107,1674228,1674880,1675055,1675332,1675354,1675357,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676725,1677579,1677581,1677609,1677611,1677939,1677991,1678173,1678323,1678758,1678938,1679165,1679191,1679235
 /jackrabbit/trunk:1345480

Modified: jackrabbit/oak/branches/1.2/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopier.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopier.java?rev=1680174&r1=1680173&r2=1680174&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopier.java (original)
+++ jackrabbit/oak/branches/1.2/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopier.java Tue May 19 05:39:11 2015
@@ -21,6 +21,7 @@ package org.apache.jackrabbit.oak.plugin
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
@@ -164,10 +165,16 @@ class IndexCopier implements CopyOnReadS
         private final Directory local;
 
         private final ConcurrentMap<String, FileReference> files = newConcurrentMap();
+        /**
+         * Set of fileNames bound to current local dir. It is updated with any new file
+         * which gets added by this directory
+         */
+        private final Set<String> localFileNames = Sets.newConcurrentHashSet();
 
         public CopyOnReadDirectory(Directory remote, Directory local) throws IOException {
             this.remote = remote;
             this.local = local;
+            this.localFileNames.addAll(Arrays.asList(local.listAll()));
         }
 
         @Override
@@ -334,7 +341,7 @@ class IndexCopier implements CopyOnReadS
         private void removeDeletedFiles() throws IOException {
             //Files present in dest but not present in source have to be deleted
             Set<String> filesToBeDeleted = Sets.difference(
-                    ImmutableSet.copyOf(local.listAll()),
+                    ImmutableSet.copyOf(localFileNames),
                     ImmutableSet.copyOf(remote.listAll())
             );
 
@@ -384,6 +391,7 @@ class IndexCopier implements CopyOnReadS
 
             void markValid(){
                 this.valid = true;
+                localFileNames.add(name);
             }
         }
     }

Modified: jackrabbit/oak/branches/1.2/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopierTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopierTest.java?rev=1680174&r1=1680173&r2=1680174&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopierTest.java (original)
+++ jackrabbit/oak/branches/1.2/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopierTest.java Tue May 19 05:39:11 2015
@@ -436,6 +436,34 @@ public class IndexCopierTest {
         assertEquals(0, c1.getFailedToDeleteFiles().size());
     }
 
+    @Test
+    public void deletedOnlyFilesForOlderVersion() throws Exception{
+        Directory baseDir = new CloseSafeDir();
+
+        IndexDefinition defn = new IndexDefinition(root, builder.getNodeState());
+        IndexCopier copier = new RAMIndexCopier(baseDir, sameThreadExecutor(), getWorkDir());
+
+        //1. Open a local and read t1 from remote
+        Directory remote1 = new RAMDirectory();
+        byte[] t1 = writeFile(remote1, "t1");
+
+        Directory local1 = copier.wrap("/foo", defn, remote1);
+        readAndAssert(local1, "t1", t1);
+
+        //While local1 is open , open another local2 and read t2
+        Directory remote2 = new RAMDirectory();
+        byte[] t2 = writeFile(remote2, "t2");
+
+        Directory local2 = copier.wrap("/foo", defn, remote2);
+        readAndAssert(local2, "t2", t2);
+
+        //Close local1
+        local1.close();
+
+        //t2 should still be readable
+        readAndAssert(local2, "t2", t2);
+    }
+
     private byte[] writeFile(Directory dir, String name) throws IOException {
         byte[] data = randomBytes(rnd.nextInt(maxFileSize) + 1);
         IndexOutput o = dir.createOutput(name, IOContext.DEFAULT);