private void stashRequestWaitingForResourceManager( final AllocationID allocationID, final ResourceProfile resources, final FlinkCompletableFuture<SimpleSlot> future) { LOG.info("Cannot serve slot request, no ResourceManager connected. " + "Adding as pending request {}", allocationID); waitingForResourceManager.put(allocationID, new PendingRequest(allocationID, future, resources)); scheduleRunAsync(new Runnable() { @Override public void run() { checkTimeoutRequestWaitingForResourceManager(allocationID); } }, resourceManagerRequestsTimeout); }
private PendingRequest pollMatchingPendingRequest(final AllocatedSlot slot) { final ResourceProfile slotResources = slot.getResourceProfile(); // try the requests sent to the resource manager first for (PendingRequest request : pendingRequests.values()) { if (slotResources.isMatching(request.resourceProfile())) { pendingRequests.remove(request.allocationID()); return request; } } // try the requests waiting for a resource manager connection next for (PendingRequest request : waitingForResourceManager.values()) { if (slotResources.isMatching(request.resourceProfile())) { waitingForResourceManager.remove(request.allocationID()); return request; } } // no request pending, or no request matches return null; }
pendingRequest.future().complete(resultSlot); allocatedSlots.add(resultSlot);
pendingRequest.allocationID(), taskManagerSlot.getSlotAllocationId()); pendingRequest.future().complete(newSlot);
pendingRequest.future().completeExceptionally(cause);
private void requestSlotFromResourceManager( final AllocationID allocationID, final FlinkCompletableFuture<SimpleSlot> future, final ResourceProfile resources) { LOG.info("Requesting slot with profile {} from resource manager (request = {}).", resources, allocationID); pendingRequests.put(allocationID, new PendingRequest(allocationID, future, resources)); Future<Acknowledge> rmResponse = resourceManagerGateway.requestSlot( jobManagerLeaderId, resourceManagerLeaderId, new SlotRequest(jobId, allocationID, resources, jobManagerAddress), resourceManagerRequestsTimeout); Future<Void> slotRequestProcessingFuture = rmResponse.thenAcceptAsync(new AcceptFunction<Acknowledge>() { @Override public void accept(Acknowledge value) { slotRequestToResourceManagerSuccess(allocationID); } }, getMainThreadExecutor()); // on failure, fail the request future slotRequestProcessingFuture.exceptionallyAsync(new ApplyFunction<Throwable, Void>() { @Override public Void apply(Throwable failure) { slotRequestToResourceManagerFailed(allocationID, failure); return null; } }, getMainThreadExecutor()); }
private void checkTimeoutRequestWaitingForResourceManager(AllocationID allocationID) { PendingRequest request = waitingForResourceManager.remove(allocationID); if (request != null && !request.future().isDone()) { request.future().completeExceptionally(new NoResourceAvailableException( "No slot available and no connection to Resource Manager established.")); } }
private void slotRequestToResourceManagerFailed(AllocationID allocationID, Throwable failure) { PendingRequest request = pendingRequests.remove(allocationID); if (request != null) { request.future().completeExceptionally(new NoResourceAvailableException( "No pooled slot available and request to ResourceManager for new slot failed", failure)); } else { if (LOG.isDebugEnabled()) { LOG.debug("Unregistered slot request {} failed.", allocationID, failure); } } }
@RpcMethod public void connectToResourceManager(UUID resourceManagerLeaderId, ResourceManagerGateway resourceManagerGateway) { this.resourceManagerLeaderId = checkNotNull(resourceManagerLeaderId); this.resourceManagerGateway = checkNotNull(resourceManagerGateway); // work on all slots waiting for this connection for (PendingRequest pending : waitingForResourceManager.values()) { requestSlotFromResourceManager(pending.allocationID(), pending.future(), pending.resourceProfile()); } // all sent off waitingForResourceManager.clear(); }