[crac] RFR: Fix ordering of invocation on Resources [v13]

Anton Kozlov akozlov at openjdk.org
Thu May 11 16:11:51 UTC 2023


On Wed, 10 May 2023 12:49:03 GMT, Radim Vansa <duke at openjdk.org> wrote:

>> * keeps the original handling of exceptions: afterRestore is called even if beforeCheckpoint throws
>> * allows to register a resource in a context that did not start beforeCheckpoint invocations yet
>> * registering resource in previous/running context fails the checkpoint but does not trigger exception immediately
>>    * instead this will be one of the recorded exceptions and the resource has a chance to fire next time
>> * allowed registration of resources can be invoked from other thread without deadlock; illegal registration can deadlock, though
>
> Radim Vansa has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Revert removing the logging configuration

I got this after some unrelated modifications (FileDescriptor.beforeCheckpoint uses lambda), and I apparently get auto-deadlock with a single thread involved:


"main" #1 prio=5 os_prio=0 cpu=88.95ms elapsed=21.61s tid=0x00007fd670025160 nid=0x27228a in Object.wait()  [0x00007fd6747fd000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(java.base at 17-internal/Native Method)
	- waiting on <0x0000000418002088> (a jdk.internal.crac.JDKContext)
	at java.lang.Object.wait(java.base at 17-internal/Object.java:338)
	at jdk.crac.impl.AbstractContextImpl.waitWhileCheckpointIsInProgress(java.base at 17-internal/AbstractContextImpl.java:102)
	at jdk.crac.impl.PriorityContext.register(java.base at 17-internal/PriorityContext.java:44)
	- locked <0x0000000418002088> (a jdk.internal.crac.JDKContext)
	at jdk.internal.crac.JDKContext.register(java.base at 17-internal/JDKContext.java:97)
	at jdk.internal.ref.CleanerImpl$PhantomCleanableRef.<init>(java.base at 17-internal/CleanerImpl.java:170)
	at java.lang.ref.Cleaner.register(java.base at 17-internal/Cleaner.java:220)
	at java.lang.invoke.MethodHandleNatives$CallSiteContext.make(java.base at 17-internal/MethodHandleNatives.java:90)
	at java.lang.invoke.CallSite.<init>(java.base at 17-internal/CallSite.java:144)
	at java.lang.invoke.ConstantCallSite.<init>(java.base at 17-internal/ConstantCallSite.java:50)
	at java.lang.invoke.InnerClassLambdaMetafactory.buildCallSite(java.base at 17-internal/InnerClassLambdaMetafactory.java:270)
	at java.lang.invoke.LambdaMetafactory.metafactory(java.base at 17-internal/LambdaMetafactory.java:341)
	at java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(java.base at 17-internal/DirectMethodHandle$Holder)
	at java.lang.invoke.Invokers$Holder.invokeExact_MT(java.base at 17-internal/Invokers$Holder)
	at java.lang.invoke.BootstrapMethodInvoker.invoke(java.base at 17-internal/BootstrapMethodInvoker.java:134)
	at java.lang.invoke.CallSite.makeSite(java.base at 17-internal/CallSite.java:315)
	at java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(java.base at 17-internal/MethodHandleNatives.java:281)
	at java.lang.invoke.MethodHandleNatives.linkCallSite(java.base at 17-internal/MethodHandleNatives.java:271)
	at java.io.FileDescriptor$Resource.beforeCheckpoint(java.base at 17-internal/FileDescriptor.java:74)
	at jdk.crac.impl.PriorityContext$SubContext.invokeBeforeCheckpoint(java.base at 17-internal/PriorityContext.java:107)
	at jdk.crac.impl.OrderedContext.runBeforeCheckpoint(java.base at 17-internal/OrderedContext.java:70)
	at jdk.crac.impl.AbstractContextImpl.beforeCheckpoint(java.base at 17-internal/AbstractContextImpl.java:81)
	at jdk.crac.impl.AbstractContextImpl.invokeBeforeCheckpoint(java.base at 17-internal/AbstractContextImpl.java:41)
	at jdk.crac.impl.PriorityContext.runBeforeCheckpoint(java.base at 17-internal/PriorityContext.java:70)
	at jdk.crac.impl.AbstractContextImpl.beforeCheckpoint(java.base at 17-internal/AbstractContextImpl.java:81)
	at jdk.internal.crac.JDKContext.beforeCheckpoint(java.base at 17-internal/JDKContext.java:85)
	at jdk.crac.impl.AbstractContextImpl.invokeBeforeCheckpoint(java.base at 17-internal/AbstractContextImpl.java:41)
	at jdk.crac.impl.OrderedContext.runBeforeCheckpoint(java.base at 17-internal/OrderedContext.java:70)
	at jdk.crac.impl.AbstractContextImpl.beforeCheckpoint(java.base at 17-internal/AbstractContextImpl.java:81)
	at jdk.crac.Core.checkpointRestore1(java.base at 17-internal/Core.java:116)
	at jdk.crac.Core.checkpointRestore(java.base at 17-internal/Core.java:256)
	- locked <0x0000000418002118> (a java.lang.Object)
	at jdk.crac.Core.checkpointRestore(java.base at 17-internal/Core.java:241)
	at CheckpointWithOpenFdsTest.exec(CheckpointWithOpenFdsTest.java:49)
	at jdk.test.lib.crac.CracTest.run(CracTest.java:157)
	at jdk.test.lib.crac.CracTest.main(CracTest.java:89)

-------------

PR Comment: https://git.openjdk.org/crac/pull/60#issuecomment-1544268184


More information about the crac-dev mailing list