[CRIU] [PATCH 3/3] unix: allow --external unix[ino]:string

Ruslan Kuprieiev rkuprieiev at cloudlinux.com
Wed Jan 11 12:11:49 PST 2017


Sure, I'll look into it and will provide new patch set shortly.

Thanks

On 01/11/2017 10:13 PM, Pavel Emelyanov wrote:
> On 01/11/2017 02:59 PM, Ruslan Kuprieiev wrote:
>> Doing it on dump adds a benefit of not having to remember anything for
>> restore.
>> If this option will be available only on restore, I would have to
>> remember socket ino till
>> restore to set up this option, which I'm trying to avoid altogether.
>>
>> Can we maybe have this option both on dump and restore?
> OK, bet also note that the format --external unix[id]:string is reserved
> for the case when the unix socket in question is connect()-ed to the
> path $string. So I'd also appreciate if you introduce some ... I don't
> know, syntax inside the string so that we could add the functionality
> in question later. Would you? :)
>
> -- Pavel
>
>> On 01/11/2017 12:36 PM, Pavel Emelyanov wrote:
>>> On 01/10/2017 04:01 PM, Ruslan Kuprieiev wrote:
>>>> On dump, if --external unix[ino]:foo is specified, criu will treat
>>>> specified unix socket almost the same
>>>> way it handles criu service socket. It will dump it as closed and will
>>>> put "foo" string into images, to put
>>>> that "foo" string into that socket on restore. This is almost identical
>>>> to what criu does with service
>>>> socket, but instead of putting a Criu_Resp message into it on restore,
>>>> it puts an arbitrary string.
>>> Ah, I see. I think, that adding a message to send after restore should be
>>> a restore-time option and the string in question shouldn't sit in images.
>>> Can you tune the patches to make it so?
>>>
>>>> On 01/10/2017 02:56 PM, Pavel Emelyanov wrote:
>>>>> On 01/05/2017 03:42 PM, Ruslan Kuprieiev wrote:
>>>>>
>>>>> Can you elaborate what this option should do? It's not 100% clear
>>>>> from the code.
>>>>>
>>>>>> Needles to say that it's useful for debug, but this is also
>>>>>> very useful when you syncronise checkpoint/restore whith a
>>>>>> dumpee using unix socketpair and want it to painlessly
>>>>>> receive notification on restore.
>>>>>>
>>>>>> Signed-off-by: Ruslan Kuprieiev <rkuprieiev at cloudlinux.com>
>>>>>> ---
>>>>>>     criu/sk-unix.c       | 23 +++++++++++++++++++++--
>>>>>>     images/sk-unix.proto |  5 +++++
>>>>>>     2 files changed, 26 insertions(+), 2 deletions(-)
>>>>>>
>>>>>> diff --git a/criu/sk-unix.c b/criu/sk-unix.c
>>>>>> index 5cbe07a..4527dd6 100644
>>>>>> --- a/criu/sk-unix.c
>>>>>> +++ b/criu/sk-unix.c
>>>>>> @@ -263,6 +263,8 @@ static int dump_one_unix_fd(int lfd, u32 id, const struct fd_parms *p)
>>>>>>     	SkOptsEntry *skopts;
>>>>>>     	FilePermsEntry *perms;
>>>>>>     	FownEntry *fown;
>>>>>> +	char buf[PATH_MAX];
>>>>>> +	char *ext = NULL;
>>>>>>     
>>>>>>     	ue = xmalloc(sizeof(UnixSkEntry) +
>>>>>>     			sizeof(SkOptsEntry) +
>>>>>> @@ -322,6 +324,16 @@ static int dump_one_unix_fd(int lfd, u32 id, const struct fd_parms *p)
>>>>>>     		ue->uflags |= USK_SERVICE;
>>>>>>     	}
>>>>>>     
>>>>>> +	/* Same as with service_sk, but for custom sockets */
>>>>>> +	snprintf(buf, sizeof(buf), "unix[%u]", ue->peer);
>>>>>> +	ext = external_lookup_by_key(buf);
>>>>>> +	if (unlikely(!IS_ERR_OR_NULL(ext))) {
>>>>>> +		ue->state = TCP_CLOSE;
>>>>>> +		ue->peer = 0;
>>>>>> +		ue->uflags |= USK_SERVICE;
>>>>>> +		ue->stub = (void *)strtok(ext, ":");
>>>>>> +	}
>>>>>> +
>>>>>>     	if (sk->namelen && *sk->name) {
>>>>>>     		ue->file_perms = perms;
>>>>>>     
>>>>>> @@ -1139,8 +1151,15 @@ static int open_unixsk_standalone(struct unix_sk_info *ui)
>>>>>>     			return -1;
>>>>>>     		}
>>>>>>     
>>>>>> -		if (send_criu_dump_resp(sks[1], true, true) == -1)
>>>>>> -			return -1;
>>>>>> +		if (ui->ue->stub) {
>>>>>> +			unsigned int l;
>>>>>> +			l = strlen(ui->ue->stub);
>>>>>> +			if (write(sks[1], ui->ue->stub, l) != l)
>>>>>> +				return -1;
>>>>>> +		} else {
>>>>>> +			if (send_criu_dump_resp(sks[1], true, true) == -1)
>>>>>> +				return -1;
>>>>>> +		}
>>>>>>     
>>>>>>     		close(sks[1]);
>>>>>>     		sk = sks[0];
>>>>>> diff --git a/images/sk-unix.proto b/images/sk-unix.proto
>>>>>> index 3026214..4437700 100644
>>>>>> --- a/images/sk-unix.proto
>>>>>> +++ b/images/sk-unix.proto
>>>>>> @@ -48,4 +48,9 @@ message unix_sk_entry {
>>>>>>     	 */
>>>>>>     	optional string			name_dir	= 14;
>>>>>>     	optional bool			deleted		= 15;
>>>>>> +
>>>>>> +	/*
>>>>>> +	 * Stub to put into service socket on restore
>>>>>> +	 */
>>>>>> +        optional string			stub		= 16;
>>>>>>     }
>>>>>>
>>>> .
>>>>
>> .
>>



More information about the CRIU mailing list