Giter VIP home page Giter VIP logo

vertx-sync's Introduction

Caution

This project is now deprecated with the Quasar project being effectively abandoned in Vert.x 4 and removed in Vert.x 5.

Synchronous but non-OS-thread-blocking verticles

Build Status

Love scalability?

Hate blocking kernel threads?

Hate callback hell?

Want to squash the pyramid of doom?

Well, now you can have your cake and eat it…​

Vert.x lets you write code without blocking kernel threads for i/o by offering non-blocking implementations of common operations. However, these operations are necessarily asynchronous, meaning that for complex processing pipelines, it is necessary to either nest callbacks (leading to "callback hell" or use a library such as Rx to enable composition). Wouldn’t it be nice if you could write asynchronous code that just looked like synchronous code?

Vertx-sync allows you to deploy verticles that run using fibers. Fibers are very lightweight threads that can be blocked without blocking a kernel thread.

This enables you to write your asynchronous verticle code in a familiar synchronous style (i.e. no callbacks or promises or Rx). Consider it syntactic sugar over asynchronous processing. (Note, it cannot magically convert code which will block, such as synchronous JDBC operations, into non-blocking asynchronous code, so you will need to avoid using blocking libraries. If you do use a blocking library, you will block the event loop, which is to be avoided at all times).

As no kernel threads are blocked your application retains the scalability advantages of a non (kernel thread) blocking application.

Please see the in source asciidoc documentation or the main documentation on the web-site for a full description of vertx-sync

vertx-sync's People

Contributors

cescoffier avatar dependabot[bot] avatar jponge avatar liuchong avatar millross avatar mtatheonly avatar pmlopes avatar purplefox avatar slinkydeveloper avatar vietj avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vertx-sync's Issues

About performance

Hi all
I have run the benchmark of this project, and found SyncBenchmarkVerticle is slower than AsyncBenchmarkVerticle about 7-8x, does this is normal?

I am using quasar 0.7.3:jdk8.
all the benchmark had running at least 15 min for warm up jvm.

method [Sync.awaitResult] param [timeout] not work

I test the method

@Suspendable
  protected void testExecSyncMethodWithNoParamsAndHandlerWithReturnNoTimeout() {
    System.out.println(System.currentTimeMillis());
    String res = awaitResult(h -> ai.methodWithNoParamsAndHandlerWithReturnTimeout(h, 1000), 2000);
    System.out.println(System.currentTimeMillis());
    assertEquals("wibble", res);
    complete();
  }

  @Suspendable
  protected void testExecSyncMethodWithNoParamsAndHandlerWithReturnTimedout() {
    System.out.println(System.currentTimeMillis());
    String res = awaitResult(h -> ai.methodWithNoParamsAndHandlerWithReturnTimeout(h, 1000), 500);
    System.out.println(System.currentTimeMillis());
    assertNull(res);
    complete();
  }

I revise a little bit original unit testing
the output time are

1514445905198
1514445906203

1514445910048
1514445911049

it seems like the param 'timeout' doesn't effect

Method would Invoke twice If Miss One Annatation @Suspendable in the Invoke Chain

hello !
I had some problem while using this fantastic SYNC library in my program.
The interface is very simple , but in my program I had some very deep invoke of methods just like code below . We got a fiberHandler and inside call test(), then inside call test2(), then inside call test3() and then inside call test4() .


import co.paralleluniverse.fibers.Suspendable;
import io.vertx.core.Vertx;
import io.vertx.core.eventbus.EventBus;
import io.vertx.core.eventbus.Message;
import io.vertx.ext.sync.SyncVerticle;

import static io.vertx.ext.sync.Sync.awaitResult;
import static io.vertx.ext.sync.Sync.fiberHandler;

public class FiberTest extends SyncVerticle {

  FiberTest(Vertx vertx) {
    this.vertx = vertx;
  }

  public static final String ADDRESS = "some-address";

  public static void main(String[] args) {
    Vertx vertx = Vertx.vertx();
    vertx.deployVerticle(new FiberTest(vertx));
  }

  @Suspendable
  public String test() {
    System.out.println("method:test1");
    return test2();
  }

  public String test2() {
    System.out.println("method:test2");
    return test3();
  }

  @Suspendable
  public String test3() {
    System.out.println("method:test3");
    Message<String> reply = awaitResult(h -> vertx.eventBus().send(ADDRESS, "blah", h));
    return reply.body();
  }

  @Suspendable
  @Override
  public void start() throws Exception {
    EventBus eb = vertx.eventBus();
    eb.consumer(FiberTest.ADDRESS).handler(event -> event.reply("hello"));
    vertx
        .createHttpServer()
        .requestHandler(
            fiberHandler(
                req -> {
                  String test = test();
                  System.out.println(test);
                  req.response().end("blah");
                }))
        .listen(8080, "localhost");
  }
}

And I found that I must Annatation All the method of the call chain . If I miss the @Suspendable on test2() , some method would invoke twice like this .

method:test1
method:test2
method:test3
method:test1
method:test2
hello

Do I had a way that just Annatation the last method which indeed would Suspend?

Thank!

Why does this code loop indefinitely

ErrorCode

An infinite loop is triggered when I have more than one sync code in vert.x,error code in 49-54line.
image

ErrorMsg

image

RightCode

only one sync code in vert.x, is ok.
image

DeloyVerticle

image

Vertx 3.5.4/3.6.0-SNAPSHOT : Method called not from within a fiber

