throws IOException {
refreshTransactionList(transaction.getTableName());
transaction.keepAliveTransaction();
String lockPath = prepareLockNode(transaction.getTableName());
WriteLock wLock = new WriteLock(zkUtil.getSession(), lockPath,
Ids.OPEN_ACL_UNSAFE);
RMLockListener myLockListener = new RMLockListener();
wLock.setLockListener(myLockListener);
try {
boolean lockGrabbed = wLock.lock();
if (lockGrabbed == false) {
//TO DO : Let this request queue up and try obtaining lock.
throw new IOException(
"Unable to obtain lock for keep alive of transaction. "
+ transaction.toString());
} else {
String tableName = transaction.getTableName();
List<String> colFamilies = transaction.getColumnFamilies();
FamilyRevision revisionData = transaction.getFamilyRevisionInfo();
for (String cfamily : colFamilies) {
String path = PathUtil.getRunningTxnInfoPath(
baseDir, tableName, cfamily);
zkUtil.updateData(path, revisionData,
ZKUtil.UpdateMode.KEEP_ALIVE);
}
}
} catch (KeeperException e) {
throw new IOException("Exception while obtaining lock.", e);
} catch (InterruptedException e) {
throw new IOException("Exception while obtaining lock.", e);
} finally {
wLock.unlock();
}
}