Author: drew
Date: Fri Jan 18 18:33:01 2013
New Revision: 1435288

URL: http://svn.apache.org/viewvc?rev=1435288&view=rev
Log:
ACCUMULO-919 backported to 1.4 branch

Modified:
    
accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/gc/SimpleGarbageCollector.java

Modified: 
accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/gc/SimpleGarbageCollector.java
URL: 
http://svn.apache.org/viewvc/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/gc/SimpleGarbageCollector.java?rev=1435288&r1=1435287&r2=1435288&view=diff
==============================================================================
--- 
accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/gc/SimpleGarbageCollector.java
 (original)
+++ 
accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/gc/SimpleGarbageCollector.java
 Fri Jan 18 18:33:01 2013
@@ -16,6 +16,7 @@
  */
 package org.apache.accumulo.server.gc;
 
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
@@ -92,6 +93,7 @@ import org.apache.commons.cli.ParseExcep
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.fs.Trash;
 import org.apache.hadoop.io.Text;
 import org.apache.log4j.Logger;
 import org.apache.zookeeper.KeeperException;
@@ -111,8 +113,9 @@ public class SimpleGarbageCollector impl
   private long gcStartDelay;
   private boolean checkForBulkProcessingFiles;
   private FileSystem fs;
-  private Option optSafeMode, optOffline, optVerboseMode, optAddress;
-  private boolean safemode, offline, verbose;
+  private Option optSafeMode, optOffline, optVerboseMode, optAddress, 
optNoTrash;
+  private Trash trash = null;
+  private boolean safemode, offline, verbose, noTrash;
   private String address;
   private CommandLine commandLine;
   private ZooLock lock;
@@ -148,10 +151,12 @@ public class SimpleGarbageCollector impl
     optOffline = new Option("o", "offline", false,
         "offline mode will run once and check data files directly; this is 
dangerous if accumulo is running or not shut down properly");
     optAddress = new Option("a", "address", true, "specify our local address");
+    optNoTrash = new Option("t", "no-trash", false, "do not use hdfs trash if 
it is enabled");
     opts.addOption(optVerboseMode);
     opts.addOption(optSafeMode);
     opts.addOption(optOffline);
     opts.addOption(optAddress);
+    opts.addOption(optNoTrash);
     
     try {
       commandLine = new BasicParser().parse(opts, args);
@@ -162,6 +167,7 @@ public class SimpleGarbageCollector impl
       offline = commandLine.hasOption(optOffline.getOpt());
       verbose = commandLine.hasOption(optVerboseMode.getOpt());
       address = commandLine.getOptionValue(optAddress.getOpt());
+      noTrash = commandLine.hasOption(optNoTrash.getOpt());
     } catch (ParseException e) {
       String str = "Can't parse the command line options";
       log.fatal(str, e);
@@ -169,7 +175,7 @@ public class SimpleGarbageCollector impl
     }
   }
   
-  public void init(FileSystem fs, Instance instance, AuthInfo credentials, 
AccumuloConfiguration conf) {
+  public void init(FileSystem fs, Instance instance, AuthInfo credentials, 
AccumuloConfiguration conf) throws IOException {
     this.fs = fs;
     this.instance = instance;
     this.credentials = credentials;
@@ -182,8 +188,12 @@ public class SimpleGarbageCollector impl
     log.info("safemode: " + safemode);
     log.info("offline: " + offline);
     log.info("verbose: " + verbose);
+    log.info("trash enabled: " + !noTrash);
     log.info("memory threshold: " + CANDIDATE_MEMORY_PERCENTAGE + " of " + 
Runtime.getRuntime().maxMemory() + " bytes");
     log.info("delete threads: " + numDeleteThreads);
+    if (!noTrash) {
+      this.trash = new Trash(fs, fs.getConf());
+    }
   }
   
   private void run() {
@@ -303,6 +313,16 @@ public class SimpleGarbageCollector impl
     }
   }
   
+  private boolean moveToTrash(Path path) throws IOException {
+    if (trash == null)
+      return false;
+    try {
+      return trash.moveToTrash(path);
+    } catch (FileNotFoundException ex) {
+      return false;
+    }
+  }
+  
   /*
    * this method removes deleted table dirs that are empty
    */
@@ -333,8 +353,11 @@ public class SimpleGarbageCollector impl
       if (tabletDirs == null)
         continue;
       
-      if (tabletDirs.length == 0)
-        fs.delete(new Path(ServerConstants.getTablesDir() + "/" + delTableId), 
false);
+      if (tabletDirs.length == 0) {
+        Path p = new Path(ServerConstants.getTablesDir() + "/" + delTableId);
+        if (!moveToTrash(p)) 
+          fs.delete(p, false);
+      }
     }
   }
   
@@ -583,7 +606,7 @@ public class SimpleGarbageCollector impl
             
             Path p = new Path(ServerConstants.getTablesDir() + delete);
             
-            if (fs.delete(p, true)) {
+            if (moveToTrash(p) || fs.delete(p, true)) {
               // delete succeeded, still want to delete
               removeFlag = true;
               synchronized (SimpleGarbageCollector.this) {


Reply via email to