Hello,

I just discover the vertx-sync project and I find the main idea very interesting to facilitate the code readability.

I tried to test this feature but without success.

I reproduced the problem here : https://github.com/fperie/issue-vertx-sync

No results, I tried many vertx versions (3.5.4, 3.6.0-SNAPSHOT) and different versions of the quasar library (0.7.3, 0.7.5 and 0.7.10) !!
It is very strange.

At the beginning of the test, we see the following error in the console :

[quasar] ERROR: Unable to instrument class io/vertx/core/impl/DeploymentManager$DeploymentImpl
co.paralleluniverse.fibers.instrument.UnableToInstrumentException: Unable to instrument io/vertx/core/impl/DeploymentManager$DeploymentImpl#lambda$rollback$1(Ljava/lang/Throwable;Lio/vertx/core/impl/ContextInternal;Lio/vertx/core/Handler;Lio/vertx/core/impl/ContextImpl;Lio/vertx/core/AsyncResult;)V because of synchronization
	at co.paralleluniverse.fibers.instrument.InstrumentMethod.dumpCodeBlock(InstrumentMethod.java:720)
	at co.paralleluniverse.fibers.instrument.InstrumentMethod.accept(InstrumentMethod.java:415)
	at co.paralleluniverse.fibers.instrument.InstrumentClass.visitEnd(InstrumentClass.java:265)
	at co.paralleluniverse.asm.ClassReader.accept(Unknown Source)
	at co.paralleluniverse.asm.ClassReader.accept(Unknown Source)
	at co.paralleluniverse.fibers.instrument.QuasarInstrumentor.instrumentClass(QuasarInstrumentor.java:120)
	at co.paralleluniverse.fibers.instrument.QuasarInstrumentor.instrumentClass(QuasarInstrumentor.java:88)
	at co.paralleluniverse.fibers.instrument.JavaAgent$Transformer.transform(JavaAgent.java:187)
	at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
	at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at io.vertx.core.impl.DeploymentManager.doDeploy(DeploymentManager.java:473)
	at io.vertx.core.impl.DeploymentManager.deployVerticle(DeploymentManager.java:126)
	at io.vertx.core.impl.VertxImpl.deployVerticle(VertxImpl.java:652)
	at io.vertx.core.impl.VertxImpl.deployVerticle(VertxImpl.java:627)
	at io.vertx.core.impl.VertxImpl.deployVerticle(VertxImpl.java:593)
	at fr.issue.vertx.sync.TestVertxSyncInMyVerticleForTesting.beforeAll(TestVertxSyncInMyVerticleForTesting.java:40)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:515)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
	at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$invokeBeforeAllMethods$8(ClassTestDescriptor.java:373)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
	at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.invokeBeforeAllMethods(ClassTestDescriptor.java:372)
	at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.before(ClassTestDescriptor.java:201)
	at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.before(ClassTestDescriptor.java:74)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:102)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
	at java.util.ArrayList.forEach(ArrayList.java:1257)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:110)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220)
	at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188)
	at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
	at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:89)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
[quasar] ERROR: while transforming io/vertx/core/impl/DeploymentManager$DeploymentImpl: Unable to instrument io/vertx/core/impl/DeploymentManager$DeploymentImpl#lambda$rollback$1(Ljava/lang/Throwable;Lio/vertx/core/impl/ContextInternal;Lio/vertx/core/Handler;Lio/vertx/core/impl/ContextImpl;Lio/vertx/core/AsyncResult;)V because of synchronization
co.paralleluniverse.fibers.instrument.UnableToInstrumentException: Unable to instrument io/vertx/core/impl/DeploymentManager$DeploymentImpl#lambda$rollback$1(Ljava/lang/Throwable;Lio/vertx/core/impl/ContextInternal;Lio/vertx/core/Handler;Lio/vertx/core/impl/ContextImpl;Lio/vertx/core/AsyncResult;)V because of synchronization
	at co.paralleluniverse.fibers.instrument.InstrumentMethod.dumpCodeBlock(InstrumentMethod.java:720)
	at co.paralleluniverse.fibers.instrument.InstrumentMethod.accept(InstrumentMethod.java:415)
	at co.paralleluniverse.fibers.instrument.InstrumentClass.visitEnd(InstrumentClass.java:265)
	at co.paralleluniverse.asm.ClassReader.accept(Unknown Source)
	at co.paralleluniverse.asm.ClassReader.accept(Unknown Source)
	at co.paralleluniverse.fibers.instrument.QuasarInstrumentor.instrumentClass(QuasarInstrumentor.java:120)
	at co.paralleluniverse.fibers.instrument.QuasarInstrumentor.instrumentClass(QuasarInstrumentor.java:88)
	at co.paralleluniverse.fibers.instrument.JavaAgent$Transformer.transform(JavaAgent.java:187)
	at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
	at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at io.vertx.core.impl.DeploymentManager.doDeploy(DeploymentManager.java:473)
	at io.vertx.core.impl.DeploymentManager.deployVerticle(DeploymentManager.java:126)
	at io.vertx.core.impl.VertxImpl.deployVerticle(VertxImpl.java:652)
	at io.vertx.core.impl.VertxImpl.deployVerticle(VertxImpl.java:627)
	at io.vertx.core.impl.VertxImpl.deployVerticle(VertxImpl.java:593)
	at fr.issue.vertx.sync.TestVertxSyncInMyVerticleForTesting.beforeAll(TestVertxSyncInMyVerticleForTesting.java:40)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:515)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
	at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$invokeBeforeAllMethods$8(ClassTestDescriptor.java:373)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
	at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.invokeBeforeAllMethods(ClassTestDescriptor.java:372)
	at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.before(ClassTestDescriptor.java:201)
	at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.before(ClassTestDescriptor.java:74)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:102)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
	at java.util.ArrayList.forEach(ArrayList.java:1257)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:110)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220)
	at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188)
	at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
	at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:89)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

