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

Coordinated Restore at Checkpoint #631

Open
stbischof opened this issue Oct 17, 2023 · 28 comments
Open

Coordinated Restore at Checkpoint #631

stbischof opened this issue Oct 17, 2023 · 28 comments
Labels
requirements Requirements discussiomn

Comments

@stbischof
Copy link
Contributor

Dirk Fauth @fipro78 tries to bring in crac Support.

Main issues seems to be open File Handles in the create Checkpoint stage.

Why are they open, and could they be closed? and on restore be opened?

What must be specified (hooks?) here that the Frameworks must support?

What are the implications to the Feature Launcher #386

https://openjdk.org/projects/crac/
https://docs.azul.com/core/crac/crac-introduction

@tjwatson
Copy link
Contributor

Why would a framework need to close files on checkpoint?

I have extensive experience dealing with checkpoint and restore with an OSGi framework (Equinox) with Liberty InstantOn:

https://openliberty.io/blog/2023/09/26/spring-boot-3-instant-on.html
https://openliberty.io/blog/2023/06/29/rapid-startup-instanton.html

No changes were needed to the Framework to deal with using CRIU (which Azul CRaC uses under the covers) to checkpoint the Java process. I've had to make plenty of changes to Open Liberty to prepare and restore the runtime above the framework. But nothing in the framework needed to change to make this work.

@tjwatson
Copy link
Contributor

Nobody should put a dependency on jdk.crac/javax.crac at this point. That would make it impossible to use other checkpoint/restore solutions. A vendor neutral dependency would be on org.crac. That is what the Spring project depends on so that it can run on any JVM (not just Azul JVM). That is also something I've also implemented on top of Liberty InstantOn for the Spring Boot 3 enablement shown in https://openliberty.io/blog/2023/09/26/spring-boot-3-instant-on.html

@stbischof
Copy link
Contributor Author

just some additional info: https://github.com/CRaC/docs/blob/master/STEP-BY-STEP.md

@fipro78
Copy link

fipro78 commented Oct 18, 2023

I today had a short discussion with @HanSolo and found out that there is no JSR for CRaC but a JEP is in preparation.

Why would a framework need to close files on checkpoint?

I don't know. If I try to create a checkpoint with the Azul CRaC feature I get several exceptions like this:

An exception during a checkpoint operation:
jdk.internal.crac.mirror.CheckpointException
        Suppressed: jdk.internal.crac.mirror.impl.CheckpointOpenFileException: /home/fipro/dev/osgi_deployment_options/org.fipro.service.app/target/deployment/folder_based/app/plugins/org.apache.felix.scr-2.2.6.jar
                at java.base/jdk.internal.crac.JDKFileResource.lambda$beforeCheckpoint$1(JDKFileResource.java:84)
                at java.base/jdk.internal.crac.mirror.Core.checkpointRestore1(Core.java:173)
                at java.base/jdk.internal.crac.mirror.Core.checkpointRestore(Core.java:298)
                at java.base/jdk.internal.crac.mirror.Core.checkpointRestoreInternal(Core.java:311)

This is also documented here:
https://docs.azul.com/core/crac/crac-errors

Maybe someone from the OpenJDK or Azul team could answer this? @HanSolo could you answer this or add someone from the CRaC team to this ticket so we can get more technical details? This would definitely help in adding support for creating checkpoints via CRaC for an OSGi application.

@HanSolo
Copy link

HanSolo commented Oct 18, 2023

To answer the question about "Why would a framework need to close files on checkpoint?" -> When creating a checkpoint, the state of the JVM incl. the application will be stored to a set of files. If the application has a file open at the time of the checkpoint, it will assume that this file is still open after the restore procedure. But if no one re-opens this file after restore, the application will crash. This is the reason for the Resource interface which has the two methods beforeCheckpoint() and afterRestore(). In case you use a framework which might have itself files or any kind of socket connection open, the framework also needs to close and re-establish these connections after restore. This usually cannot be done by the developer of the application but the framework needs to support CRaC (implement the Resource interface at the right places) to be able to close and re-establish these connections independent from the application that is using the framework.

@tjwatson
Copy link
Contributor

Files the framework has open for loading bundle content there is an assumption that the underlying file content is constant from the checkpoint to the restore. Any scenario that attempts to change the content of such bundle files from checkpoint to restore will be invalid. Checkpoint should not fail for scenarios where the file cannot change from checkpoint to restore. CRIU itself allows for this kind of scenario with no issues. It will fail to restore if such files change content from the checkpoint to the restore.

