Search in sources :

Example 1 with FencedRpcEndpoint

use of org.apache.flink.runtime.rpc.FencedRpcEndpoint in project flink by apache.

the class AkkaRpcService method startServer.

@Override
public <C extends RpcEndpoint & RpcGateway> RpcServer startServer(C rpcEndpoint) {
    checkNotNull(rpcEndpoint, "rpc endpoint");
    final SupervisorActor.ActorRegistration actorRegistration = registerAkkaRpcActor(rpcEndpoint);
    final ActorRef actorRef = actorRegistration.getActorRef();
    final CompletableFuture<Void> actorTerminationFuture = actorRegistration.getTerminationFuture();
    LOG.info("Starting RPC endpoint for {} at {} .", rpcEndpoint.getClass().getName(), actorRef.path());
    final String akkaAddress = AkkaUtils.getAkkaURL(actorSystem, actorRef);
    final String hostname;
    Option<String> host = actorRef.path().address().host();
    if (host.isEmpty()) {
        hostname = "localhost";
    } else {
        hostname = host.get();
    }
    Set<Class<?>> implementedRpcGateways = new HashSet<>(RpcUtils.extractImplementedRpcGateways(rpcEndpoint.getClass()));
    implementedRpcGateways.add(RpcServer.class);
    implementedRpcGateways.add(AkkaBasedEndpoint.class);
    final InvocationHandler akkaInvocationHandler;
    if (rpcEndpoint instanceof FencedRpcEndpoint) {
        // a FencedRpcEndpoint needs a FencedAkkaInvocationHandler
        akkaInvocationHandler = new FencedAkkaInvocationHandler<>(akkaAddress, hostname, actorRef, configuration.getTimeout(), configuration.getMaximumFramesize(), actorTerminationFuture, ((FencedRpcEndpoint<?>) rpcEndpoint)::getFencingToken, captureAskCallstacks, flinkClassLoader);
        implementedRpcGateways.add(FencedMainThreadExecutable.class);
    } else {
        akkaInvocationHandler = new AkkaInvocationHandler(akkaAddress, hostname, actorRef, configuration.getTimeout(), configuration.getMaximumFramesize(), actorTerminationFuture, captureAskCallstacks, flinkClassLoader);
    }
    // Rather than using the System ClassLoader directly, we derive the ClassLoader
    // from this class . That works better in cases where Flink runs embedded and all Flink
    // code is loaded dynamically (for example from an OSGI bundle) through a custom ClassLoader
    ClassLoader classLoader = getClass().getClassLoader();
    @SuppressWarnings("unchecked") RpcServer server = (RpcServer) Proxy.newProxyInstance(classLoader, implementedRpcGateways.toArray(new Class<?>[implementedRpcGateways.size()]), akkaInvocationHandler);
    return server;
}
Also used : ActorRef(akka.actor.ActorRef) InvocationHandler(java.lang.reflect.InvocationHandler) RpcServer(org.apache.flink.runtime.rpc.RpcServer) ClassLoadingUtils.runWithContextClassLoader(org.apache.flink.runtime.concurrent.akka.ClassLoadingUtils.runWithContextClassLoader) ClassLoadingUtils.guardCompletionWithContextClassLoader(org.apache.flink.runtime.concurrent.akka.ClassLoadingUtils.guardCompletionWithContextClassLoader) ClassLoadingUtils.withContextClassLoader(org.apache.flink.runtime.concurrent.akka.ClassLoadingUtils.withContextClassLoader) FencedRpcEndpoint(org.apache.flink.runtime.rpc.FencedRpcEndpoint) HashSet(java.util.HashSet)

Example 2 with FencedRpcEndpoint

use of org.apache.flink.runtime.rpc.FencedRpcEndpoint in project flink by apache.

the class AkkaRpcService method registerAkkaRpcActor.

private <C extends RpcEndpoint & RpcGateway> SupervisorActor.ActorRegistration registerAkkaRpcActor(C rpcEndpoint) {
    final Class<? extends AbstractActor> akkaRpcActorType;
    if (rpcEndpoint instanceof FencedRpcEndpoint) {
        akkaRpcActorType = FencedAkkaRpcActor.class;
    } else {
        akkaRpcActorType = AkkaRpcActor.class;
    }
    synchronized (lock) {
        checkState(!stopped, "RpcService is stopped");
        final SupervisorActor.StartAkkaRpcActorResponse startAkkaRpcActorResponse = SupervisorActor.startAkkaRpcActor(supervisor.getActor(), actorTerminationFuture -> Props.create(akkaRpcActorType, rpcEndpoint, actorTerminationFuture, getVersion(), configuration.getMaximumFramesize(), flinkClassLoader), rpcEndpoint.getEndpointId());
        final SupervisorActor.ActorRegistration actorRegistration = startAkkaRpcActorResponse.orElseThrow(cause -> new AkkaRpcRuntimeException(String.format("Could not create the %s for %s.", AkkaRpcActor.class.getSimpleName(), rpcEndpoint.getEndpointId()), cause));
        actors.put(actorRegistration.getActorRef(), rpcEndpoint);
        return actorRegistration;
    }
}
Also used : AkkaRpcRuntimeException(org.apache.flink.runtime.rpc.akka.exceptions.AkkaRpcRuntimeException) FencedRpcEndpoint(org.apache.flink.runtime.rpc.FencedRpcEndpoint)

Aggregations

FencedRpcEndpoint (org.apache.flink.runtime.rpc.FencedRpcEndpoint)2 ActorRef (akka.actor.ActorRef)1 InvocationHandler (java.lang.reflect.InvocationHandler)1 HashSet (java.util.HashSet)1 ClassLoadingUtils.guardCompletionWithContextClassLoader (org.apache.flink.runtime.concurrent.akka.ClassLoadingUtils.guardCompletionWithContextClassLoader)1 ClassLoadingUtils.runWithContextClassLoader (org.apache.flink.runtime.concurrent.akka.ClassLoadingUtils.runWithContextClassLoader)1 ClassLoadingUtils.withContextClassLoader (org.apache.flink.runtime.concurrent.akka.ClassLoadingUtils.withContextClassLoader)1 RpcServer (org.apache.flink.runtime.rpc.RpcServer)1 AkkaRpcRuntimeException (org.apache.flink.runtime.rpc.akka.exceptions.AkkaRpcRuntimeException)1