The test ends with this last error :

[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.026 s <<< FAILURE! - in fr.issue.vertx.sync.TestVertxSyncInMyVerticleForTesting
[ERROR] testLoadTheDormeurDuValPoem{VertxTestContext, Vertx}  Time elapsed: 0.46 s  <<< ERROR!
io.vertx.core.VertxException: java.lang.IllegalThreadStateException: Method called not from within a fiber
        at fr.issue.vertx.sync.TestVertxSyncInMyVerticleForTesting.testLoadTheDormeurDuValPoem(TestVertxSyncInMyVerticleForTesting.java:76)
**Caused by: java.lang.IllegalThreadStateException: Method called not from within a fiber**
        at fr.issue.vertx.sync.TestVertxSyncInMyVerticleForTesting.testLoadTheDormeurDuValPoem(TestVertxSyncInMyVerticleForTesting.java:76)

when function throw a Exception, report errors

public class TestVerticle extends SyncVerticle {
    @Override
    public void start() throws Exception {
        super.start();

        vertx.eventBus().localConsumer("Test", fiberHandler(req -> {
            try {
                this.test(req);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }));
    }

    @Suspendable
    public void test(Message<Object> message) throws Exception{
        long tid = awaitEvent(h -> vertx.setTimer(1000, h));
        System.out.println("1111111111111");
        message.reply(new JsonObject().put("test", "test"));
    }
}

when this method with throws Exception. It's report errors。

co.paralleluniverse.fibers.SuspendExecution: Oops. Forgot to instrument a method. Run your program with -Dco.paralleluniverse.fibers.verifyInstrumentation=true to catch the culprit!

awaitResult/fiberHandler behaviour

Hello,

I was playing with vertx fiberHandler example and I noticed that if two messages are sent on the eventBus (different address, same eventBus) in the same request, then the output is what I would expect it to be from two request.

If you take this example:

EventBus eb = vertx.eventBus();
    eb.consumer(ADDRESS1).handler(msg -> {
      System.out.println("Waiting");
      // reply after one second
      vertx.setTimer(1000, tid -> msg.reply("wibble"));
    });

    eb.consumer(ADDRESS2).handler(msg -> {
      System.out.println("Waiting");
      // reply after one second
      vertx.setTimer(1000, tid -> msg.reply("wibble"));
    });

    // If you want to do sync stuff in an async handler it must be transformed to a fiber handler
    vertx.createHttpServer().requestHandler(fiberHandler(req -> {

      // Send a message to address and wait for a reply
      Message<String> reply1 = awaitResult(h -> eb.send(ADDRESS1, "blah", h));
      Message<String> reply2 = awaitResult(h -> eb.send(ADDRESS2, "blah", h));

      System.out.println("Got reply: " + reply1.body());
      System.out.println("Got reply: " + reply2.body());

      req.response().end("blah");

    })).listen(8080, "localhost");

The output is

Waiting
Waiting
Got reply: wibble
Got reply: wibble
Waiting
Waiting
Got reply: wibble
Got reply: wibble

but I would expect

Waiting
Waiting
Got reply: wibble
Got reply: wibble

In general with N senders and N consumers the behaviour seems unpredictable. Not sure if a bug or I'm misusing the constructs awaitResult/fiberHandler.

Any elucidation on the matter will be appreciated.

Performance between Vertx callbacks and Vertx sync

Can you elaborate how does the performance between vertx callback and vertx sync compare. Also explain any usecase where vertx sync will not work.

I have web application. One api call requires coordination between 5-6 microservices, some can be async and some have dependency on other.

Also in general how does vertx compare with ratpack?

Suspending write stream

provide a transformation for WriteStream that suspends the fiber when the buffer is full and that resumes the fiber when the buffer is drained

Request to upgrade to 0.8.x of Quasar for JDK11 support

I've been trying (unsuccessfully) to use this with JDK 11 and Vert.x 3.7.0

Instrumenting with Quasar 0.7.10 produces numerous errors. Instrumenting with 0.8.0 complains that it cannot find the class io.vertx.core.buffer.Buffer.

Hoping if it the dep gets upgraded here the bug will surface and get resolved.


[ant:instrumentation] ERROR: io/vertx/core/buffer/Buffer
java.io.IOException: Class not found
	at co.paralleluniverse.asm.ClassReader.readStream(ClassReader.java:300)
	at co.paralleluniverse.asm.ClassReader.<init>(ClassReader.java:273)
	at co.paralleluniverse.fibers.instrument.MethodDatabase.extractSuperClass(MethodDatabase.java:364)
	at co.paralleluniverse.fibers.instrument.MethodDatabase.getDirectSuperClass(MethodDatabase.java:401)
	at co.paralleluniverse.fibers.instrument.MethodDatabase.getSuperClasses(MethodDatabase.java:382)
	at co.paralleluniverse.fibers.instrument.MethodDatabase.getCommonSuperClass(MethodDatabase.java:273)
	at co.paralleluniverse.fibers.instrument.DBClassWriter.getCommonSuperClass(DBClassWriter.java:50)
	at co.paralleluniverse.asm.SymbolTable.addMergedType(SymbolTable.java:1198)
	at co.paralleluniverse.asm.Frame.merge(Frame.java:1294)
	at co.paralleluniverse.asm.Frame.merge(Frame.java:1175)
	at co.paralleluniverse.asm.MethodWriter.computeAllFrames(MethodWriter.java:1617)
	at co.paralleluniverse.asm.MethodWriter.visitMaxs(MethodWriter.java:1553)
	at co.paralleluniverse.asm.tree.MethodNode.accept(MethodNode.java:810)
	at co.paralleluniverse.asm.util.CheckMethodAdapter$1.visitEnd(CheckMethodAdapter.java:460)
	at co.paralleluniverse.asm.MethodVisitor.visitEnd(MethodVisitor.java:778)
	at co.paralleluniverse.asm.util.CheckMethodAdapter.visitEnd(CheckMethodAdapter.java:1059)
	at co.paralleluniverse.asm.tree.MethodNode.accept(MethodNode.java:813)
	at co.paralleluniverse.asm.commons.JSRInlinerAdapter.visitEnd(JSRInlinerAdapter.java:150)
	at co.paralleluniverse.asm.MethodVisitor.visitEnd(MethodVisitor.java:778)
	at co.paralleluniverse.fibers.instrument.InstrumentClass$1.visitEnd(InstrumentClass.java:190)
	at co.paralleluniverse.asm.ClassReader.readMethod(ClassReader.java:1279)
	at co.paralleluniverse.asm.ClassReader.accept(ClassReader.java:679)
	at co.paralleluniverse.asm.ClassReader.accept(ClassReader.java:391)
	at co.paralleluniverse.fibers.instrument.QuasarInstrumentor.instrumentClass(QuasarInstrumentor.java:137)
	at co.paralleluniverse.fibers.instrument.QuasarInstrumentor.instrumentClass(QuasarInstrumentor.java:102)
	at co.paralleluniverse.fibers.instrument.InstrumentationTask.instrumentClass(InstrumentationTask.java:191)
	at co.paralleluniverse.fibers.instrument.InstrumentationTask.execute(InstrumentationTask.java:178)
	at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:293)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
	at groovy.util.AntBuilder.performTask(AntBuilder.java:338)
	at groovy.util.AntBuilder.nodeCompleted(AntBuilder.java:283)
	at org.gradle.api.internal.project.ant.BasicAntBuilder.nodeCompleted(BasicAntBuilder.java:78)
	at groovy.util.BuilderSupport.doInvokeMethod(BuilderSupport.java:154)
	at groovy.util.AntBuilder.doInvokeMethod(AntBuilder.java:218)
	at org.gradle.api.internal.project.ant.BasicAntBuilder.doInvokeMethod(BasicAntBuilder.java:103)
	at groovy.util.BuilderSupport.invokeMethod(BuilderSupport.java:67)
	at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:47)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:135)
	at build_4is3o8jehfqas15mu6tptiwit$_run_closure6$_closure10.doCall(/home/ryan/Workspace/gitlab.launchbadge.com/hedera/hedera-saft-portal/build.gradle:68)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:104)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:326)
	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:264)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
	at groovy.lang.Closure.call(Closure.java:411)
	at groovy.lang.Closure.call(Closure.java:427)
	at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:645)
	at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:618)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$5.run(ExecuteActionsTaskExecuter.java:404)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:393)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:376)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:80)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:213)
	at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:33)
	at java.base/java.util.Optional.orElseGet(Optional.java:369)
	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
	at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:58)
	at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:35)
	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48)
	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:33)
	at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:39)
	at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
	at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
	at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:35)
	at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
	at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:45)
	at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:31)
	at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:201)
	at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:70)
	at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:45)
	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
	at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:43)
	at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:32)
	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:96)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:89)
	at java.base/java.util.Optional.map(Optional.java:265)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:54)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38)
	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:77)
	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:90)
	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:48)
	at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:120)
	at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionStateTaskExecuter.execute(ResolveBeforeExecutionStateTaskExecuter.java:75)
	at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:62)
	at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:108)
	at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionOutputsTaskExecuter.execute(ResolveBeforeExecutionOutputsTaskExecuter.java:67)
	at org.gradle.api.internal.tasks.execution.StartSnapshotTaskInputsBuildOperationTaskExecuter.execute(StartSnapshotTaskInputsBuildOperationTaskExecuter.java:62)
	at org.gradle.api.internal.tasks.execution.ResolveAfterPreviousExecutionStateTaskExecuter.execute(ResolveAfterPreviousExecutionStateTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:94)
	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:95)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:73)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:49)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:49)
	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
	at java.base/java.lang.Thread.run(Thread.java:834)
