diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.java hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.java index 5a48453..fb8b909 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.java @@ -28,11 +28,15 @@ import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.errorhandling.ForeignException; +import org.apache.hadoop.hbase.exceptions.HBaseSnapshotException; +import org.apache.hadoop.hbase.executor.EventType; import org.apache.hadoop.hbase.master.MasterServices; +import org.apache.hadoop.hbase.master.TableLockManager; +import org.apache.hadoop.hbase.master.TableLockManager.TableLock; import org.apache.hadoop.hbase.procedure.Procedure; import org.apache.hadoop.hbase.procedure.ProcedureCoordinator; import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription; -import org.apache.hadoop.hbase.exceptions.HBaseSnapshotException; +import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Pair; import com.google.common.collect.Lists; @@ -47,11 +51,43 @@ public class EnabledTableSnapshotHandler extends TakeSnapshotHandler { private static final Log LOG = LogFactory.getLog(EnabledTableSnapshotHandler.class); private final ProcedureCoordinator coordinator; + private final TableLockManager tableLockManager; + private final TableLock tableLock; public EnabledTableSnapshotHandler(SnapshotDescription snapshot, MasterServices master, SnapshotManager manager) throws IOException { super(snapshot, master); this.coordinator = manager.getCoordinator(); + this.tableLockManager = master.getTableLockManager(); + this.tableLock = this.tableLockManager.writeLock(Bytes.toBytes(snapshot.getTable()) + , EventType.C_M_SNAPSHOT_TABLE.toString()); + } + + @Override + public EnabledTableSnapshotHandler prepare() throws Exception { + super.prepare(); + this.tableLock.acquire(); //after this, you should ensure to release this lock in + //case of exceptions + return this; + } + + @Override + public void process() { + try { + super.process(); + } finally { + releaseTableLock(); + } + } + + private void releaseTableLock() { + if (this.tableLock != null) { + try { + this.tableLock.release(); + } catch (IOException ex) { + LOG.warn("Could not release the table lock", ex); + } + } } // TODO consider switching over to using regionnames, rather than server names. This would allow diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.java hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.java index d6ae0dc..6bfb074 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.java @@ -428,10 +428,10 @@ public class SnapshotManager implements Stoppable { throws HBaseSnapshotException { TakeSnapshotHandler handler; try { - handler = new EnabledTableSnapshotHandler(snapshot, master, this); + handler = new EnabledTableSnapshotHandler(snapshot, master, this).prepare(); this.executorService.submit(handler); this.handler = handler; - } catch (IOException e) { + } catch (Exception e) { // cleanup the working directory by trying to delete it from the fs. Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(snapshot, rootDir); try {