private boolean updateFragmentStatus(final FragmentStatus fragmentStatus) { final FragmentHandle fragmentHandle = fragmentStatus.getHandle(); final FragmentData data = fragmentDataMap.get(fragmentHandle); final FragmentState oldState = data.getState(); final boolean inTerminalState = isTerminal(oldState); final FragmentState currentState = fragmentStatus.getProfile().getState(); if (inTerminalState || (oldState == FragmentState.CANCELLATION_REQUESTED && !isTerminal(currentState))) { // Already in a terminal state, or invalid state transition from CANCELLATION_REQUESTED. This shouldn't happen. logger.warn(String.format("Received status message for fragment %s after fragment was in state %s. New state was %s", QueryIdHelper.getQueryIdentifier(fragmentHandle), oldState, currentState)); return false; } data.setStatus(fragmentStatus); return oldState != currentState; }
@Override public void fragmentStatusUpdate(FragmentStatus status) throws RpcException { ExternalId id = ExternalIdHelper.toExternal(status.getHandle().getQueryId()); ManagedForeman managed = externalIdToForeman.get(id); if (managed == null) { // TODO(DX-7242): this is a little chatty since a failed query will often log a bunch of fragments // We need a better mechanism to debug this. logger.info("A fragment status message arrived post query termination, dropping. Fragment [{}] reported a state of {}.", QueryIdHelper.getFragmentId(status.getHandle()), status.getProfile().getState()); } else { managed.foreman.updateStatus(status); } }
@Override public void statusUpdate(final FragmentStatus status) { logger.debug("New fragment status was provided to QueryManager of {}", status); switch(status.getProfile().getState()) { case AWAITING_ALLOCATION: case RUNNING: case CANCELLATION_REQUESTED: updateFragmentStatus(status); break; case FAILED: logger.info("Fragment {} failed, cancelling remaining fragments.", QueryIdHelper.getQueryIdentifier(status.getHandle())); completionListener.failed(UserRemoteException.create(status.getProfile().getError())); fragmentDone(status); break; case FINISHED: FragmentHandle fragmentHandle = status.getHandle(); if (fragmentHandle.getMajorFragmentId() == 0) { cancelExecutingFragments(); } fragmentDone(status); break; case CANCELLED: fragmentDone(status); break; default: throw new UnsupportedOperationException(String.format("Received status of %s", status)); } } };
public Builder mergeFrom(com.dremio.exec.proto.UserBitShared.MinorFragmentProfile other) { if (other == com.dremio.exec.proto.UserBitShared.MinorFragmentProfile.getDefaultInstance()) return this; if (other.hasState()) { setState(other.getState());
public void writeTo(io.protostuff.Output output, com.dremio.exec.proto.UserBitShared.MinorFragmentProfile message) throws java.io.IOException output.writeEnum(1, message.getState().getNumber(), false); if(message.hasError()) output.writeObject(2, message.getError(), com.dremio.exec.proto.SchemaUserBitShared.DremioPBError.WRITE, false);
private boolean madeProgress(final FragmentStatus prev, final FragmentStatus cur) { final MinorFragmentProfile previous = prev.getProfile(); final MinorFragmentProfile current = cur.getProfile(); if (previous.getState() != current.getState()) { return true; } if (previous.getOperatorProfileCount() != current.getOperatorProfileCount()) { return true; } for(int i =0; i < current.getOperatorProfileCount(); i++){ if (madeProgress(previous.getOperatorProfile(i), current.getOperatorProfile(i))) { return true; } } return false; }
public FragmentState getState() { return status.getProfile().getState(); }