[ant:instrumentation] WARNING: Can't determine super class of io/vertx/core/buffer/Buffer

See puniverse/quasar#327

vertx-sync direct scheduling question

Hi guys,

I came across a stacktrace where vertx-sync seems to start a fiber and then the very same thread executes it directly; I think this happens by default unless the context has a different scheduler: https://github.com/vert-x3/vertx-sync/blob/master/src/main/java/io/vertx/ext/sync/Sync.java#L198.

First of all, is my understanding correct? If so: since fibers are not continuations, in general they need a scheduler with some queue, so that fibers can interact correctly (there is a more elaborate discussion about this topic here puniverse/quasar#182 (comment)).

An idea could be to simply avoid executing directly the task but I don't know the idea behind the current scheduling approach and what the impacts could be. Could you elaborate on these aspects?

Thanks!

fiberHandler pins fibers to current context, instead of resuming a fiber on any idle event loop thread

When I use a handler on e.g. an HttpServer, I see multiple event loops in use handling things on multi-core systems. When I use fiberHandler, I only see fibers executing on a single event loop thread.

This appears to be by design, but in a typical use case of passing fiberHandler-wrapped Handler<RoutingContext>, for example, it negates the advantages of having the vertx "multi-reactor" pattern.

Can you recommend a fix to allow the fiber to resume on any event loop thread?


  /**
   * Convert a standard handler to a handler which runs on a fiber. This is necessary if you want to do fiber blocking
   * synchronous operations in your handler.
   *
   * @param handler  the standard handler
   * @param <T>  the event type of the handler
   * @return  a wrapped handler that runs the handler on a fiber
   */
  @Suspendable
  public static <T> Handler<T> fiberHandler(Handler<T> handler) {
    FiberScheduler scheduler = getContextScheduler();
    return p -> new Fiber<Void>(null, scheduler, DEFAULT_STACK_SIZE, () -> handler.handle(p)).start();
  }

java.lang.IllegalArgumentException: Class name mismatch: io.vertx.ext.sync.Sync

Hi,

I get an unexpected exception, if i use fiber handler in event bus and awaitResult().

getEventBus().consumer(eventName, Sync.fiberHandler((Message<ApiRequest> event) -> {
    //...

    //execute sql query to list rows of table
    List<JsonObject> rows = database.listRows("SELECT * FROM `" + database.getTableName("group_members") + "` WHERE `userID` = '" + userID + "'; ");//this line throws the exception

    //...
}

method Database::listRows():

@Override
public List<JsonObject> listRows (String sql) {
    ResultSet rs = awaitResult(h -> this.connection.query(sql, h));

    //get rows as list
    List<JsonObject> rows = rs.getRows();

    return rows;
}

Full exception:

Exception in Fiber "fiber-vertx.contextScheduler-10000002" java.lang.IllegalArgumentException: Class name mismatch: io.vertx.ext.sync.Sync, com.jukusoft.erp.core.module.base.service.menu.MenuController$$Lambda$217/1189700020
	at co.paralleluniverse.common.util.ExtendedStackTraceElement.<init>(ExtendedStackTraceElement.java:50)
	at co.paralleluniverse.common.util.ExtendedStackTraceElement.<init>(ExtendedStackTraceElement.java:39)
	at co.paralleluniverse.common.util.ExtendedStackTrace$BasicExtendedStackTraceElement.<init>(ExtendedStackTrace.java:178)
	at co.paralleluniverse.common.util.ExtendedStackTraceClassContext.get(ExtendedStackTraceClassContext.java:54)
	at co.paralleluniverse.fibers.Fiber.checkInstrumentation(Fiber.java:1634)
	at co.paralleluniverse.fibers.Fiber.checkInstrumentation(Fiber.java:1626)
	at co.paralleluniverse.fibers.Fiber.verifySuspend(Fiber.java:1599)
	at co.paralleluniverse.fibers.Stack.popMethod(Stack.java:153)
	at io.vertx.ext.sync.Sync.awaitResult(Sync.java:49)
	at com.jukusoft.erp.lib.database.MySQLDatabase.listRows(MySQLDatabase.java:291)
	at com.jukusoft.erp.lib.permission.PermissionService.listGroupIDsOfUser(PermissionService.java:139)
	at com.jukusoft.erp.lib.permission.PermissionService.listUserPermissionStates(PermissionService.java:168)
	at com.jukusoft.erp.lib.permission.PermissionService.listUserPermissions(PermissionService.java:187)
	at com.jukusoft.erp.lib.context.AppContextImpl.checkPermission(AppContextImpl.java:144)
	at com.jukusoft.erp.core.module.base.service.menu.MenuController.checkPermissions(MenuController.java:184)
	at com.jukusoft.erp.core.module.base.service.menu.MenuController.addSubMenusToJson(MenuController.java:135)
	at com.jukusoft.erp.core.module.base.service.menu.MenuController.lambda$listMenus$0(MenuController.java:97)
	at io.vertx.ext.sync.Sync.lambda$null$19031fba$1(Sync.java:148)
	at co.paralleluniverse.strands.SuspendableUtils$VoidSuspendableCallable.run(SuspendableUtils.java:44)
	at co.paralleluniverse.strands.SuspendableUtils$VoidSuspendableCallable.run(SuspendableUtils.java:32)
	at co.paralleluniverse.fibers.Fiber.run(Fiber.java:1027)
java.lang.IllegalArgumentException
	at co.paralleluniverse.asm.ClassReader.<init>(Unknown Source)
	at co.paralleluniverse.asm.ClassReader.<init>(Unknown Source)
	at co.paralleluniverse.asm.ClassReader.<init>(Unknown Source)
	at co.paralleluniverse.common.reflection.ASMUtil.accept(ASMUtil.java:63)
	at co.paralleluniverse.common.reflection.ASMUtil.accept(ASMUtil.java:80)
	at co.paralleluniverse.common.util.ExtendedStackTrace.getMethod(ExtendedStackTrace.java:96)
	at co.paralleluniverse.common.util.ExtendedStackTrace$BasicExtendedStackTraceElement.getMethod(ExtendedStackTrace.java:188)
	at co.paralleluniverse.fibers.instrument.SuspendableHelper.lookupMethod(SuspendableHelper.java:50)
	at co.paralleluniverse.fibers.Fiber.printTraceLine(Fiber.java:1699)
	at co.paralleluniverse.fibers.Fiber.checkInstrumentation(Fiber.java:1642)
	at co.paralleluniverse.fibers.Fiber.access$100(Fiber.java:79)
	at co.paralleluniverse.fibers.Fiber$1.uncaughtException(Fiber.java:119)
	at co.paralleluniverse.fibers.Fiber.onException(Fiber.java:1115)
	at co.paralleluniverse.fibers.Fiber.exec(Fiber.java:788)
	at co.paralleluniverse.fibers.RunnableFiberTask.doExec(RunnableFiberTask.java:95)
	at co.paralleluniverse.fibers.RunnableFiberTask.run(RunnableFiberTask.java:86)
	at io.vertx.ext.sync.Sync.lambda$getContextScheduler$2(Sync.java:198)
	at co.paralleluniverse.fibers.FiberExecutorScheduler.execute(FiberExecutorScheduler.java:77)
	at co.paralleluniverse.fibers.RunnableFiberTask.submit(RunnableFiberTask.java:289)
	at co.paralleluniverse.fibers.Fiber.start(Fiber.java:1058)
	at io.vertx.ext.sync.Sync.lambda$fiberHandler$0(Sync.java:148)
	at com.jukusoft.data.repository.MenuRepository.lambda$listMenusByMenuID$0(MenuRepository.java:55)
	at com.jukusoft.erp.lib.database.MySQLDatabase.lambda$listRows$5(MySQLDatabase.java:239)
	at io.vertx.core.impl.FutureImpl.setHandler(FutureImpl.java:81)
	at io.vertx.core.impl.ContextImpl.lambda$null$0(ContextImpl.java:294)
	at io.vertx.core.impl.ContextImpl.lambda$wrapTask$2(ContextImpl.java:344)
	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:463)
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
	at java.base/java.lang.Thread.run(Thread.java:844)
java.lang.IllegalArgumentException
	at co.paralleluniverse.asm.ClassReader.<init>(Unknown Source)
	at co.paralleluniverse.asm.ClassReader.<init>(Unknown Source)
	at co.paralleluniverse.asm.ClassReader.<init>(Unknown Source)
	at co.paralleluniverse.common.reflection.ASMUtil.accept(ASMUtil.java:63)
	at co.paralleluniverse.common.reflection.ASMUtil.accept(ASMUtil.java:80)
	at co.paralleluniverse.common.util.ExtendedStackTrace.getMethod(ExtendedStackTrace.java:96)
	at co.paralleluniverse.common.util.ExtendedStackTrace$BasicExtendedStackTraceElement.getMethod(ExtendedStackTrace.java:188)
	at co.paralleluniverse.fibers.instrument.SuspendableHelper.lookupMethod(SuspendableHelper.java:50)
	at co.paralleluniverse.fibers.Fiber.checkInstrumentation(Fiber.java:1650)
	at co.paralleluniverse.fibers.Fiber.access$100(Fiber.java:79)
	at co.paralleluniverse.fibers.Fiber$1.uncaughtException(Fiber.java:119)
	at co.paralleluniverse.fibers.Fiber.onException(Fiber.java:1115)
	at co.paralleluniverse.fibers.Fiber.exec(Fiber.java:788)
	at co.paralleluniverse.fibers.RunnableFiberTask.doExec(RunnableFiberTask.java:95)
	at co.paralleluniverse.fibers.RunnableFiberTask.run(RunnableFiberTask.java:86)
	at io.vertx.ext.sync.Sync.lambda$getContextScheduler$2(Sync.java:198)
	at co.paralleluniverse.fibers.FiberExecutorScheduler.execute(FiberExecutorScheduler.java:77)
	at co.paralleluniverse.fibers.RunnableFiberTask.submit(RunnableFiberTask.java:289)
	at co.paralleluniverse.fibers.Fiber.start(Fiber.java:1058)
	at io.vertx.ext.sync.Sync.lambda$fiberHandler$0(Sync.java:148)
	at com.jukusoft.data.repository.MenuRepository.lambda$listMenusByMenuID$0(MenuRepository.java:55)
	at com.jukusoft.erp.lib.database.MySQLDatabase.lambda$listRows$5(MySQLDatabase.java:239)
	at io.vertx.core.impl.FutureImpl.setHandler(FutureImpl.java:81)
	at io.vertx.core.impl.ContextImpl.lambda$null$0(ContextImpl.java:294)
	at io.vertx.core.impl.ContextImpl.lambda$wrapTask$2(ContextImpl.java:344)
	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:463)
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
	at java.base/java.lang.Thread.run(Thread.java:844)
WARNING: Uninstrumented methods (marked '**') or call-sites (marked '!!') detected on the call stack: 
	at co.paralleluniverse.common.util.ExtendedStackTraceElement.co.paralleluniverse.common.util.ExtendedStackTraceElement(java.lang.String,java.lang.String,java.lang.String,int,java.lang.Class,java.lang.reflect.Member,int) (ExtendedStackTraceElement.java:50) **
	at co.paralleluniverse.common.util.ExtendedStackTraceElement.<init> (ExtendedStackTraceElement.java:39) **
	at co.paralleluniverse.common.util.ExtendedStackTrace$BasicExtendedStackTraceElement.<init> (ExtendedStackTrace.java:178) **
	at co.paralleluniverse.common.util.ExtendedStackTraceClassContext.get (ExtendedStackTraceClassContext.java:54) **
	at co.paralleluniverse.fibers.Fiber.checkInstrumentation (Fiber.java:1634)
	at co.paralleluniverse.fibers.Fiber.checkInstrumentation (Fiber.java:1626)
	at co.paralleluniverse.fibers.Fiber.verifySuspend (Fiber.java:1599)
	at co.paralleluniverse.fibers.Stack.popMethod (Stack.java:153)
	at io.vertx.ext.sync.Sync.awaitResult (Sync.java:49)
	at com.jukusoft.erp.lib.database.MySQLDatabase.listRows (MySQLDatabase.java:291) **
	at com.jukusoft.erp.lib.permission.PermissionService.listGroupIDsOfUser (PermissionService.java:139) **
	at com.jukusoft.erp.lib.permission.PermissionService.listUserPermissionStates (PermissionService.java:168) **
	at com.jukusoft.erp.lib.permission.PermissionService.listUserPermissions (PermissionService.java:187) **
	at com.jukusoft.erp.lib.context.AppContextImpl.checkPermission (AppContextImpl.java:144) **
	at com.jukusoft.erp.core.module.base.service.menu.MenuController.checkPermissions (MenuController.java:184) **
	at com.jukusoft.erp.core.module.base.service.menu.MenuController.addSubMenusToJson (MenuController.java:135) **
	at com.jukusoft.erp.core.module.base.service.menu.MenuController.lambda$listMenus$0 (MenuController.java:97) **
	at io.vertx.ext.sync.Sync.lambda$null$19031fba$1 (Sync.java:148) (optimized)
	at co.paralleluniverse.strands.SuspendableUtils$VoidSuspendableCallable.run (SuspendableUtils.java:44)
	at co.paralleluniverse.strands.SuspendableUtils$VoidSuspendableCallable.run (SuspendableUtils.java:32)
	at co.paralleluniverse.fibers.Fiber.run (Fiber.java:1027)
	at co.paralleluniverse.fibers.Fiber.run1 (Fiber.java:1022)

What does this exception mean? How can i fix that?

Vert.x Sync sunset

This project is removed from Vert.x 5 replaced by Vert.x virtual threads.

vert.x 3.5.1 co.paralleluniverse.fibers.instrument.UnableToInstrumentException

I update vert.x from version 3.5.0 to 3.5.1,project run with errors, this is my shell

java -javaagent:/Users/xxx/.m2/repository/co/paralleluniverse/quasar-core/0.7.9/quasar-core-0.7.9.jar=b -Dvertx.zookeeper.config=./zookeeper.json -jar target/aaa-fat.jar -conf application-conf.json -cluster

[quasar] ERROR: Unable to instrument class io/vertx/core/impl/DeploymentManager$DeploymentImpl
co.paralleluniverse.fibers.instrument.UnableToInstrumentException: Unable to instrument io/vertx/core/impl/DeploymentManager$DeploymentImpl#lambda$rollback$1(Ljava/lang/Throwable;Lio/vertx/core/impl/ContextImpl;Lio/vertx/core/Handler;Lio/vertx/core/impl/ContextImpl;Lio/vertx/core/AsyncResult;)V because of synchronization
at co.paralleluniverse.fibers.instrument.InstrumentMethod.dumpCodeBlock(InstrumentMethod.java:720)
at co.paralleluniverse.fibers.instrument.InstrumentMethod.accept(InstrumentMethod.java:415)
at co.paralleluniverse.fibers.instrument.InstrumentClass.visitEnd(InstrumentClass.java:265)
at co.paralleluniverse.asm.ClassReader.accept(Unknown Source)
at co.paralleluniverse.asm.ClassReader.accept(Unknown Source)
at co.paralleluniverse.fibers.instrument.QuasarInstrumentor.instrumentClass(QuasarInstrumentor.java:120)
at co.paralleluniverse.fibers.instrument.QuasarInstrumentor.instrumentClass(QuasarInstrumentor.java:88)
at co.paralleluniverse.fibers.instrument.JavaAgent$Transformer.transform(JavaAgent.java:187)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at io.vertx.core.impl.DeploymentManager.doDeploy(DeploymentManager.java:465)
at io.vertx.core.impl.DeploymentManager.lambda$doDeployVerticle$2(DeploymentManager.java:203)
at io.vertx.core.impl.DeploymentManager$$Lambda$45/1076984738.handle(Unknown Source)
at io.vertx.core.impl.FutureImpl.setHandler(FutureImpl.java:76)
at io.vertx.core.impl.DeploymentManager.doDeployVerticle(DeploymentManager.java:171)
at io.vertx.core.impl.DeploymentManager.doDeployVerticle(DeploymentManager.java:143)
at io.vertx.core.impl.DeploymentManager.deployVerticle(DeploymentManager.java:131)
at io.vertx.core.impl.VertxImpl.deployVerticle(VertxImpl.java:665)
at io.vertx.core.Starter.runVerticle(Starter.java:328)
at io.vertx.core.Starter.run(Starter.java:138)
at io.vertx.core.Starter.main(Starter.java:96)

quasar error

Questions

Do not use this issue tracker to ask questions, instead use one of these channels. Questions will likely be closed without notice.

Version

Which version(s) did you encounter this bug ?
vert 3.8.3
quasar-core-0.7.3-jdk8.jar

Context

[quasar] WARNING: UnableToInstrumentException encountered when instrumenting io/vertx/core/impl/DeploymentManager$DeploymentImpl#lambda$null$4(Lio/vertx/core/AsyncResult;Ljava/util/concurrent/atomic/AtomicInteger;ILio/vertx/core/impl/ContextInternal;Lio/vertx/core/Handler;Ljava/util/concurrent/atomic/AtomicBoolean;Lio/vertx/core/AsyncResult;)V: Unable to instrument io/vertx/core/impl/DeploymentManager$DeploymentImpl#lambda$null$4(Lio/vertx/core/AsyncResult;Ljava/util/concurrent/atomic/AtomicInteger;ILio/vertx/core/impl/ContextInternal;Lio/vertx/core/Handler;Ljava/util/concurrent/atomic/AtomicBoolean;Lio/vertx/core/AsyncResult;)V because of synchronization
[quasar] ERROR: Unable to instrument class io/vertx/core/impl/DeploymentManager$DeploymentImpl
java.lang.NullPointerException
at co.paralleluniverse.asm.MethodWriter.visitMaxs(Unknown Source)
at co.paralleluniverse.asm.tree.MethodNode.accept(Unknown Source)
at co.paralleluniverse.fibers.instrument.InstrumentClass.visitEnd(InstrumentClass.java:260)
at co.paralleluniverse.asm.ClassReader.accept(Unknown Source)
at co.paralleluniverse.asm.ClassReader.accept(Unknown Source)
at co.paralleluniverse.fibers.instrument.QuasarInstrumentor.instrumentClass(QuasarInstrumentor.java:134)
at co.paralleluniverse.fibers.instrument.QuasarInstrumentor.instrumentClass(QuasarInstrumentor.java:94)
at co.paralleluniverse.fibers.instrument.JavaAgent$Transformer.transform(JavaAgent.java:209)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at io.vertx.core.impl.DeploymentManager.doDeploy(DeploymentManager.java:537)
at io.vertx.core.impl.DeploymentManager.lambda$doDeployVerticle$2(DeploymentManager.java:217)
at io.vertx.core.impl.DeploymentManager$$Lambda$9/1350269431.handle(Unknown Source)
at io.vertx.core.impl.FutureImpl.setHandler(FutureImpl.java:80)
at io.vertx.core.impl.DeploymentManager.doDeployVerticle(DeploymentManager.java:183)
at io.vertx.core.impl.DeploymentManager.doDeployVerticle(DeploymentManager.java:156)
at io.vertx.core.impl.DeploymentManager.deployVerticle(DeploymentManager.java:145)
at io.vertx.core.impl.VertxImpl.deployVerticle(VertxImpl.java:681)
at io.vertx.core.Starter.runVerticle(Starter.java:328)
at io.vertx.core.Starter.run(Starter.java:138)
at io.vertx.core.Starter.main(Starter.java:96)
[quasar] ERROR: while transforming io/vertx/core/impl/DeploymentManager$DeploymentImpl: null
java.lang.NullPointerException
at co.paralleluniverse.asm.MethodWriter.visitMaxs(Unknown Source)
at co.paralleluniverse.asm.tree.MethodNode.accept(Unknown Source)
at co.paralleluniverse.fibers.instrument.InstrumentClass.visitEnd(InstrumentClass.java:260)
at co.paralleluniverse.asm.ClassReader.accept(Unknown Source)
at co.paralleluniverse.asm.ClassReader.accept(Unknown Source)
at co.paralleluniverse.fibers.instrument.QuasarInstrumentor.instrumentClass(QuasarInstrumentor.java:134)
at co.paralleluniverse.fibers.instrument.QuasarInstrumentor.instrumentClass(QuasarInstrumentor.java:94)
at co.paralleluniverse.fibers.instrument.JavaAgent$Transformer.transform(JavaAgent.java:209)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at io.vertx.core.impl.DeploymentManager.doDeploy(DeploymentManager.java:537)
at io.vertx.core.impl.DeploymentManager.lambda$doDeployVerticle$2(DeploymentManager.java:217)
at io.vertx.core.impl.DeploymentManager$$Lambda$9/1350269431.handle(Unknown Source)
at io.vertx.core.impl.FutureImpl.setHandler(FutureImpl.java:80)
at io.vertx.core.impl.DeploymentManager.doDeployVerticle(DeploymentManager.java:183)
at io.vertx.core.impl.DeploymentManager.doDeployVerticle(DeploymentManager.java:156)
at io.vertx.core.impl.DeploymentManager.deployVerticle(DeploymentManager.java:145)
at io.vertx.core.impl.VertxImpl.deployVerticle(VertxImpl.java:681)
at io.vertx.core.Starter.runVerticle(Starter.java:328)
at io.vertx.core.Starter.run(Starter.java:138)
at io.vertx.core.Starter.main(Starter.java:96)

Do you have a reproducer?

A reproducer is a simple project hosted on GitHub (or another forge supporting git clone operation) that has a build file that can be executed to reproduce the issue.

Reproducers are very helpful for contributors and will likely help them fixing your bug faster.

  • Link to github project/gist

Steps to reproduce

  1. ...
  2. ...
  3. ...
  4. ...

Extra

  • Anything that can be relevant such as OS version, JVM version

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.