<div dir="ltr"><div dir="ltr"><br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div><br></div><div>@Dan, this is very interesting! </div><div>Could you please elaborate a bit further. Perhaps in the context of the CrackDemoExt.java sample? </div></div></div></blockquote><div><br></div><div>Let me think on that.  I'll see if I can pull something together that shows the api use.</div></div></div></blockquote><div><br></div><div>I put together a small example showing the use of SwitchPoint to toggle between phases: normal mode, beforeCheckpoint, afterRestore, normal mode. [0]</div><div><br></div><div>In the CRaCPhase class, there are two methods that take Function arguments that allow the user to provide phase-specific behaviour:</div><div>* beforeGuard which allows a switching from normal mode to checkpoint mode: <a href="https://github.com/DanHeidinga/SwitchPointExample/blob/b09fdb2a5d203950abc9de4facbd1435585bf3af/CRaCPhase.java#L15">https://github.com/DanHeidinga/SwitchPointExample/blob/b09fdb2a5d203950abc9de4facbd1435585bf3af/CRaCPhase.java#L15</a></div><div><br></div><div>* aroundGuard which allows switching from normal mode to checkpoint mode and back to normal mode: <a href="https://github.com/DanHeidinga/SwitchPointExample/blob/b09fdb2a5d203950abc9de4facbd1435585bf3af/CRaCPhase.java#L28">https://github.com/DanHeidinga/SwitchPointExample/blob/b09fdb2a5d203950abc9de4facbd1435585bf3af/CRaCPhase.java#L28</a></div><div><br></div><div>There's a use of this pattern in the "Test" class [1] which transitions from a regular get to a locked get.</div><div><br></div><div>The ideas are all there though the code is a little unpleasant to work with due to the exception handling and general complexity of MethodHandles.</div><div><br></div><div>Radim has an RCU lock that use Switchpoints as well though his API appears to be more pleasant for users: <a href="https://github.com/openjdk/crac/pull/58/files">https://github.com/openjdk/crac/pull/58/files</a></div><div><br></div><div><br></div><div>[0] <a href="https://github.com/DanHeidinga/SwitchPointExample/blob/main/CRaCPhase.java">https://github.com/DanHeidinga/SwitchPointExample/blob/main/CRaCPhase.java</a></div><div>[1] <a href="https://github.com/DanHeidinga/SwitchPointExample/blob/b09fdb2a5d203950abc9de4facbd1435585bf3af/CRaCPhase.java#L114-L140">https://github.com/DanHeidinga/SwitchPointExample/blob/b09fdb2a5d203950abc9de4facbd1435585bf3af/CRaCPhase.java#L114-L140</a></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div><br></div><div>--Dan</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div><br></div><div>Needs more exploration and prototyping but would provide a potential path to reasonable performance by burying the extra locking in the fallback paths.  And it would be a single pattern to optimize, rather than all the variations users could produce.</div><div>--Dan</div><div>[0] <a href="https://blog.openj9.org/2022/10/14/openj9-criu-support-a-look-under-the-hood/" target="_blank">https://blog.openj9.org/2022/10/14/openj9-criu-support-a-look-under-the-hood/</a><br></div><div>[1] <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/invoke/SwitchPoint.html" target="_blank">https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/invoke/SwitchPoint.html</a></div></div></div></blockquote><div><br></div><div>Thank you,</div><div> - Christian</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Cheers,<br>
<br>
Radim<br>
<br>
[1] <a href="https://en.wikipedia.org/wiki/Read-copy-update" rel="noreferrer" target="_blank">https://en.wikipedia.org/wiki/Read-copy-update</a><br>
<br>
On 03. 04. 23 22:30, Christian Tzolov wrote:<br>
> Hi, I'm testing CRaC in the context of long-running applications (e.g. streaming, continuous processing ...) and I've stumbled on an issue related to the coordination of the resolved threads.<br>
><br>
> For example, let's have a Processor that performs continuous computations. This processor depends on a ProcessorContext and later must be fully initialized before the processor can process any data.<br>
><br>
> When the application is first started (e.g. not from checkpoints) it ensures that the ProcessorContext is initialized before starting the Processor loop.<br>
><br>
> To leverage CRaC I've implemented a ProcessorContextResource gracefully stops the context on beforeCheckpoint and then re-initialized it on afterRestore.<br>
><br>
> When the checkpoint is performed, CRaC calls the ProcessorContextResource.beforeCheckpoint and also preserves the current Processor call stack. On Restore processor's call stack is expectedly restored at the point it was stopped but unfortunately it doesn't wait for the ProcessorContextResource.afterRestore complete. This expectedly crashes the processor.<br>
><br>
> The <a href="https://github.com/tzolov/crac-demo" rel="noreferrer" target="_blank">https://github.com/tzolov/crac-demo</a> illustreates this issue. The README explains how to reproduce the issue. The OUTPUT.md (<a href="https://github.com/tzolov/crac-demo/blob/main/OUTPUT.md" rel="noreferrer" target="_blank">https://github.com/tzolov/crac-demo/blob/main/OUTPUT.md</a> ) offers terminal snapshots of the observed behavior.<br>
><br>
> I've used latest JDK CRaC release:<br>
>    openjdk 17-crac 2021-09-14<br>
>    OpenJDK Runtime Environment (build 17-crac+5-19)<br>
>    OpenJDK 64-Bit Server VM (build 17-crac+5-19, mixed mode, sharing)<br>
><br>
> As I'm new to CRaC, I'd appreciate your thoughts on this issue.<br>
><br>
> Cheers,<br>
> Christian<br>
><br>
><br>
><br>
><br>
<br>
</blockquote></div></div>
</blockquote></div></div>
</blockquote></div></div>
</blockquote></div></div>