private void loadProcedure(final ProcedureWALEntry entry, final ProcedureProtos.Procedure proc) { maxProcId = Math.max(maxProcId, proc.getProcId()); if (isRequired(proc.getProcId())) { if (LOG.isTraceEnabled()) { LOG.trace("Read " + entry.getType() + " entry " + proc.getProcId()); } localProcedureMap.add(proc); if (tracker.isPartial()) { tracker.insert(proc.getProcId()); } } if (localTracker != null) { localTracker.insert(proc.getProcId()); } }
public void mergeTail(WalProcedureMap other) { for (Entry p = other.replayOrderHead; p != null; p = p.replayNext) { int slotIndex = getMapSlot(p.getProcId()); p.hashNext = procedureMap[slotIndex]; procedureMap[slotIndex] = p; rootHead = other.rootHead; } else if (other.rootHead != null) { Entry otherTail = findLinkListTail(other.rootHead); otherTail.linkNext = rootHead; rootHead.linkPrev = otherTail; childUnlinkedHead = other.childUnlinkedHead; } else if (other.childUnlinkedHead != null) { Entry otherTail = findLinkListTail(other.childUnlinkedHead); otherTail.linkNext = childUnlinkedHead; childUnlinkedHead.linkPrev = otherTail; minProcId = Math.max(minProcId, other.minProcId); other.clear();
private void deleteEntry(final long procId) { if (LOG.isTraceEnabled()) { LOG.trace("delete entry " + procId); } maxProcId = Math.max(maxProcId, procId); localProcedureMap.remove(procId); assert !procedureMap.contains(procId); if (tracker.isPartial()) { tracker.setDeleted(procId, true); } if (localTracker != null) { // In case there is only delete entry for this procedure in current log. localTracker.setDeleted(procId, true); } }
public void mergeTail(WalProcedureMap other) { for (Entry p = other.replayOrderHead; p != null; p = p.replayNext) { int slotIndex = getMapSlot(p.getProcId()); p.hashNext = procedureMap[slotIndex]; procedureMap[slotIndex] = p; rootHead = other.rootHead; } else if (other.rootHead != null) { Entry otherTail = findLinkListTail(other.rootHead); otherTail.linkNext = rootHead; rootHead.linkPrev = otherTail; childUnlinkedHead = other.childUnlinkedHead; } else if (other.childUnlinkedHead != null) { Entry otherTail = findLinkListTail(other.childUnlinkedHead); otherTail.linkNext = childUnlinkedHead; childUnlinkedHead.linkPrev = otherTail; other.clear();
public EntryIterator fetchReady() { buildGraph(); Entry readyHead = null; Entry readyTail = null; Entry p = replayOrderHead; while (p != null) { Entry next = p.replayNext; if (p.isReady()) { unlinkFromReplayList(p); if (readyTail != null) { readyTail.replayNext = p; p.replayPrev = readyTail; } else { p.replayPrev = null; readyHead = p; } readyTail = p; p.replayNext = null; } p = next; } // we need the hash-table lookups for parents, so this must be done // out of the loop where we check isReadyToRun() for (p = readyHead; p != null; p = p.replayNext) { removeFromMap(p.getProcId()); unlinkFromLinkList(p); } return readyHead != null ? new EntryIterator(readyHead) : null; }
public EntryIterator fetchReady() { buildGraph(); Entry readyHead = null; Entry readyTail = null; Entry p = replayOrderHead; while (p != null) { Entry next = p.replayNext; if (p.isReady()) { unlinkFromReplayList(p); if (readyTail != null) { readyTail.replayNext = p; p.replayPrev = readyTail; } else { p.replayPrev = null; readyHead = p; } readyTail = p; p.replayNext = null; } p = next; } // we need the hash-table lookups for parents, so this must be done // out of the loop where we check isReadyToRun() for (p = readyHead; p != null; p = p.replayNext) { removeFromMap(p.getProcId()); unlinkFromLinkList(p); } return readyHead != null ? new EntryIterator(readyHead) : null; }
public void add(ProcedureProtos.Procedure procProto) { trackProcIds(procProto.getProcId()); Entry entry = addToMap(procProto.getProcId(), procProto.hasParentId()); boolean newEntry = entry.proto == null; // We have seen procedure WALs where the entries are out of order; see HBASE-18152. // To compensate, only replace the Entry procedure if for sure this new procedure // is indeed an entry that came later. TODO: Fix the writing of procedure info so // it does not violate basic expectation, that WALs contain procedure changes going // from start to finish in sequence. if (newEntry || isIncreasing(entry.proto, procProto)) { entry.proto = procProto; } addToReplayList(entry); if(newEntry) { if (procProto.hasParentId()) { childUnlinkedHead = addToLinkList(entry, childUnlinkedHead); } else { rootHead = addToLinkList(entry, rootHead); } } }
private boolean isRequired(final long procId) { return !isDeleted(procId) && !procedureMap.contains(procId); }
public void add(ProcedureProtos.Procedure procProto) { trackProcIds(procProto.getProcId()); Entry entry = addToMap(procProto.getProcId(), procProto.hasParentId()); boolean isNew = entry.proto == null; entry.proto = procProto; addToReplayList(entry); if (isNew) { if (procProto.hasParentId()) { childUnlinkedHead = addToLinkList(entry, childUnlinkedHead); } else { rootHead = addToLinkList(entry, rootHead); } } }
private void buildGraph() { Entry p = childUnlinkedHead; while (p != null) { Entry next = p.linkNext; Entry rootProc = getRootProcedure(p); if (rootProc != null) { rootProc.childHead = addToLinkList(p, rootProc.childHead); } p = next; } for (p = rootHead; p != null; p = p.linkNext) { checkReadyToRun(p); } }
private void buildGraph() { Entry p = childUnlinkedHead; while (p != null) { Entry next = p.linkNext; Entry rootProc = getRootProcedure(p); if (rootProc != null) { rootProc.childHead = addToLinkList(p, rootProc.childHead); } p = next; } for (p = rootHead; p != null; p = p.linkNext) { checkReadyToRun(p); } }
private boolean isRequired(final long procId) { return !isDeleted(procId) && !procedureMap.contains(procId); }
private void readDeleteEntry(final ProcedureWALEntry entry) throws IOException { assert entry.getProcedureCount() == 0 : "Expected no procedures"; assert entry.hasProcId() : "expected ProcID"; if (LOG.isTraceEnabled()) { LOG.trace("read delete entry " + entry.getProcId()); } maxProcId = Math.max(maxProcId, entry.getProcId()); localProcedureMap.remove(entry.getProcId()); assert !procedureMap.contains(entry.getProcId()); tracker.setDeleted(entry.getProcId(), true); }
public void finalize(ProcedureWALFormat.Loader loader) throws IOException { // notify the loader about the max proc ID loader.setMaxProcId(maxProcId); // fetch the procedure ready to run. ProcedureIterator procIter = procedureMap.fetchReady(); if (procIter != null) loader.load(procIter); // remaining procedures have missing link or dependencies // consider them as corrupted, manual fix is probably required. procIter = procedureMap.fetchAll(); if (procIter != null) loader.handleCorrupted(procIter); }
public void finish() throws IOException { // notify the loader about the max proc ID loader.setMaxProcId(maxProcId); // fetch the procedure ready to run. ProcedureIterator procIter = procedureMap.fetchReady(); if (procIter != null) loader.load(procIter); // remaining procedures have missing link or dependencies // consider them as corrupted, manual fix is probably required. procIter = procedureMap.fetchAll(); if (procIter != null) loader.handleCorrupted(procIter); }
private void loadProcedure(final ProcedureWALEntry entry, final ProcedureProtos.Procedure proc) { maxProcId = Math.max(maxProcId, proc.getProcId()); if (isRequired(proc.getProcId())) { if (LOG.isTraceEnabled()) { LOG.trace("read " + entry.getType() + " entry " + proc.getProcId()); } localProcedureMap.add(proc); tracker.setDeleted(proc.getProcId(), false); } }