public List<SlotStatus> resetExpectedState(Predicate<SlotStatus> filter, String expectedSlotsVersion) { // filter the slots List<SlotStatus> filteredSlots = getAllSlotsStatus(filter); // verify the state of the system hasn't changed checkSlotsVersion(expectedSlotsVersion, filteredSlots); return ImmutableList.copyOf(transform(filteredSlots, new Function<SlotStatus, SlotStatus>() { @Override public SlotStatus apply(SlotStatus slotStatus) { if (slotStatus.getState() != SlotLifecycleState.UNKNOWN) { stateManager.setExpectedState(new ExpectedSlotStatus(slotStatus.getId(), slotStatus.getState(), slotStatus.getAssignment())); } else { stateManager.deleteExpectedState(slotStatus.getId()); } return slotStatus; } })); }
public UUID apply(ExpectedSlotStatus input) { return input.getId(); } };
@Override public void setExpectedState(ExpectedSlotStatus slotStatus) { Preconditions.checkNotNull(slotStatus, "slotStatus is null"); if (isDomainCreated()) { List<ReplaceableAttribute> attributes = newArrayList(); attributes.add(new ReplaceableAttribute("state", slotStatus.getStatus().toString(), true)); if (slotStatus.getAssignment() != null) { attributes.add(new ReplaceableAttribute("binary", slotStatus.getAssignment().getBinary(), true)); attributes.add(new ReplaceableAttribute("config", slotStatus.getAssignment().getConfig(), true)); } try { simpleDb.putAttributes(new PutAttributesRequest().withDomainName(domainName).withItemName(slotStatus.getId().toString()).withAttributes(attributes)); expectedStateStoreUp(); } catch (Exception e) { expectedStateStoreDown(e); } } }
private List<SlotStatus> getAllSlotsStatus(Predicate<SlotStatus> slotFilter, List<RemoteSlot> allSlots) ImmutableMap<UUID, ExpectedSlotStatus> expectedStates = Maps.uniqueIndex(stateManager.getAllExpectedStates(), ExpectedSlotStatus.uuidGetter()); ImmutableMap<UUID, SlotStatus> actualStates = Maps.uniqueIndex(transform(allSlots, getSlotStatus()), SlotStatus.uuidGetter()); if (actualState == null) { if (expectedState == null || expectedState.getStatus() == SlotLifecycleState.TERMINATED) { continue; "/unknown", UNKNOWN, expectedState.getAssignment(), null, ImmutableMap.<String, Integer>of(), expectedState.getStatus(), expectedState.getAssignment(), "Slot is missing; Expected slot to be " + expectedState.getStatus()); fullSlotStatus = actualState.changeExpectedState(expectedState.getStatus(), expectedState.getAssignment()); if (!Objects.equal(actualState.getState(), expectedState.getStatus())) { messages.add("Expected state to be " + expectedState.getStatus()); if (!Objects.equal(actualState.getAssignment(), expectedState.getAssignment())) { Assignment assignment = expectedState.getAssignment(); if (assignment != null) { messages.add("Expected assignment to be " + assignment.getBinary() + " " + assignment.getConfig());
throw new IllegalArgumentException("Unexpected state transition " + state); stateManager.setExpectedState(new ExpectedSlotStatus(slotStatus.getId(), expectedState, slotStatus.getAssignment())); return slotStatus;
@Override public void setExpectedState(ExpectedSlotStatus slotStatus) { expectedState.put(slotStatus.getId().toString(), slotStatus); } }
public List<SlotStatus> install(Predicate<AgentStatus> filter, int limit, Assignment assignment) { Installation installation = InstallationUtils.toInstallation(repository, assignment); List<RemoteAgent> targetAgents = selectAgents(filter, installation); // randomize agents so all processes don't end up on the same node // todo sort agents by number of process already installed on them List<SlotStatus> slots = newArrayList(); for (RemoteAgent agent : targetAgents) { if (slots.size() >= limit) { break; } // install SlotStatus slotStatus = agent.install(installation); stateManager.setExpectedState(new ExpectedSlotStatus(slotStatus.getId(), STOPPED, installation.getAssignment())); slots.add(slotStatus); } return ImmutableList.copyOf(slots); }
@Override public void setExpectedState(ExpectedSlotStatus slotStatus) { Preconditions.checkNotNull(slotStatus, "slotStatus is null"); try { Files.write(codec.toJson(slotStatus), new File(dataDir, slotStatus.getId().toString() + ".json"), Charsets.UTF_8); } catch (Exception e) { log.error(e, "Error writing expected slot status"); } } }
@Override public SlotStatus apply(RemoteSlot slot) { SlotStatus slotStatus = slot.assign(installation); stateManager.setExpectedState(new ExpectedSlotStatus(slotStatus.getId(), STOPPED, installation.getAssignment())); return slotStatus; } }));
stateManager.setExpectedState(new ExpectedSlotStatus(slotStatus.getId(), STOPPED, installation.getAssignment())); return slotStatus;
return new ExpectedSlotStatus(UUID.fromString(id), SlotLifecycleState.valueOf(state), null); return new ExpectedSlotStatus(UUID.fromString(id), SlotLifecycleState.valueOf(state), new Assignment(binary, config));
@Override public SlotStatus apply(RemoteSlot slot) { SlotStatus slotStatus; SlotLifecycleState expectedState; switch (state) { case RUNNING: slotStatus = slot.start(); expectedState = RUNNING; break; case RESTARTING: slotStatus = slot.restart(); expectedState = RUNNING; break; case STOPPED: slotStatus = slot.stop(); expectedState = STOPPED; break; default: throw new IllegalArgumentException("Unexpected state transition " + state); } stateManager.setExpectedState(new ExpectedSlotStatus(slotStatus.getId(), expectedState, slotStatus.getAssignment())); return slotStatus; } }));
@Override public SlotStatus apply(SlotStatus slotStatus) { if (slotStatus.getState() != SlotLifecycleState.UNKNOWN) { stateManager.setExpectedState(new ExpectedSlotStatus(slotStatus.getId(), slotStatus.getState(), slotStatus.getAssignment())); } else { stateManager.deleteExpectedState(slotStatus.getId()); } return slotStatus; } }));
stateManager.setExpectedState(new ExpectedSlotStatus(slotStatus.getId(), slotStatus.getState(), slotStatus.getAssignment()));