I don't want to add something to the OSGi core specification that forces a framework to do prepare/restore operations on resources that must not and cannot change between checkpoint and restore. That will result in many complicated questions to answer around what the framework must do when the bundle file content is missing or changed between the checkpoint and restore.

@HanSolo
Copy link

HanSolo commented Oct 19, 2023

Why should these files change between checkpoint and restore? If we checkpoint the JVM incl. Frameworks and Apps, after a restore the Framework and Apps will assume these files are still open, because for them nothing changed between checkpoint and restore. But the connection to the files is gone because at checkpoint the JVM was shutdown. When re-opening the files after restore everything is fine. You don’t need to force anyone to do something, it’s more a support for checkpoint/restore on framework level. Same thing was implemented in Micronaut and currently in Spring 6.1. This is to help users to make use of checkpoint/restore, not to force anyone to do something.

@fipro78
Copy link

fipro78 commented Oct 19, 2023

So, what I understand so far is:

  • The OSGi framework (in my case Equinox) keeps the bundle jar files open. Probably for runtime performance reasons.
  • This causes a CheckpointOpenFileException when trying to create a checkpoint with the Azul implementation
  • But this works with the OpenJ9 CRIU support

@HanSolo statet:

But the connection to the files is gone because at checkpoint the JVM was shutdown.

This would imply that there is a technical limitation to also have the open file handling to be done on checkpoint and restore.

@tjwatson statet:

CRIU itself allows for this kind of scenario with no issues.

That sounds to me like there is no technical limitation in handling the open files on checkpoint and restore.

The question now is, which direction to go next. Is the statement actually correct that it technically is possible to handle open files in checkpoint creation and restore? Would that then be an option to be added to the Azul/OpenJDK CRaC support? Or is Equinox automatically able to deal with the scenario that the connection to an open file is gone an recreates it? That would actually mean that we would need some option in the Azul CRaC VM to no fail on open files. Maybe configurable somehow?

Adding @jjh-aicas to the discussion, as he has some experience in that topic as far as I understood from talking to him.

BTW:

Same thing was implemented in Micronaut and currently in Spring 6.1.

IIUC the CRaC support using the org.crac API there is more about automatically creating a checkpoint at a certain point of time when it makes sense from the framework point of view. Not about open resources. Right? Or was there any other support added?

@HanSolo
Copy link

HanSolo commented Oct 19, 2023

Related to Spring/Micronaut integration: If you use resources managed by Spring for example, it will automatically close and re-open them for you without the need to implement the Resource interface on your own.

@HanSolo
Copy link

HanSolo commented Oct 19, 2023

If OpenJ9 InstantOn is working it should also be possible to make it work with the OpenJDK implementation. IBM uses the exact same idea and also use CRIU. Will check with them.

@tjwatson
Copy link
Contributor

That sounds to me like there is no technical limitation in handling the open files on checkpoint and restore.

There is no technical limitation in CRIU. @ymanton can confirm as a contributor to CRIU from OpenJ9.

@tjwatson
Copy link
Contributor

What I think is more interesting to talk about from an OSGi specification POV is what should happen if a service is registered with the service interface org.crac.Resource.

I can imagine an implementation (in a bundle outside of the framework) tracking org.crac.Resource resources to provide a resource registry. This implementation would register a single org.crac.Resource with the global context and then it would track org.crac.Resource that get dynamically registered/unregistered. Then on prepare/restore that single resource registry would call out to the available org.crac.Resource. This would allow control over ordering by using service ranking so the order of hook calls would not be up to registration order like it is for when registering the resource directly with the global context.

Then we can talk about how other things should behave in the checkpoint/restore scenario for other resources like the ones managed by the data source service or the JPA service specification.

@tjwatson
Copy link
Contributor

  • The OSGi framework (in my case Equinox) keeps the bundle jar files open. Probably for runtime performance reasons.

I think most class loaders will keep a JarFile open for performance reasons vs. open/close it each time a class is read. That being said, Equinox does keep a default (set to 100) number of JarFiles open. If more then 100 bundles are installed then it will start closing JarFiles that are least used. This was necessary to reduce the number of file handles necessary to install something like 1000s of bundles at the same time. Some OS'es (e.g. Linux) can put limits on the number of file handles it will allow a process to keep open.

