You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by el...@apache.org on 2014/06/05 06:42:50 UTC

[08/35] git commit: ACCUMULO-2041 more review updates

ACCUMULO-2041 more review updates


Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo
Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/459d3048
Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/459d3048
Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/459d3048

Branch: refs/heads/ACCUMULO-378
Commit: 459d3048eb39650ebff2c93734d2886a9d4869c7
Parents: 8049859
Author: Eric C. Newton <er...@gmail.com>
Authored: Mon Apr 21 16:28:01 2014 -0400
Committer: Eric C. Newton <er...@gmail.com>
Committed: Tue Jun 3 10:49:43 2014 -0400

----------------------------------------------------------------------
 .../accumulo/tserver/CountingIterator.java      |  78 ----------
 .../accumulo/tserver/tablet/Compactor.java      |  11 +-
 .../tserver/tablet/CountingIterator.java        |  78 ++++++++++
 .../accumulo/tserver/tablet/MinorCompactor.java |   9 +-
 .../apache/accumulo/tserver/tablet/Tablet.java  |  15 +-
 .../tserver/tablet/TabletCommitter.java         |   3 +
 .../accumulo/tserver/CountingIteratorTest.java  |   1 +
 .../apache/accumulo/tserver/RootFilesTest.java  | 150 -------------------
 .../accumulo/tserver/tablet/RootFilesTest.java  | 150 +++++++++++++++++++
 9 files changed, 247 insertions(+), 248 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/accumulo/blob/459d3048/server/tserver/src/main/java/org/apache/accumulo/tserver/CountingIterator.java
