improve lock logic when recovering to reduce chance of throwable slipping and causing no release of lock

This commit is contained in:
Shay Banon 2011-07-26 16:39:36 +03:00
parent 15b9e00888
commit 47b0750171
1 changed files with 5 additions and 12 deletions

View File

@ -945,10 +945,10 @@ public class RobinEngine extends AbstractIndexShardComponent implements Engine {
failEngine(e);
throw new OptimizeFailedEngineException(shardId, e);
} finally {
rwl.readLock().unlock();
if (indexWriter != null && indexWriter.getConfig().getMergePolicy() instanceof EnableMergePolicy) {
((EnableMergePolicy) indexWriter.getConfig().getMergePolicy()).disableMerge();
}
rwl.readLock().unlock();
optimizeMutex.set(false);
}
}
@ -1031,18 +1031,9 @@ public class RobinEngine extends AbstractIndexShardComponent implements Engine {
}
rwl.writeLock().lock();
Translog.Snapshot phase3Snapshot;
Translog.Snapshot phase3Snapshot = null;
try {
phase3Snapshot = translog.snapshot(phase2Snapshot);
} catch (Exception e) {
--disableFlushCounter;
rwl.writeLock().unlock();
phase1Snapshot.release();
phase2Snapshot.release();
throw new RecoveryEngineException(shardId, 3, "Snapshot failed", e);
}
try {
recoveryHandler.phase3(phase3Snapshot);
} catch (Exception e) {
throw new RecoveryEngineException(shardId, 3, "Execution failed", e);
@ -1051,9 +1042,11 @@ public class RobinEngine extends AbstractIndexShardComponent implements Engine {
rwl.writeLock().unlock();
phase1Snapshot.release();
phase2Snapshot.release();
if (phase3Snapshot != null) {
phase3Snapshot.release();
}
}
}
@Override public List<Segment> segments() {
rwl.readLock().lock();