private void validateTimestampHigherThanReadsCompletedBeforeInvoke(InvokeEvent invoke, OkEvent event) { OkEvent lastAcknowledgedRead = lastAcknowledgedReadBefore(invoke.time()); if (lastAcknowledgedRead != null) { long timestamp = Long.parseLong(event.value()); long lastAcknowledgedTimestamp = Long.parseLong(lastAcknowledgedRead.value()); if (lastAcknowledgedTimestamp >= timestamp) { errors.add(lastAcknowledgedRead); errors.add(invoke); errors.add(event); } } }
private boolean intervalCovered(InvokeEvent invokeEvent, OkEvent okEvent) { Range<Long> interval = Range.closed(invokeEvent.time(), okEvent.time()); return locksHeld.encloses(interval); }
private void verifyLockCorrectness() { for (Pair<InvokeEvent, OkEvent> eventPair : locksAtSomePoint) { InvokeEvent invokeEvent = eventPair.getLhSide(); OkEvent okEvent = eventPair.getRhSide(); if (intervalCovered(invokeEvent, okEvent)) { log.error("Lock {} granted to process {} between {} and {}, but lock was already held by " + "another process.", lockName, invokeEvent.process(), invokeEvent.time(), okEvent.time()); errors.add(invokeEvent); errors.add(okEvent); } } }
if (lastHeldLock.containsKey(process)) { long lastLockTime = lastHeldLock.get(process).time(); if (lastLockTime < invokeEvent.time()) { Range<Long> newRange = Range.closedOpen(lastLockTime, invokeEvent.time()); if (!locksHeld.subRangeSet(newRange).isEmpty()) { log.error("A {} request for lock {} by process {} invoked at time {} was granted at " + "(last known time the lock was held by {})", invokeEvent.function(), invokeEvent.value(), invokeEvent.process(), invokeEvent.time(), event.time(), lastLockTime, invokeEvent.time(), invokeEvent.process()); errors.add(invokeEvent);