Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IllegalStateException Unknown deployment when passing deployment ID to undeploy() method #2049

Open
junglie85 opened this issue Jul 12, 2017 · 0 comments

Comments

@junglie85
Copy link

Looking through the logs of a Vert.x application, I noticed the following exception when undeploying verticles (it's the same exception for all 3):

    Failed to undeploy netsci.graphservice.verticles.CommandVerticle
    Failed to undeploy netsci.graphservice.verticles.QueryVerticle
    Failed to undeploy netsci.graphservice.verticles.EventVerticle
    java.lang.IllegalStateException: Unknown deployment
    	at io.vertx.core.impl.DeploymentManager.undeployVerticle(DeploymentManager.java:203)
    	at io.vertx.core.impl.VertxImpl.undeploy(VertxImpl.java:616)
    	at microservice.MasterMicroserviceVerticle.undeploySupportingVerticle(MasterMicroserviceVerticle.java:462)
    	at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    	at java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1548)
    	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    	at microservice.MasterMicroserviceVerticle.stopSupportingVerticles(MasterMicroserviceVerticle.java:433)
    	at microservice.MasterMicroserviceVerticle.lambda$stop$14(MasterMicroserviceVerticle.java:383)
    	at io.vertx.core.Future.lambda$compose$1(Future.java:270)
    	at io.vertx.core.impl.FutureImpl.tryComplete(FutureImpl.java:126)
    	at io.vertx.core.impl.FutureImpl.complete(FutureImpl.java:88)
    	at io.vertx.core.impl.FutureImpl.handle(FutureImpl.java:152)
    	at io.vertx.core.impl.FutureImpl.handle(FutureImpl.java:23)
    	at io.vertx.core.impl.FutureImpl.setHandler(FutureImpl.java:81)
    	at io.vertx.core.Future.lambda$compose$1(Future.java:275)
    	at io.vertx.core.impl.FutureImpl.tryComplete(FutureImpl.java:126)
    	at io.vertx.core.impl.FutureImpl.complete(FutureImpl.java:88)
    	at io.vertx.core.impl.FutureImpl.handle(FutureImpl.java:152)
    	at io.vertx.core.impl.FutureImpl.handle(FutureImpl.java:23)
    	at io.vertx.core.impl.FutureImpl.tryComplete(FutureImpl.java:126)
    	at io.vertx.core.impl.FutureImpl.tryComplete(FutureImpl.java:133)
    	at io.vertx.core.impl.FutureImpl.complete(FutureImpl.java:95)
    	at microservice.MasterMicroserviceVerticle.lambda$null$11(MasterMicroserviceVerticle.java:363)
    	at microservice.messaging.impl.BufferKafkaProducerService.lambda$shutdown$2(BufferKafkaProducerService.java:97)
    	at io.vertx.core.impl.FutureImpl.setHandler(FutureImpl.java:81)
    	at io.vertx.core.impl.ContextImpl.lambda$null$0(ContextImpl.java:287)
    	at io.vertx.core.impl.ContextImpl.lambda$wrapTask$2(ContextImpl.java:337)
    	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
    	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:403)
    	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:445)
    	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
    	at java.lang.Thread.run(Thread.java:748)

However, they are all deployed and have a deployment ID:

    Deployed: 213f1978-a595-4af1-8129-29de872e9907
    Deployed: e46839f1-2dd2-4cce-9e12-66e09677b97a
    Deployed: 8fdfd492-e005-4503-875e-13d73c633b2c

The deployment ID's are stored in a synchronized map, with the verticle class as the key and the the deployment id as the value. When queried, it shows that they are correctly stored:

    class netsci.graphservice.verticles.QueryVerticle: e46839f1-2dd2-4cce-9e12-66e09677b97a
    class netsci.graphservice.verticles.CommandVerticle: 8fdfd492-e005-4503-875e-13d73c633b2c
    class netsci.graphservice.verticles.EventVerticle: 213f1978-a595-4af1-8129-29de872e9907

