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

Speedup ContextInstances::removeEach if there are null instances #38737

Closed
wants to merge 1 commit into from

Conversation

franz1981
Copy link
Contributor

@franz1981 franz1981 commented Feb 12, 2024

This change was due to:

image

which has a compute as

image

in short: is the case where there's a generated ContextInstances with N > 1 instances fields but just a single one computed (ie not null).
Before this PR we are going to perform 3 * N atomic volatile ops (using strong memory barriers), despite just 1 would be necessary.
The 3 atomic ops are:
ie:

  1. lock
  2. volatile store null on the instance field
  3. unlock

@mkouba @Ladicek

I have no idea which cutoff value make sense here and, as said in the previous comment at

  1. volatile store null on the instance field

this is another small problem, which could be solved by using VarHandle::setRelease(..., null) on the volatile instance field, while holding the lock, but I would raise this in a separate PR.
TBH this one is already decent, because it saves the 3 atomic ops to happen in one go; but is assuming that when a value is null is a terminal behavior and if a compute happen concurrently, remove can still observe it as uninitialized.

My only concern ATM is that we have (regardless this PR) a lot of "undefined" states in the 2 ContextInstances impls, which are prone to both optimizations/concurrency misbehaviour, and I would like, in a separate issue, to state which ones are admissible/wrong/rare but still admissible based on how we use things.

@quarkus-bot quarkus-bot bot added the area/arc Issue related to ARC (dependency injection) label Feb 12, 2024
@franz1981
Copy link
Contributor Author

@mkouba what surprise me (mostly because I'm very ignorant on the topic) is that an empty quarkus application (not even an hello world endpoint) still generate 2 ContextInstances:

  • Request scoped with 3 fields
  • Application scoped with 6 fields

I would like to understand what is deciding how many fields should be created, if possible

This comment has been minimized.

@mkouba
Copy link
Contributor

mkouba commented Feb 13, 2024

@mkouba what surprise me (mostly because I'm very ignorant on the topic) is that an empty quarkus application (not even an hello world endpoint) still generate 2 ContextInstances:

* Request scoped with 3 fields

* Application scoped with 6 fields

I would like to understand what is deciding how many fields should be created, if possible

Each field represents a bean of the given scope. Since your app is empty these beans are provided by the extensions. They are also unremovable; either by definition or marked by an extension.

Copy link

quarkus-bot bot commented Feb 13, 2024

Status for workflow Quarkus CI

This is the status report for running Quarkus CI on commit 2ab88ae.

✅ The latest workflow run for the pull request has completed successfully.

It should be safe to merge provided you have a look at the other checks in the summary.


Flaky tests - Develocity

⚙️ JVM Tests - JDK 21

📦 extensions/smallrye-reactive-messaging-kafka/deployment

io.quarkus.smallrye.reactivemessaging.kafka.deployment.dev.KafkaDevServicesDevModeTestCase.sseStream - History

  • Assertion condition Expecting size of: [] to be greater than or equal to 2 but was 0 within 10 seconds. - org.awaitility.core.ConditionTimeoutException
org.awaitility.core.ConditionTimeoutException: 
Assertion condition 
Expecting size of:
  []
to be greater than or equal to 2 but was 0 within 10 seconds.
	at org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.awaitility.core.AssertionCondition.await(AssertionCondition.java:119)
	at org.awaitility.core.AssertionCondition.await(AssertionCondition.java:31)

⚙️ Maven Tests - JDK 17

📦 integration-tests/maven

io.quarkus.maven.it.DevMojoIT.testThatNewResourcesAreServed - History

  • io.quarkus.maven.it.DevMojoIT expected "1f743fa4-2517-492d-91a5-43ed32f62901" but was "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." within 2 minutes. - org.awaitility.core.ConditionTimeoutException
org.awaitility.core.ConditionTimeoutException: io.quarkus.maven.it.DevMojoIT expected "1f743fa4-2517-492d-91a5-43ed32f62901" but was "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." within 2 minutes.
	at org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.awaitility.core.AbstractHamcrestCondition.await(AbstractHamcrestCondition.java:86)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:985)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:691)
	at io.quarkus.maven.it.DevMojoIT.testThatNewResourcesAreServed(DevMojoIT.java:967)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  • io.quarkus.maven.it.DevMojoIT expected "1ab2686b-c386-4bcf-a02b-aa28300cc709" but was "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." within 2 minutes. - org.awaitility.core.ConditionTimeoutException