So it is not technically impossible for the framework to close the bundle resources. But for checkpoint/restore scenarios that should not be required if we assume the content of the file must not change between checkpoint/restore.

But there will be loads of issues trying to implement a strategy that requires the framework to close all resources on prepare. Just one example is the fact that prepare is called while other threads are still running. what is the framework to do if it has closed all bundle resources in the prepare thread but then after it closes one of the bundle resources then another active thread needs to load a class from the closed resource?

  • The framework cannot simply open/read/close because the checkpointing thread may move on and actually start the checkpoint in the JVM. At that point the JVM will detect an open file and fail.
  • The framework cannot simply start thrown runtime exceptions

Both options would lead to randomly failing. One will be a random failure to load a class, leaving the process in a bad state before checkpoint. The other will randomly fail checkpoint.

@stbischof stbischof added the requirements Requirements discussiomn label Oct 19, 2023
@ymanton
Copy link

ymanton commented Oct 19, 2023

That sounds to me like there is no technical limitation in handling the open files on checkpoint and restore.

There is no technical limitation in CRIU. @ymanton can confirm as a contributor to CRIU from OpenJ9.

This is correct; processes having open files can be checkpointed and restored. Aside from special cases, the files themselves are not part of the checkpoint, only some metadata about them is remembered (path, size, etc) and CRIU will check on restore that open files are still in the same locations and sizes haven't changed and then re-open, or else abort the restore.

@fipro78
Copy link

fipro78 commented Oct 19, 2023

@ymanton are open sockets handled the same way by criu? Or could that be an issue?

@tjwatson
Copy link
Contributor

tjwatson commented Oct 19, 2023

@ymanton are open sockets handled the same way by criu? Or could that be an issue?

I believe open sockets can be handled by CRIU if you are using certain options (e.g. criu option --tcp-established). But in general I would advise against having open sockets before checkpoint. In particular, it would make it difficult to consider scenarios like trying to restore the same container image into multiple instances of the application and each instances being able to restore the "same" connection over and over.

We avoid having any open sockets before checkpoint.

@ymanton
Copy link

ymanton commented Oct 19, 2023

@fipro78, sockets can be re-established, but it depends on the type of socket and usually requires additional steps. Listening sockets are the simplest and can usually be restored transparently. Connected sockets are a different story. The easiest case in this category is sockets that are not bound to specific devices and where the protocol supports (and users expect) broken connections, where CRIU can just break the connection and both sides can handle it as usual. Dealing with such sockets by instead trying to reconnect them, or sockets bound to specific devices, or with other kinds of sockets that users don't expect to break (e.g. local, netlink) is more involved.

As @tjwatson suggests it's easier to sidestep these issues by closing all sockets across checkpoint/restore. Some of what CRIU can do makes sense for process migration, which deals with a single logical instance of the program, but not for startup improvement, where we want to restore multiple instances of the checkpointed program.

@AntonKozlov
Copy link

AntonKozlov commented Oct 19, 2023

Hi all,

First of all, thanks for the try-out! In CRaC, those CheckpointOpenResourceException are built to provide the safety of the checkpoint image, so there should be no implicit dependencies on the state of OS or the filesystem. CRaC does not distinguish sockets and files, and reports any possible problem at the checkpoint time, so you won't find your image does not restore later because of an implicit dependency.

The exception

CheckpointOpenFileException: /home/fipro/dev/osgi_deployment_options/org.fipro.service.app/target/deployment/folder_based/app/plugins/org.apache.felix.scr-2.2.6.jar

means there is an open file, and CRaC implementation does not have any assumptions about it. So, for example, if the file is gone for some reason, the VM will just be unable to restore . The common rule is indeed to close such files for checkpoint, and open then again on restoration. Then you'd be able to handle all the situations: the file is gone, the file has been changed, etc. For example, if this is a configuration file, you may re-read and re-apply the config.

But it's clear that in some cases it's useful just to assume file will be always there, as provided by containers. So, you can communicate this via command line settings, see FD Policies doc. The functionallity will be available since crac-17+6, and will be included in zulu17.46 and zulu21.30. You can specify automatic closing and reopening the file, and if, for example, the file is gone, you'll get the java exception that you'll be able to handle. You can also can configure action: ignore and let the CRIU handle the file, but this is not recomended. Please note, the FD Policices are inteded to substitute the common and simple approaches for handling resources, but in more complex cases you'd very likely need to implement a java code.