Prior to the call to endeploy, if I check which verticle is being undeployed, I get can see that the valid deployment ID is being passed into the call to undeploy:

    Undeploying: e46839f1-2dd2-4cce-9e12-66e09677b97a
    Undeploying: 8fdfd492-e005-4503-875e-13d73c633b2c
    Undeploying: 213f1978-a595-4af1-8129-29de872e9907

Here are the relevant bits of code:

    public abstract class MasterMicroserviceVerticle extends MicroserviceVerticle {
    
      private final Map<Class, String> supportingVerticles =
          Collections.synchronizedMap(new HashMap<Class, String>());
    
      ...
    
      private Future<Void> deploySupportingVerticle(Class verticle) {
    
        Future<Void> future = Future.future();
    
        vertx.deployVerticle(
            verticle.getName(),
            new DeploymentOptions().setConfig(config()),
            asyncResult -> {
              if (asyncResult.succeeded()) {
                // Assign deployment ID to verticle map.
                String depId = asyncResult.result();
                System.out.println();
                System.out.println();
                System.out.println("Deployed: " + depId);
                System.out.println();
                System.out.println();
                supportingVerticles.put(verticle, depId);
                healthStatusService.setHealth(verticle.getName(), HealthStatus.PASSING);
                logger.info("Deployed {}", verticle.getName());
                future.complete();
              } else {
                healthStatusService.setHealth(verticle.getName(), HealthStatus.FAILING);
                logger.error("Failed to deploy {}", verticle.getName(), asyncResult.cause());
                future.fail(asyncResult.cause());
              }
            });
    
        return future;
      }
    
      ...
    
      @Override
      public void stop(Future<Void> stopFuture) throws Exception {
    
        System.out.println();
        System.out.println();
        System.out.println();
        System.out.println();
        System.out.println();
        for (Class c : supportingVerticles.keySet()) {
          System.out.println(c + ": " + supportingVerticles.get(c));
        }
        System.out.println();
        System.out.println();
        System.out.println();
        System.out.println();
        System.out.println();
        ...
          return mongoFuture;
        }).compose(handler -> {
          Future<Void> verticlesFuture = Future.future();
    
          stopSupportingVerticles(verticlesFuture.completer());
    
          return verticlesFuture;
        }).compose(handler ->
          logger.info("Undeployed service");
          stopFuture.completer();
        }, stopFuture);
      }
    
      protected void stopSupportingVerticles(Handler<AsyncResult<Void>> handler) {
    
        List<Future> undeployable = supportingVerticles
            .keySet()
            .stream()
            .map(this::undeploySupportingVerticle)
            .collect(Collectors.toList());
    
        CompositeFuture.all(undeployable)
            .setHandler(asyncResult -> {
              if (asyncResult.succeeded()) {
                handler.handle(Future.succeededFuture());
              } else {
                handler.handle(Future.failedFuture(asyncResult.cause()));
              }
            });
      }
    
      private Future<Void> undeploySupportingVerticle(Class verticle) {
    
        Future<Void> future = Future.future();
    
        System.out.println();
        System.out.println();
        System.out.println("Undeploying: " + supportingVerticles.get(verticle));
        System.out.println();
        System.out.println();
        vertx.undeploy(supportingVerticles.get(verticle), asyncResult -> {
          healthStatusService.setHealth(verticle.getName(), HealthStatus.FAILING);
          if (asyncResult.succeeded()) {
            logger.info("Undeployed {}", verticle.getName());
            future.complete();
          } else {
            logger.error("Failed to undeploy {}", verticle.getName(), asyncResult.cause());
            future.fail(asyncResult.cause());
          }
        });
    
        return future;
      }
    }

Please excuse all the System.out.println()'s, I've thrown them in there to help me get a better idea of what's going on and should probably record this info in the logs. But for now, I'd just appreciate any help understanding why Vert.x is saying the deployments are unknown? Whether it's a problem with my code or an actual Vert.x issue?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant