public OwnershipReturn mergeLatestRowsIfNecessary(Dag extendedDag, List<MusicRangeInformationRow> latestRows,
List<Range> ranges, Map<UUID, LockResult> locks, UUID ownershipId) throws MDBCServiceException {
recoverFromFailureAndUpdateDag(extendedDag,latestRows,ranges,locks);
- if (latestRows.size()==1) {
+
+ if (latestRows.size()==1 && latestRows.get(0).getDBPartition().contains(ranges)) {
//reuse current row if possible
MusicRangeInformationRow row = latestRows.get(0);
LockResult lockresult = locks.get(row.getPartitionIndex());
//Find
Map<UUID,LockResult> newLocks = new HashMap<>();
List<Range> rangesToOwn = mi.getRangeDependencies(ranges);
- List<MusicRangeInformationRow> rows = extractRowsForRange(mi,rangesToOwn, false);
- Dag toOwn = Dag.getDag(rows,rangesToOwn);
+ List<MusicRangeInformationRow> rangesToOwnRows = extractRowsForRange(mi,rangesToOwn, false);
+ Dag toOwn = Dag.getDag(rangesToOwnRows,rangesToOwn);
Dag currentlyOwn = new Dag();
while ( (toOwn.isDifferent(currentlyOwn) || !currentlyOwn.isOwned() ) &&
!timeout(opId)
takeOwnershipOfDag(mi, currPartition, opId, newLocks, toOwn);
currentlyOwn=toOwn;
//TODO instead of comparing dags, compare rows
- rows = extractRowsForRange(mi, rangesToOwn, false);
- toOwn = Dag.getDag(rows,rangesToOwn);
+ rangesToOwnRows = extractRowsForRange(mi, rangesToOwn, false);
+ toOwn = Dag.getDag(rangesToOwnRows,rangesToOwn);
}
if (!currentlyOwn.isOwned() || toOwn.isDifferent(currentlyOwn)) {
//hold on to previous partition
throw new MDBCServiceException("Ownership timeout");
}
Set<Range> allRanges = currentlyOwn.getAllRanges();
- List<MusicRangeInformationRow> isLatestRows = extractRowsForRange(mi, new ArrayList<>(allRanges), true);
- currentlyOwn.setRowsPerLatestRange(getIsLatestPerRange(toOwn,isLatestRows));
- return mi.mergeLatestRowsIfNecessary(currentlyOwn,rows,ranges,newLocks,opId);
+ List<MusicRangeInformationRow> latestRows = extractRowsForRange(mi, new ArrayList<>(allRanges), true);
+ currentlyOwn.setRowsPerLatestRange(getIsLatestPerRange(toOwn,latestRows));
+ return mi.mergeLatestRowsIfNecessary(currentlyOwn,latestRows,ranges,newLocks,opId);
}
/**