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