currentBackupsLock.lock();
try {
assert !copyImmediately;
for (Iterator<BackupEntry> it = oldMap.values().iterator(); it.hasNext();) {
final BackupEntry be = it.next();
final CacheLine line = cache.getLine(be.id);
assert line != null;
synchronized (line) {
final Message.BACKUP backup = makeBackup(line, be.version);
if (backup != null) {
oldMap.remove(be.id);
if (LOG.isDebugEnabled())
LOG.debug("Copied {} ver {} for backup", hex(be.id), be.version);
currentBackups.put(be.id, backup);
} else {
if (LOG.isDebugEnabled())
LOG.debug("Matching version for {} ({}) not found", hex(be.id), be.version);
this.copyImmediately = true;
}
}
it.remove();
}
} finally {
currentBackupsLock.unlock();
}
if (copyImmediately) { // backups incomplete
LOG.debug("Incomplete backups. Completeing.");
mapLock.writeLock().lock();
currentBackupsLock.lock();
try {
for (Iterator<BackupEntry> it = map.values().iterator(); it.hasNext();) {
final BackupEntry be = it.next();
final CacheLine line = cache.getLine(be.id);
assert line != null;
synchronized (line) {
Message.BACKUP backup = makeBackup(line, be.version);
if (backup != null) {
map.remove(be.id);