/** * Drop all of the changingBlobs and pendingChangingBlobs. * @param dynamicState current state. * @return the next state. */ private static DynamicState drainAllChangingBlobs(DynamicState dynamicState) { if (!dynamicState.changingBlobs.isEmpty()) { for (BlobChanging rc : dynamicState.changingBlobs) { rc.latch.countDown(); } dynamicState = dynamicState.withChangingBlobs(Collections.emptySet()); } if (!dynamicState.pendingChangingBlobs.isEmpty()) { dynamicState = dynamicState.withPendingChangingBlobs(Collections.emptySet(), null); } return dynamicState; }
/** * Informs the async localizer for all of blobs that the worker acknowledged the change of blobs. * Worker has stop as of now. * * PRECONDITION: container is null * PRECONDITION: changingBlobs should only be for the given assignment. * @param dynamicState the current state * @return the futures for the current assignment. */ private static DynamicState informChangedBlobs(DynamicState dynamicState, LocalAssignment assignment) { assert dynamicState.container == null; assert dynamicState.changingBlobs.stream().allMatch((cr) -> forSameTopology(cr.assignment, assignment)); Set<Future<Void>> futures = new HashSet<>(dynamicState.changingBlobs.size()); // We need to add the new futures to the existing ones if (forSameTopology(dynamicState.pendingChangingBlobsAssignment, assignment)) { futures.addAll(dynamicState.pendingChangingBlobs); } // Acknowledge all changing blobs as futures for (BlobChanging rc : dynamicState.changingBlobs) { futures.add(rc.latch.countDown()); } LOG.debug("found changing blobs {} moving them to pending...", dynamicState.changingBlobs); return dynamicState.withChangingBlobs(Collections.emptySet()) .withPendingChangingBlobs(futures, assignment); }
/** * Filter all of the changing blobs to just be for those compatible with the given assignment. * All others will be released appropriately. * * @param dynamicState the current state * @param assignment the assignment to look for * @return the updated dynamicState */ private static DynamicState filterChangingBlobsFor(DynamicState dynamicState, final LocalAssignment assignment) { if (dynamicState.changingBlobs.isEmpty()) { return dynamicState; } HashSet<BlobChanging> savedBlobs = new HashSet<>(dynamicState.changingBlobs.size()); for (BlobChanging rc : dynamicState.changingBlobs) { if (forSameTopology(assignment, rc.assignment)) { savedBlobs.add(rc); } else { rc.latch.countDown(); } } return dynamicState.withChangingBlobs(savedBlobs); }
stateMachineStep(dynamicState.withNewAssignment(newAssignment.get()) .withProfileActions(origProfileActions, dynamicState.pendingStopProfileActions) .withChangingBlobs(changingResourcesToHandle), staticState);