----------------------------------------------------------------------
diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/CountingIterator.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/CountingIterator.java
deleted file mode 100644
index e4ba076..0000000
--- a/server/tserver/src/main/java/org/apache/accumulo/tserver/CountingIterator.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.accumulo.tserver;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.apache.accumulo.core.data.Key;
-import org.apache.accumulo.core.data.Value;
-import org.apache.accumulo.core.iterators.IteratorEnvironment;
-import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
-import org.apache.accumulo.core.iterators.WrappingIterator;
-
-public class CountingIterator extends WrappingIterator {
-
-  private long count;
-  private final ArrayList<CountingIterator> deepCopies;
-  private final AtomicLong entriesRead;
-
-  @Override
-  public CountingIterator deepCopy(IteratorEnvironment env) {
-    return new CountingIterator(this, env);
-  }
-
-  private CountingIterator(CountingIterator other, IteratorEnvironment env) {
-    setSource(other.getSource().deepCopy(env));
-    count = 0;
-    this.deepCopies = other.deepCopies;
-    this.entriesRead = other.entriesRead;
-    deepCopies.add(this);
-  }
-
-  public CountingIterator(SortedKeyValueIterator<Key,Value> source, AtomicLong entriesRead) {
-    deepCopies = new ArrayList<CountingIterator>();
-    this.setSource(source);
-    count = 0;
-    this.entriesRead = entriesRead;
-  }
-
-  @Override
-  public void init(SortedKeyValueIterator<Key,Value> source, Map<String,String> options, IteratorEnvironment env) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public void next() throws IOException {
-    super.next();
-    count++;
-    if (count % 1024 == 0) {
-      entriesRead.addAndGet(1024);
-    }
-  }
-
-  public long getCount() {
-    long sum = 0;
-    for (CountingIterator dc : deepCopies) {
-      sum += dc.count;
-    }
-
-    return count + sum;
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/accumulo/blob/459d3048/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Compactor.java
----------------------------------------------------------------------
diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Compactor.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Compactor.java
index 9a93be3..2eee5ea 100644
--- a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Compactor.java
+++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Compactor.java
@@ -58,7 +58,6 @@ import org.apache.accumulo.server.problems.ProblemReports;
 import org.apache.accumulo.server.problems.ProblemType;
 import org.apache.accumulo.trace.instrument.Span;
 import org.apache.accumulo.trace.instrument.Trace;
-import org.apache.accumulo.tserver.CountingIterator;
 import org.apache.accumulo.tserver.InMemoryMap;
 import org.apache.accumulo.tserver.MinorCompactionReason;
 import org.apache.accumulo.tserver.TabletIteratorEnvironment;
@@ -134,15 +133,15 @@ public class Compactor implements Callable<CompactionStats> {
     return compactions;
   }
 
-  public Compactor(VolumeManager fs, Map<FileRef,DataFileValue> files, InMemoryMap imm, FileRef outputFile, boolean propogateDeletes,
-      AccumuloConfiguration acuTableConf, KeyExtent extent, CompactionEnv env, List<IteratorSetting> iterators, int reason) {
-    this.extent = extent;
-    this.fs = fs;
+  public Compactor(Tablet tablet, Map<FileRef,DataFileValue> files, InMemoryMap imm, FileRef outputFile, boolean propogateDeletes,
+      CompactionEnv env, List<IteratorSetting> iterators, int reason, AccumuloConfiguration tableConfiguation) {
+    this.extent = tablet.getExtent();
+    this.fs = tablet.getTabletServer().getFileSystem();
+    this.acuTableConf = tableConfiguation;
     this.filesToCompact = files;
     this.imm = imm;
     this.outputFile = outputFile;
     this.propogateDeletes = propogateDeletes;
-    this.acuTableConf = acuTableConf;
     this.env = env;
     this.iterators = iterators;
     this.reason = reason;

http://git-wip-us.apache.org/repos/asf/accumulo/blob/459d3048/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/CountingIterator.java
----------------------------------------------------------------------
diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/CountingIterator.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/CountingIterator.java
new file mode 100644
index 0000000..44b8460
--- /dev/null
+++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/CountingIterator.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.accumulo.tserver.tablet;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Value;
+import org.apache.accumulo.core.iterators.IteratorEnvironment;
+import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
+import org.apache.accumulo.core.iterators.WrappingIterator;
+
+public class CountingIterator extends WrappingIterator {
+
+  private long count;
+  private final ArrayList<CountingIterator> deepCopies;
+  private final AtomicLong entriesRead;
+
+  @Override
+  public CountingIterator deepCopy(IteratorEnvironment env) {
+    return new CountingIterator(this, env);
+  }
+
+  private CountingIterator(CountingIterator other, IteratorEnvironment env) {
+    setSource(other.getSource().deepCopy(env));
+    count = 0;
+    this.deepCopies = other.deepCopies;
+    this.entriesRead = other.entriesRead;
+    deepCopies.add(this);
+  }
+
+  public CountingIterator(SortedKeyValueIterator<Key,Value> source, AtomicLong entriesRead) {
+    deepCopies = new ArrayList<CountingIterator>();
+    this.setSource(source);
+    count = 0;
+    this.entriesRead = entriesRead;
+  }
+
+  @Override
+  public void init(SortedKeyValueIterator<Key,Value> source, Map<String,String> options, IteratorEnvironment env) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void next() throws IOException {
+    super.next();
+    count++;
+    if (count % 1024 == 0) {
+      entriesRead.addAndGet(1024);
+    }
+  }
+
+  public long getCount() {
+    long sum = 0;
+    for (CountingIterator dc : deepCopies) {
+      sum += dc.count;
+    }
+
+    return count + sum;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/accumulo/blob/459d3048/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/MinorCompactor.java
----------------------------------------------------------------------
diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/MinorCompactor.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/MinorCompactor.java
index 6636159..115aed7 100644
--- a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/MinorCompactor.java
+++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/MinorCompactor.java
@@ -23,7 +23,6 @@ import java.util.Random;
 
 import org.apache.accumulo.core.client.IteratorSetting;
 import org.apache.accumulo.core.client.impl.Tables;
-import org.apache.accumulo.core.data.KeyExtent;
 import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope;
 import org.apache.accumulo.core.master.state.tables.TableState;
 import org.apache.accumulo.core.metadata.schema.DataFileValue;
@@ -31,7 +30,6 @@ import org.apache.accumulo.core.util.UtilWaitThread;
 import org.apache.accumulo.server.client.HdfsZooInstance;
 import org.apache.accumulo.server.conf.TableConfiguration;
 import org.apache.accumulo.server.fs.FileRef;
-import org.apache.accumulo.server.fs.VolumeManager;
 import org.apache.accumulo.server.problems.ProblemReport;
 import org.apache.accumulo.server.problems.ProblemReports;
 import org.apache.accumulo.server.problems.ProblemType;
@@ -53,9 +51,8 @@ public class MinorCompactor extends Compactor {
     return Collections.singletonMap(mergeFile, dfv);
   }
   
-  public MinorCompactor(VolumeManager fs, InMemoryMap imm, FileRef mergeFile, DataFileValue dfv, FileRef outputFile, TableConfiguration acuTableConf,
-      KeyExtent extent, MinorCompactionReason mincReason) {
-    super(fs, toFileMap(mergeFile, dfv), imm, outputFile, true, acuTableConf, extent, new CompactionEnv() {
+  public MinorCompactor(Tablet tablet, InMemoryMap imm, FileRef mergeFile, DataFileValue dfv, FileRef outputFile, MinorCompactionReason mincReason, TableConfiguration tableConfig) {
+    super(tablet, toFileMap(mergeFile, dfv), imm, outputFile, true, new CompactionEnv() {
       
       @Override
       public boolean isCompactionEnabled() {
@@ -66,7 +63,7 @@ public class MinorCompactor extends Compactor {
       public IteratorScope getIteratorScope() {
         return IteratorScope.minc;
       }
-    }, Collections.<IteratorSetting>emptyList(), mincReason.ordinal());
+    }, Collections.<IteratorSetting>emptyList(), mincReason.ordinal(), tableConfig);
   }
   
   private boolean isTableDeleting() {

http://git-wip-us.apache.org/repos/asf/accumulo/blob/459d3048/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java
----------------------------------------------------------------------
diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java
index bf9a905..dc2fc4d 100644
--- a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java
+++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java
@@ -856,7 +856,6 @@ public class Tablet implements TabletCommitter {
     ScanOptions opts = new ScanOptions(num, authorizations, this.defaultSecurityLabel, columns, ssiList, ssio, interruptFlag, isolated);
     return new Scanner(this, range, opts);
   }
-
   DataFileValue minorCompact(VolumeManager fs, InMemoryMap memTable, FileRef tmpDatafile, FileRef newDatafile, FileRef mergeFile,
       boolean hasQueueTime, long queued, CommitSession commitSession, long flushId, MinorCompactionReason mincReason) {
     boolean failed = false;
@@ -875,7 +874,7 @@ public class Tablet implements TabletCommitter {
         if (mergeFile != null)
           dfv = getDatafileManager().getDatafileSizes().get(mergeFile);
 
-        MinorCompactor compactor = new MinorCompactor(fs, memTable, mergeFile, dfv, tmpDatafile, tableConfiguration, extent, mincReason);
+        MinorCompactor compactor = new MinorCompactor(this, memTable, mergeFile, dfv, tmpDatafile, mincReason, tableConfiguration);
         stats = compactor.call();
       } finally {
         span.stop();
@@ -888,13 +887,13 @@ public class Tablet implements TabletCommitter {
         span.stop();
       }
       return new DataFileValue(stats.getFileSize(), stats.getEntriesWritten());
-    } catch (Exception E) {
+    } catch (Exception e) {
       failed = true;
-      throw new RuntimeException(E);
-    } catch (Error E) {
+      throw new RuntimeException(e);
+    } catch (Error e) {
       // Weird errors like "OutOfMemoryError" when trying to create the thread for the compaction
       failed = true;
-      throw new RuntimeException(E);
+      throw new RuntimeException(e);
     } finally {
       try {
         getTabletMemory().finalizeMinC();
@@ -1850,8 +1849,8 @@ public class Tablet implements TabletCommitter {
 
           // always propagate deletes, unless last batch
           boolean lastBatch = filesToCompact.isEmpty();
-          Compactor compactor = new Compactor(getTabletServer().getFileSystem(), copy, null, compactTmpName, lastBatch ? propogateDeletes : true, tableConf, extent, cenv,
-              compactionIterators, reason.ordinal());
+          Compactor compactor = new Compactor(this, copy, null, compactTmpName, lastBatch ? propogateDeletes : true, cenv,
+              compactionIterators, reason.ordinal(), tableConf);
 
           CompactionStats mcs = compactor.call();
 

http://git-wip-us.apache.org/repos/asf/accumulo/blob/459d3048/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/TabletCommitter.java
----------------------------------------------------------------------
diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/TabletCommitter.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/TabletCommitter.java
index bd87a5b..a5d197c 100644
--- a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/TabletCommitter.java
+++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/TabletCommitter.java
@@ -25,6 +25,9 @@ import org.apache.accumulo.server.conf.TableConfiguration;
 import org.apache.accumulo.tserver.InMemoryMap;
 import org.apache.accumulo.tserver.log.DfsLogger;
 
+/*
+ * A partial interface of Tablet to allow for testing of CommitSession without needing a real Tablet.
+ */
 public interface TabletCommitter {
 
   void abortCommit(CommitSession commitSession, List<Mutation> value);

http://git-wip-us.apache.org/repos/asf/accumulo/blob/459d3048/server/tserver/src/test/java/org/apache/accumulo/tserver/CountingIteratorTest.java
----------------------------------------------------------------------
diff --git a/server/tserver/src/test/java/org/apache/accumulo/tserver/CountingIteratorTest.java b/server/tserver/src/test/java/org/apache/accumulo/tserver/CountingIteratorTest.java
index 302b025..154b121 100644
--- a/server/tserver/src/test/java/org/apache/accumulo/tserver/CountingIteratorTest.java
+++ b/server/tserver/src/test/java/org/apache/accumulo/tserver/CountingIteratorTest.java
@@ -26,6 +26,7 @@ import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Range;
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.iterators.SortedMapIterator;
+import org.apache.accumulo.tserver.tablet.CountingIterator;
 import org.junit.Assert;
 import org.junit.Test;
 

http://git-wip-us.apache.org/repos/asf/accumulo/blob/459d3048/server/tserver/src/test/java/org/apache/accumulo/tserver/RootFilesTest.java
----------------------------------------------------------------------
diff --git a/server/tserver/src/test/java/org/apache/accumulo/tserver/RootFilesTest.java b/server/tserver/src/test/java/org/apache/accumulo/tserver/RootFilesTest.java
deleted file mode 100644
index 7cfe65c..0000000
--- a/server/tserver/src/test/java/org/apache/accumulo/tserver/RootFilesTest.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.accumulo.tserver;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.accumulo.core.conf.AccumuloConfiguration;
-import org.apache.accumulo.core.conf.ConfigurationCopy;
-import org.apache.accumulo.core.conf.Property;
-import org.apache.accumulo.server.fs.FileRef;
-import org.apache.accumulo.server.fs.VolumeManager;
-import org.apache.accumulo.server.fs.VolumeManagerImpl;
-import org.apache.accumulo.tserver.tablet.RootFiles;
-import org.apache.hadoop.fs.Path;
-import org.junit.Assert;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-
-/**
- * 
- */
-public class RootFilesTest {
-
-  @Rule
-  public TemporaryFolder tempFolder = new TemporaryFolder(new File(System.getProperty("user.dir") + "/target"));
-
-  private class TestWrapper {
-    File rootTabletDir;
-    Set<FileRef> oldDatafiles;
-    String compactName;
-    FileRef tmpDatafile;
-    FileRef newDatafile;
-    VolumeManager vm;
-    AccumuloConfiguration conf;
-
-    TestWrapper(VolumeManager vm, AccumuloConfiguration conf, String compactName, String... inputFiles) throws IOException {
-      this.vm = vm;
-      this.conf = conf;
-
-      rootTabletDir = new File(tempFolder.newFolder(), "accumulo/tables/+r/root_tablet");
-      rootTabletDir.mkdirs();
-      oldDatafiles = new HashSet<FileRef>();
-      for (String filename : inputFiles) {
-        File file = new File(rootTabletDir, filename);
-        file.createNewFile();
-        oldDatafiles.add(new FileRef(file.toURI().toString()));
-      }
-
-      this.compactName = compactName;
-
-      File tmpFile = new File(rootTabletDir, compactName + "_tmp");
-      tmpFile.createNewFile();
-      tmpDatafile = new FileRef(tmpFile.toURI().toString());
-
-      newDatafile = new FileRef(new File(rootTabletDir, compactName).toURI().toString());
-    }
-
-    void prepareReplacement() throws IOException {
-      RootFiles.prepareReplacement(vm, new Path(rootTabletDir.toURI()), oldDatafiles, compactName);
-    }
-
-    void renameReplacement() throws IOException {
-      RootFiles.renameReplacement(vm, tmpDatafile, newDatafile);
-    }
-
-    public void finishReplacement() throws IOException {
-      RootFiles.finishReplacement(conf, vm, new Path(rootTabletDir.toURI()), oldDatafiles, compactName);
-    }
-
-    public Collection<String> cleanupReplacement(String... expectedFiles) throws IOException {
-      Collection<String> ret = RootFiles.cleanupReplacement(vm, vm.listStatus(new Path(rootTabletDir.toURI())), true);
-
-      HashSet<String> expected = new HashSet<String>();
-      for (String efile : expectedFiles)
-        expected.add(new File(rootTabletDir, efile).toURI().toString());
-
-      Assert.assertEquals(expected, new HashSet<String>(ret));
-
-      return ret;
-    }
-
-    public void assertFiles(String... files) {
-      HashSet<String> actual = new HashSet<String>();
-      for (File file : rootTabletDir.listFiles()) {
-        actual.add(file.getName());
-      }
-
-      HashSet<String> expected = new HashSet<String>();
-      expected.addAll(Arrays.asList(files));
-
-      Assert.assertEquals(expected, actual);
-    }
-  }
-
-  @SuppressWarnings("deprecation")
-  @Test
-  public void testFileReplacement() throws IOException {
-
-    ConfigurationCopy conf = new ConfigurationCopy();
-    conf.set(Property.INSTANCE_DFS_URI, "file:///");
-    conf.set(Property.INSTANCE_DFS_DIR, "/");
-
-    VolumeManager vm = VolumeManagerImpl.get(conf);
-
-    TestWrapper wrapper = new TestWrapper(vm, conf, "A00004.rf", "A00002.rf", "F00003.rf");
-    wrapper.prepareReplacement();
-    wrapper.renameReplacement();
-    wrapper.finishReplacement();
-    wrapper.assertFiles("A00004.rf");
-
-    wrapper = new TestWrapper(vm, conf, "A00004.rf", "A00002.rf", "F00003.rf");
-    wrapper.prepareReplacement();
-    wrapper.cleanupReplacement("A00002.rf", "F00003.rf");
-    wrapper.assertFiles("A00002.rf", "F00003.rf");
-
-    wrapper = new TestWrapper(vm, conf, "A00004.rf", "A00002.rf", "F00003.rf");
-    wrapper.prepareReplacement();
-    wrapper.renameReplacement();
-    wrapper.cleanupReplacement("A00004.rf");
-    wrapper.assertFiles("A00004.rf");
-
-    wrapper = new TestWrapper(vm, conf, "A00004.rf", "A00002.rf", "F00003.rf");
-    wrapper.prepareReplacement();
-    wrapper.renameReplacement();
-    wrapper.finishReplacement();
-    wrapper.cleanupReplacement("A00004.rf");
-    wrapper.assertFiles("A00004.rf");
-
-  }
-}

http://git-wip-us.apache.org/repos/asf/accumulo/blob/459d3048/server/tserver/src/test/java/org/apache/accumulo/tserver/tablet/RootFilesTest.java
----------------------------------------------------------------------
diff --git a/server/tserver/src/test/java/org/apache/accumulo/tserver/tablet/RootFilesTest.java b/server/tserver/src/test/java/org/apache/accumulo/tserver/tablet/RootFilesTest.java
new file mode 100644
index 0000000..9c75a66
--- /dev/null
+++ b/server/tserver/src/test/java/org/apache/accumulo/tserver/tablet/RootFilesTest.java
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.accumulo.tserver.tablet;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.accumulo.core.conf.AccumuloConfiguration;
+import org.apache.accumulo.core.conf.ConfigurationCopy;
+import org.apache.accumulo.core.conf.Property;
+import org.apache.accumulo.server.fs.FileRef;
+import org.apache.accumulo.server.fs.VolumeManager;
+import org.apache.accumulo.server.fs.VolumeManagerImpl;
+import org.apache.accumulo.tserver.tablet.RootFiles;
+import org.apache.hadoop.fs.Path;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+/**
+ * 
+ */
+public class RootFilesTest {
+
+  @Rule
+  public TemporaryFolder tempFolder = new TemporaryFolder(new File(System.getProperty("user.dir") + "/target"));
+
+  private class TestWrapper {
+    File rootTabletDir;
+    Set<FileRef> oldDatafiles;
+    String compactName;
+    FileRef tmpDatafile;
+    FileRef newDatafile;
+    VolumeManager vm;
+    AccumuloConfiguration conf;
+
+    TestWrapper(VolumeManager vm, AccumuloConfiguration conf, String compactName, String... inputFiles) throws IOException {
+      this.vm = vm;
+      this.conf = conf;
+
+      rootTabletDir = new File(tempFolder.newFolder(), "accumulo/tables/+r/root_tablet");
+      rootTabletDir.mkdirs();
+      oldDatafiles = new HashSet<FileRef>();
+      for (String filename : inputFiles) {
+        File file = new File(rootTabletDir, filename);
+        file.createNewFile();
+        oldDatafiles.add(new FileRef(file.toURI().toString()));
+      }
+
+      this.compactName = compactName;
+
+      File tmpFile = new File(rootTabletDir, compactName + "_tmp");
+      tmpFile.createNewFile();
+      tmpDatafile = new FileRef(tmpFile.toURI().toString());
+
+      newDatafile = new FileRef(new File(rootTabletDir, compactName).toURI().toString());
+    }
+
+    void prepareReplacement() throws IOException {
+      RootFiles.prepareReplacement(vm, new Path(rootTabletDir.toURI()), oldDatafiles, compactName);
+    }
+
+    void renameReplacement() throws IOException {
+      RootFiles.renameReplacement(vm, tmpDatafile, newDatafile);
+    }
+
+    public void finishReplacement() throws IOException {
+      RootFiles.finishReplacement(conf, vm, new Path(rootTabletDir.toURI()), oldDatafiles, compactName);
+    }
+
+    public Collection<String> cleanupReplacement(String... expectedFiles) throws IOException {
+      Collection<String> ret = RootFiles.cleanupReplacement(vm, vm.listStatus(new Path(rootTabletDir.toURI())), true);
+
+      HashSet<String> expected = new HashSet<String>();
+      for (String efile : expectedFiles)
+        expected.add(new File(rootTabletDir, efile).toURI().toString());
+
+      Assert.assertEquals(expected, new HashSet<String>(ret));
+
+      return ret;
+    }
+
+    public void assertFiles(String... files) {
+      HashSet<String> actual = new HashSet<String>();
+      for (File file : rootTabletDir.listFiles()) {
+        actual.add(file.getName());
+      }
+
+      HashSet<String> expected = new HashSet<String>();
+      expected.addAll(Arrays.asList(files));
+
+      Assert.assertEquals(expected, actual);
+    }
+  }
+
+  @SuppressWarnings("deprecation")
+  @Test
+  public void testFileReplacement() throws IOException {
+
+    ConfigurationCopy conf = new ConfigurationCopy();
+    conf.set(Property.INSTANCE_DFS_URI, "file:///");
+    conf.set(Property.INSTANCE_DFS_DIR, "/");
+
+    VolumeManager vm = VolumeManagerImpl.get(conf);
+
+    TestWrapper wrapper = new TestWrapper(vm, conf, "A00004.rf", "A00002.rf", "F00003.rf");
+    wrapper.prepareReplacement();
+    wrapper.renameReplacement();
+    wrapper.finishReplacement();
+    wrapper.assertFiles("A00004.rf");
+
+    wrapper = new TestWrapper(vm, conf, "A00004.rf", "A00002.rf", "F00003.rf");
+    wrapper.prepareReplacement();
+    wrapper.cleanupReplacement("A00002.rf", "F00003.rf");
+    wrapper.assertFiles("A00002.rf", "F00003.rf");
+
+    wrapper = new TestWrapper(vm, conf, "A00004.rf", "A00002.rf", "F00003.rf");
+    wrapper.prepareReplacement();
+    wrapper.renameReplacement();
+    wrapper.cleanupReplacement("A00004.rf");
+    wrapper.assertFiles("A00004.rf");
+
+    wrapper = new TestWrapper(vm, conf, "A00004.rf", "A00002.rf", "F00003.rf");
+    wrapper.prepareReplacement();
+    wrapper.renameReplacement();
+    wrapper.finishReplacement();
+    wrapper.cleanupReplacement("A00004.rf");
+    wrapper.assertFiles("A00004.rf");
+
+  }
+}