--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableLockManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableLockManager.java @@ -99,7 +99,8 @@ public abstract class TableLockManager { } /** - * Returns a TableLock for locking the table for exclusive access + * Returns a TableLock for locking the table for exclusive access, + * with the table lock manager's wait timeout * @param tableName Table to lock * @param purpose Human readable reason for locking the table * @return A new TableLock object for acquiring a write lock @@ -107,7 +108,18 @@ public abstract class TableLockManager { public abstract TableLock writeLock(byte[] tableName, String purpose); /** - * Returns a TableLock for locking the table for shared access among read-lock holders + * Returns a TableLock for locking the table for exclusive access, + * with the specified wait timeout to acquire the lock. + * @param tableName Table to lock + * @param purpose Human readable reason for locking the table + * @param timeout The wait timeout to acquire this lock + * @return A new TableLock object for acquiring a write lock + */ + public abstract TableLock writeLock(byte[] tableName, String purpose, long timeout); + + /** + * Returns a TableLock for locking the table for shared access among read-lock holders, + * with the table lock manager's wait timeout * @param tableName Table to lock * @param purpose Human readable reason for locking the table * @return A new TableLock object for acquiring a read lock @@ -115,6 +127,16 @@ public abstract class TableLockManager { public abstract TableLock readLock(byte[] tableName, String purpose); /** + * Returns a TableLock for locking the table for shared access among read-lock holders, + * with the specified wait timeout to acquire the lock. + * @param tableName Table to lock + * @param purpose Human readable reason for locking the table + * @param timeout The wait timeout to acquire this lock + * @return A new TableLock object for acquiring a read lock + */ + public abstract TableLock readLock(byte[] tableName, String purpose, long timeout); + + /** * Visits all table locks(read and write), and lock attempts with the given callback * MetadataHandler. * @param handler the metadata handler to call @@ -190,10 +212,18 @@ public abstract class TableLockManager { return new NullTableLock(); } @Override + public TableLock writeLock(byte[] tableName, String purpose, long timeout) { + return new NullTableLock(); + } + @Override public TableLock readLock(byte[] tableName, String purpose) { return new NullTableLock(); } @Override + public TableLock readLock(byte[] tableName, String purpose, long timeout) { + return new NullTableLock(); + } + @Override public void reapAllExpiredLocks() throws IOException { } @Override @@ -372,11 +402,24 @@ public abstract class TableLockManager { serverName, writeLockTimeoutMs, false, purpose); } + @Override + public TableLock writeLock(byte[] tableName, String purpose, long timeout) { + return new TableLockImpl(tableName, zkWatcher, + serverName, timeout, false, purpose); + } + + @Override public TableLock readLock(byte[] tableName, String purpose) { return new TableLockImpl(tableName, zkWatcher, serverName, readLockTimeoutMs, true, purpose); } + @Override + public TableLock readLock(byte[] tableName, String purpose, long timeout) { + return new TableLockImpl(tableName, zkWatcher, + serverName, timeout, true, purpose); + } + public void visitAllLocks(MetadataHandler handler) throws IOException { for (String tableName : getTableNames()) { String tableLockZNode = ZKUtil.joinZNode(zkWatcher.tableLockZNode, tableName); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.java index 6d018e5..7dc638c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.java @@ -67,6 +67,8 @@ public abstract class TakeSnapshotHandler extends EventHandler implements Snapsh ForeignExceptionSnare { private static final Log LOG = LogFactory.getLog(TakeSnapshotHandler.class); + protected static final long SNAPSHOT_TABLE_WRITE_LOCK_TIMEOUT_MS = 60 * 1000; // 1 min + private volatile boolean finished; // none of these should ever be null @@ -107,7 +109,7 @@ public abstract class TakeSnapshotHandler extends EventHandler implements Snapsh this.tableLockManager = master.getTableLockManager(); this.tableLock = this.tableLockManager.writeLock(Bytes.toBytes(snapshot.getTable()) - , EventType.C_M_SNAPSHOT_TABLE.toString()); + , EventType.C_M_SNAPSHOT_TABLE.toString(), SNAPSHOT_TABLE_WRITE_LOCK_TIMEOUT_MS); // prepare the verify this.verifier = new MasterSnapshotVerifier(masterServices, snapshot, rootDir);