line / armeria

Your go-to microservice framework for any situation, from the creator of Netty et al. You can build any type of microservice leveraging your favorite technologies, including gRPC, Thrift, Kotlin, Retrofit, Reactive Streams, Spring Boot and Dropwizard.
https://armeria.dev
Apache License 2.0
4.79k stars 909 forks source link

Replace `synchonized` block with `ReentrantLock` to make virtual thread friendly #4510

Open ikhoon opened 1 year ago

ikhoon commented 1 year ago

There is a current known limitation that code should avoid using a synchronized block for the virtual thread.

Related work:

Bue-von-hon commented 1 year ago

hello @ikhoon I would like to work on this issue Could you please provide a little more information e.g. XXX.class has to be fix.(it seem to be so many file has sync block) Thank you very much in advance.

ikhoon commented 1 year ago

We need to fix all classes in Armeria that use synchronized blocks. It is difficult to fix all files at once. Why don't we divide the files into each module?

$ ag --java --ignore-dir gen-src -w -c synchronized 
rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/RequestContextAssembly.java:2
rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/RequestContextAssembly.java:2
core/src/main/java/com/linecorp/armeria/internal/server/servlet/ServletTlsAttributes.java:1
core/src/main/java/com/linecorp/armeria/internal/server/annotation/AnnotatedValueResolver.java:1
core/src/main/java/com/linecorp/armeria/internal/server/annotation/AnnotatedBeanFactoryRegistry.java:1
core/src/main/java/com/linecorp/armeria/internal/common/util/MinifiedBouncyCastleProvider.java:2
core/src/main/java/com/linecorp/armeria/internal/common/stream/TwoElementFixedStreamMessage.java:1
core/src/main/java/com/linecorp/armeria/internal/common/ReflectiveDependencyInjector.java:2
core/src/main/java/com/linecorp/armeria/internal/common/metric/CaffeineMetricSupport.java:2
core/src/main/java/com/linecorp/armeria/server/healthcheck/HealthCheckService.java:3
core/src/main/java/com/linecorp/armeria/server/Server.java:6
core/src/main/java/com/linecorp/armeria/common/util/AbstractOption.java:3
core/src/main/java/com/linecorp/armeria/common/util/AbstractListenable.java:3
core/src/main/java/com/linecorp/armeria/common/util/ShutdownHooks.java:1
core/src/main/java/com/linecorp/armeria/common/util/CompositeException.java:2
core/src/main/java/com/linecorp/armeria/common/util/StartStopSupport.java:3
core/src/main/java/com/linecorp/armeria/common/DefaultConcurrentAttributes.java:3
core/src/main/java/com/linecorp/armeria/common/stream/DefaultStreamMessageDuplicator.java:1
core/src/main/java/com/linecorp/armeria/common/stream/DefaultStreamMessage.java:1
core/src/main/java/com/linecorp/armeria/common/DefaultDependencyInjector.java:2
core/src/main/java/com/linecorp/armeria/common/logging/RequestScopedMdc.java:4
core/src/main/java/com/linecorp/armeria/common/logging/DefaultRequestLog.java:2
core/src/main/java/com/linecorp/armeria/client/DefaultEventLoopScheduler.java:1
core/src/main/java/com/linecorp/armeria/client/OneEventLoopState.java:2
core/src/main/java/com/linecorp/armeria/client/HeapBasedEventLoopState.java:2
core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/HealthCheckedEndpointGroup.java:6
core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/HttpHealthChecker.java:2
core/src/main/java/com/linecorp/armeria/client/endpoint/FileWatcherRegistry.java:3
core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/DefaultHealthCheckerContext.java:7
core/src/main/java/com/linecorp/armeria/client/endpoint/WeightedRandomDistributionEndpointSelector.java:1
core/src/main/java/com/linecorp/armeria/client/endpoint/RestartableThread.java:2
tomcat9/src/main/java/com/linecorp/armeria/server/tomcat/JarSubsetResourceSet.java:1
grpc/src/test/java/com/linecorp/armeria/internal/common/grpc/TestServiceImpl.java:7
grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/ArmeriaClientCall.java:1
grpc/src/main/java/com/linecorp/armeria/server/grpc/AbstractServerCall.java:2
grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcHealthCheckService.java:4
retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/ArmeriaCallFactory.java:1
retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/PipeBuffer.java:5
resteasy/src/main/java/com/linecorp/armeria/server/resteasy/ResteasyAsynchronousResponseImpl.java:6
grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/AbstractMessageDeframer.java:2
benchmarks/jmh/src/jmh/java/com/linecorp/armeria/common/stream/StreamMessageBenchmark.java:1
reactor3/src/main/java/com/linecorp/armeria/common/reactor3/RequestContextHooks.java:2
spring/boot2-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaWebServer.java:2
spring/boot2-autoconfigure/src/main/java/com/linecorp/armeria/spring/AbstractArmeriaBeanPostProcessor.java:2

We may start with common/util and move on to client/endpoint and so on. In fact, the order does not matter. You can pick anything you want. 😉

Bue-von-hon commented 1 year ago

thank you kindly then i'll start with common/util until early next week (it has 12 sync block)👍👍

mscheong01 commented 1 year ago

I'm also willing to do a part if it's welcome 😄

Bue-von-hon commented 1 year ago

I'm also willing to do a part if it's welcome 😄

glad to work with you!! @j-min5u 😆 i'm working on common/util What is it like for you to work on client/endpoint if it's ok

mscheong01 commented 1 year ago

@Bue-von-hon Sure 😸 I'll get to it 🙌 I'll also see if I could remove the other three files under client/

ikhoon commented 1 year ago

If all migration has finished, it would be worth prohibiting synchronized block with a checkstyle rule.

mscheong01 commented 1 year ago

I'll do internal/ + server/ next @Bue-von-hon if you do the other files under common/, we'll be done with the core module 😃

Bue-von-hon commented 1 year ago

I'll do internal/ + server/ next @Bue-von-hon if you do the other files under common/, we'll be done with the core module 😃

ok I'll replace under common/🛠

daniel-itunu commented 1 year ago

@Bue-von-hon @j-min5u joining you guys here. what other module are yet to be done?

Bue-von-hon commented 1 year ago

@Bue-von-hon @j-min5u joining you guys here. what other module are yet to be done?

@daniel-itunu I'm working on a common module right now.🙂

daniel-itunu commented 1 year ago

@Bue-von-hon @j-min5u joining you guys here. what other module are yet to be done?

@daniel-itunu I'm working on a common module right now.🙂 Nice, thanks. taking a look.

mscheong01 commented 1 year ago

@daniel-itunu we're currently working on the core module. you could work on other modules like rxjava2/, rxjava3/, grpc/, retrofit2/, etc