The org.crac provides the Resrouce interface that allows arbitrary handling of resources, including sockets and files on checkpoint. Usually the handling is pretty simple. AFAIU you already maintain the cache of 100 jars and there is a mechanism to keep them under the limit. In similar cases, it was enough to lower limit temporarily to 0, that will effectively close every jar. Probably, you may also need to block threads which are trying to load new classes from opening jars while checkpoint is in progress. All of this should work only during checkpoint and restoration.

@stbischof
Copy link
Contributor Author

Hi Anton,

thank you a lot for this explanation. Estecialy the FD Policies will help a lot.
The usecase that brought this up was a in container setup on an level of just getting an osgi Framework started on Crac. This will help further investigation.

@fipro78
Copy link

fipro78 commented Oct 20, 2023

@AntonKozlov
Thanks for the reply. It really sounds like the FD Policies would indeed help to solve the issue.

I noticed on https://cdn.azul.com/zulu/bin/ that the versions you mentioned are not yet available. When will those versions be available for testing?

And btw, is it possible to create a custom JRE via jlink that supports CRaC, and create a checkpoint with that? This would make it possible to create the smallest possible runtime for an application with the fast startup via checkpoint.

@AntonKozlov
Copy link

The builds are expected, hopefully, this week.

Jlink can be made to work, but unfortunately a workaround is required https://github.com/CRaC/example-lambda/blob/master/crac-steps.sh#L18. In the rest, jlinked image works fine. This is not an excuse for not fixing it :) Sorry, the problem was not tracked. Now we'll look for the fix.

@laeubi
Copy link
Contributor

laeubi commented Oct 25, 2023

I think basically from the Framework POV we need some kind to "join at a checkpoint" so an agent can ask the Framework to join (and other items like DS as well) to have some kind of barrier where it stops, then a Checkpoint can be created and then everything goes on (probably to the next checkpoint).

Something similar is already described here: https://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.coordinator.html

@stbischof stbischof changed the title Coordinated Restore at Checkpoint - Open File handles Coordinated Restore at Checkpoint Oct 25, 2023
@tjwatson
Copy link
Contributor

tjwatson commented Oct 25, 2023

I think basically from the Framework POV we need some kind to "join at a checkpoint" so an agent can ask the Framework to join (and other items like DS as well) to have some kind of barrier where it stops, then a Checkpoint can be created and then everything goes on (probably to the next checkpoint).

How would the framework know where to stop? I'm not following this idea. If someone wants to drive a discussion on requirements we should have them consider following the requirements process: https://github.com/osgi/osgi/blob/main/CONTRIBUTING.md#requirements-discussion

@fipro78
Copy link

fipro78 commented Nov 14, 2023

@AntonKozlov
I did some testing of the newest Azul OpenJDK CRaC versions. With the file descriptor policies I am able to deal with the open resource issues. But I encounter other issues now.

I have created a small setup with scripts to execute the multi-step process for creating a Docker container with a checkpoint. After running the build_crac_image.[bat|sh] script, the container can be started from the image osgi_deployment_crac.

I followed the documentation Running CRaC in a Virtualized Environment (Docker) to create the images.

If I use ubuntu:20.04 as base image...

Issue 1:

Start the container with the checkpoint data via

docker run -it --rm --name restore_test osgi_deployment_crac

You will see the following error:

Error (criu/cr-restore.c:1518): Can't fork for 8: Operation not permitted
Error (criu/cr-restore.c:2605): Restoring FAILED.

So it looks like CAP_CHECKPOINT_RESTORE is also required on restore. The documentation doesn't say that this is necessary.

Issue 2:

Start the container with the checkpoint data via

docker run -it --rm --cap-add=CHECKPOINT_RESTORE --cap-add=SYS_PTRACE --name restore_test osgi_deployment_crac

You will see the following error:

8: Error (criu/tty.c:843): tty: Can't set tty params on 0x14, trying to skip...: Operation not permitted

Even adding --cap-add=SYS_TTY_CONFIG doesn't change anything.

I have no idea what the issue might be.

If I use ubuntu:22.04 as base image...

Issue 3:

Using ubuntu:22.04 I directly get an error at checkpoint creation:

CR: Checkpoint ...
CRIU failed with exit code 1 - check /opt/crac-files/dump4.log
Command: /opt/jdk/lib/criu dump -t 8 -D /opt/crac-files --shell-job -v4 -o dump4.log
JVM: invalid info for restore provided: queued code -1
An exception during a checkpoint operation:
jdk.internal.crac.mirror.CheckpointException
        Suppressed: java.lang.RuntimeException: Native checkpoint failed.
                at java.base/jdk.internal.crac.mirror.Core.translateJVMExceptions(Core.java:109)
                at java.base/jdk.internal.crac.mirror.Core.checkpointRestore1(Core.java:188)
                at java.base/jdk.internal.crac.mirror.Core.checkpointRestore(Core.java:286)
                at java.base/jdk.internal.crac.mirror.Core.checkpointRestoreInternal(Core.java:299)

Checking the dump4.log file the infos at the end of the file are:

(00.114757) 8 has rseq_inited = 1
(00.114759) Error (criu/cr-dump.c:205): 8 has rseq but kernel lacks get_rseq_conf feature
(00.114762) ----------------------------------------
(00.114764) Error (criu/cr-dump.c:1676): Dump core (pid: 8) failed with -1
(00.114785) Waiting for 8 to trap
(00.114796) Daemon 8 exited trapping
(00.114803) Sent msg to daemon 3 0 0
(00.114809) Force no-breakpoints restore
(00.114877) 8 was trapped
(00.114888) 8 (native) is going to execute the syscall 45, required is 15
(00.114922) 8 was trapped
(00.114927) `- Expecting exit
(00.114963) 8 was trapped
(00.114970) 8 (native) is going to execute the syscall 186, required is 15
(00.115029) 8 was trapped
(00.115035) `- Expecting exit
(00.115133) 8 was trapped
(00.115141) 8 (native) is going to execute the syscall 1, required is 15
pie: 8: __fetched msg: 3 0 0
(00.115278) 8 was trapped
(00.115286) `- Expecting exit
(00.115347) 8 was trapped
(00.115355) 8 (native) is going to execute the syscall 186, required is 15
(00.115417) 8 was trapped
(00.115428) `- Expecting exit
(00.115470) 8 was trapped
(00.115480) 8 (native) is going to execute the syscall 186, required is 15
(00.115541) 8 was trapped
(00.115548) `- Expecting exit
(00.115634) 8 was trapped
(00.115646) 8 (native) is going to execute the syscall 1, required is 15
pie: 8: 8: new_sp=0x7f7eeaff5dc8 ip 0x7f7f702f9115
(00.115784) 8 was trapped
(00.115791) `- Expecting exit
(00.115856) 8 was trapped
(00.115864) 8 (native) is going to execute the syscall 3, required is 15
(00.115928) 8 was trapped
(00.115934) `- Expecting exit
(00.115991) 8 was trapped
(00.116029) 8 (native) is going to execute the syscall 3, required is 15
(00.116093) 8 was trapped
(00.116099) `- Expecting exit
(00.116156) 8 was trapped
(00.116164) 8 (native) is going to execute the syscall 15, required is 15
(00.116300) 8 was stopped
(00.116575) Unlock network
(00.116582) Unfreezing tasks into 1
(00.116585)      Unseizing 8 into 1
(00.117848) Error (criu/cr-dump.c:2063): Dumping FAILED.

When I try to start the container creation with Podman I get the following error:

(00.033077) Wait for ack 66 on daemon socket
pie: 3: __fetched msg: 66 0 0
pie: 3: Error (criu/pie/parasite.c:92): Can't splice pages to pipe (-1/0/0)
pie: 3: __sent ack msg: 66 66 -1
pie: 3: Close the control socket for writing
pie: 3: Daemon waits for command
(00.033136) Fetched ack: 66 66 -1
(00.033146) Error (compel/src/lib/infect-rpc.c:68): Command 66 for daemon failed with -1
(00.033172) page-pipe: Killing page pipe
(00.033318) ----------------------------------------
(00.033322) Error (criu/mem.c:625): Can't dump page with parasite
(00.033352) Waiting for 3 to trap
(00.033366) Daemon 3 exited trapping
(00.033390) Sent msg to daemon 3 0 0
(00.033396) Force no-breakpoints restore
(00.033449) 3 was trapped
(00.033458) 3 (native) is going to execute the syscall 45, required is 15
(00.033517) 3 was trapped
(00.033524) `- Expecting exit
(00.033586) 3 was trapped
(00.033598) 3 (native) is going to execute the syscall 186, required is 15
(00.033668) 3 was trapped
(00.033677) `- Expecting exit

I have no idea what is going wrong. Is it an issue on Windows? Is it not possible to create a checkpoint for my app? Is something else missing?

The attached zip archive contains four folders. The crac_ folders contain the Dockerfiles and the scripts to build the containers. I tried to run the scripts from Windows directly and from an Ubuntu 20.04 WSL.

Maybe someone can test this on Linux or Mac? Or maybe someone sees what I have done wrong?

CRaC_Test.zip

P.S. the criu_ folders contain the same example using OpenJ9 CRIU Support. There I can't even create the checkpoints.
The discussion about this is taking place at the openj9 GitHub repository: eclipse-openj9/openj9#18229

@AntonKozlov
Should I start a discussion somewhere with the Azul Support? Not sure if the issue is related to the OSGi setup or a more general criu/crac issue.

@AntonKozlov
Copy link

Hi @fipro78, with small modifications, the test runs on linux-x64. But we'll check it on WSL, thanks for the ready-to-use example.

--- a/CRaC_Test/crac_executable/create_checkpoint.sh
+++ b/CRaC_Test.new/crac_executable/create_checkpoint.sh
@@ -1,7 +1,8 @@
 # sleep for 5 seconds to ensure everything is ready
 sleep 5
 # get the PID of the java execution
-PIDJ=$(ps -ef | grep -v grep | grep java | awk '{print $2}')
+# PIDJ=$(ps -ef | grep -v grep | grep java | awk '{print $2}')
 # create the checkpoint
+PIDJ=app.jar
 echo "execute: jcmd $PIDJ JDK.checkpoint"
-jcmd $PIDJ JDK.checkpoint
\ No newline at end of file
+jcmd $PIDJ JDK.checkpoint
diff --git a/CRaC_Test/crac_executable/start.sh b/CRaC_Test.new/crac_executable/start.sh
index dde81af..e905908 100644
--- a/CRaC_Test/crac_executable/start.sh
+++ b/CRaC_Test.new/crac_executable/start.sh
@@ -3,4 +3,4 @@
 # ( echo 128 > /proc/sys/kernel/ns_last_pid ) 2>/dev/null || while [ $(cat /proc/sys/kernel/ns_last_pid) -lt 128 ]; do :; done;
 # java $JAVA_OPTS $JAVA_OPTS_EXTRA -jar app.jar "$@"
 # replace the line above with the following line to open the app with a console instead of a socket
-java $JAVA_OPTS $JAVA_OPTS_EXTRA -Dgosh.args="" -jar app.jar "$@"
\ No newline at end of file
+exec java $JAVA_OPTS $JAVA_OPTS_EXTRA -Dgosh.args="" -jar app.jar "$@"

In order to restore without additional capabilities, java have to be PID 1 process. We'll improve the docs with a note.

The example prints the TTY error, which can be neglected

anton@mercury:~/Downloads$ docker run -it --rm --name restore_test osgi_deployment_crac
   129: Error (criu/tty.c:843): tty: Can't set tty params on 0x14, trying to skip...: Operation not permitted

g!

It seems CRIU attempts to retore TTY setting, but it will be more correct to do this in CRaC JVM.

This indeed does not directly relate to OSGi project. So we can continue the discussion via support@azul.com. Or should we create a repo with an example under github.com/crac/...?

@fipro78
Copy link

fipro78 commented Nov 14, 2023

@AntonKozlov thanks for looking into this. I will try your modifications also in my prepared setups.

I am totally open about the further discussion. Once it works I wanted to blog about it anyway. What would you like to be in the repository?

@AntonKozlov
Copy link

@fipro78,

What would you like to be in the repository?

I think a simple demo would be more than enough. The archive you posted looks like a good starting point. We'd be able add some CI, documentations, etc incrementally.

@fipro78
Copy link

fipro78 commented Nov 15, 2023

@AntonKozlov
Sounds good to me. Would be actually even one of the really interesting use cases to create container images with checkpoint data to improve the container startup time. Having this working with an OSGi example would be nice from our point of view of course. ;)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
requirements Requirements discussiomn
Projects
None yet
Development

No branches or pull requests

7 participants