[CRIU] [PATCH 3/4] unix: add ability to set callbacks for external sockets

Cyrill Gorcunov gorcunov at gmail.com
Sun Dec 1 14:12:59 PST 2013


On Sat, Nov 30, 2013 at 09:43:55PM +0400, Andrey Vagin wrote:
> We don't know a state behind an external socket. It depends on logic
> of the program, which handles this socket.
> 
> This patch adds ability to load a library with callbacks for dumping
> and restoring external sockets.
> 
> This patch introduces two callbacks cr_dump_unix_sk and
> cr_restore_unix_sk. If a callback can not handle a socket, it
> must return CR_SK_SKIP.
> 
> The main questions, what kind of information should be tranfered in
> these callbacks. Pls, think a few minutes about that and send me
> your opinion.

OK, here are my thoughts.

Naming convention
=================

The library functions better could be named with some greppable prefix,
say criu_plugin__, so the libraries would have been exporting

 criu_plugin__init(int action)
 criu_plugin__fini(int status)

note the calling criu_plugin__fini() is important as well since external libraries
may have been doing something on its own and will to cleanup own resources
(int err in criu_plugin__fini should inform the library if dumping/restore is successed,
 since we restore processes with sigreturn, the __fini should be called
 right before it I think).

Data exchange with libraries
============================

I think we might pass protobuf objects to libraries because it's extendable
so if one day you need to pass more insformation to library you simply update
protobuf file.

Headers
=======

If people start providing own libraries to criu, we need some api headers
for that (which would include error codes and such, your CR_CB_SKIP,
criu__init/fini prototypes and the rest).

For all image objects which migh need own dump restore handlers I guess we could
provide special type in protobuf files. Something like

message criu_plugin_hook {
	bool		dump	= 1;
	bool		restore	= 2;
}

thus socket will be something like

--- a/protobuf/sk-unix.proto
+++ b/protobuf/sk-unix.proto
@@ -39,4 +39,5 @@ message unix_sk_entry {
        optional sk_shutdown            shutdown        = 12;

        optional file_perms_entry	file_perms	= 13;
	optional criu_plugin_hook	plugin_hook	= 14;
 }

When we meet a soket which must be additionaly handled, we pass
unix_sk_entry into a hook function:

	int criu_plugin__dump_unix_socket(unix_sk_entry *e)
	{
		library doing something with this socket
		and resturns

			< 0 -- error happened
			= 0 -- successfully handled

		and it sets plugin_hook.restore = true if it will
		need this entry to be handled on restore, or false
		if nothing is needed
	}

once function handled this entry in criu code we set plugin_hook.dump
to true, pointing out that the entry on image were handled by external
library as well (this will help debuggin).

Thus in short it should be like

Dump
----
	criu					plugin
	====					======
	try_to_dump_with_callback
						criu_plugin__dump_unix_socket()
						  plugin_hook.restore = true
	plugin_hook.dump = true
	write image

Restore
-------
	criu					plugin
	====					======
	open_unixsk_standalone
	  if (plugin_hook.restore)
						criu_plugin__restore_unix_socket()
						  = 0 on success
						  < 1 on error

Again, since you're sending socket fd into plugin we might need own
protobuf entry for that, not unix_sk_desc. But I think using protobuf
here would be a win.


More information about the CRIU mailing list