org.awaitility.core.ConditionTimeoutException: io.quarkus.maven.it.DevMojoIT expected "1ab2686b-c386-4bcf-a02b-aa28300cc709" but was "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." within 2 minutes.
	at org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.awaitility.core.AbstractHamcrestCondition.await(AbstractHamcrestCondition.java:86)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:985)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:691)
	at io.quarkus.maven.it.DevMojoIT.testThatNewResourcesAreServed(DevMojoIT.java:967)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  • io.quarkus.maven.it.DevMojoIT expected "8df463cf-ace8-4376-9820-77b169f3bac9" but was "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." within 2 minutes. - org.awaitility.core.ConditionTimeoutException
org.awaitility.core.ConditionTimeoutException: io.quarkus.maven.it.DevMojoIT expected "8df463cf-ace8-4376-9820-77b169f3bac9" but was "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." within 2 minutes.
	at org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.awaitility.core.AbstractHamcrestCondition.await(AbstractHamcrestCondition.java:86)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:985)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:691)
	at io.quarkus.maven.it.DevMojoIT.testThatNewResourcesAreServed(DevMojoIT.java:967)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)

io.quarkus.maven.it.DevMojoIT.testThatNewResourcesAreServed - History

  • io.quarkus.maven.it.DevMojoIT expected "1f743fa4-2517-492d-91a5-43ed32f62901" but was "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." within 2 minutes. - org.awaitility.core.ConditionTimeoutException
org.awaitility.core.ConditionTimeoutException: io.quarkus.maven.it.DevMojoIT expected "1f743fa4-2517-492d-91a5-43ed32f62901" but was "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." within 2 minutes.
	at org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.awaitility.core.AbstractHamcrestCondition.await(AbstractHamcrestCondition.java:86)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:985)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:691)
	at io.quarkus.maven.it.DevMojoIT.testThatNewResourcesAreServed(DevMojoIT.java:967)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  • io.quarkus.maven.it.DevMojoIT expected "1ab2686b-c386-4bcf-a02b-aa28300cc709" but was "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." within 2 minutes. - org.awaitility.core.ConditionTimeoutException
org.awaitility.core.ConditionTimeoutException: io.quarkus.maven.it.DevMojoIT expected "1ab2686b-c386-4bcf-a02b-aa28300cc709" but was "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." within 2 minutes.
	at org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.awaitility.core.AbstractHamcrestCondition.await(AbstractHamcrestCondition.java:86)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:985)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:691)
	at io.quarkus.maven.it.DevMojoIT.testThatNewResourcesAreServed(DevMojoIT.java:967)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  • io.quarkus.maven.it.DevMojoIT expected "8df463cf-ace8-4376-9820-77b169f3bac9" but was "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." within 2 minutes. - org.awaitility.core.ConditionTimeoutException
org.awaitility.core.ConditionTimeoutException: io.quarkus.maven.it.DevMojoIT expected "8df463cf-ace8-4376-9820-77b169f3bac9" but was "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." within 2 minutes.
	at org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.awaitility.core.AbstractHamcrestCondition.await(AbstractHamcrestCondition.java:86)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:985)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:691)
	at io.quarkus.maven.it.DevMojoIT.testThatNewResourcesAreServed(DevMojoIT.java:967)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)

@franz1981
Copy link
Contributor Author

@mkouba @Ladicek no idea if the failures are related or not...

@franz1981
Copy link
Contributor Author

@Ladicek @mkouba putting this on draft: this could be a better and more complete fix -> https://github.com/franz1981/quarkus/commits/main_lazy_ctx_instances/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/arc Issue related to ARC (dependency injection) area/rest triage/flaky-test triage/invalid This doesn't seem right
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants