[CRIU] [PATCH] service: add "one connection -- multiple requests" support

Pavel Emelyanov xemul at parallels.com
Fri Nov 22 09:13:37 PST 2013


On 11/22/2013 11:45 PM, Ruslan Kuprieiev wrote:
> Currently we use "one connection -- one request" politics. This patch allows to connect to criu once and send multiple requests.
> 
> Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
> ---
>  cr-service.c | 61 +++++++++++++++++++++++++++++++++++++-----------------------
>  1 file changed, 38 insertions(+), 23 deletions(-)
> 
> diff --git a/cr-service.c b/cr-service.c
> index eba5342..51c56b8 100644
> --- a/cr-service.c
> +++ b/cr-service.c
> @@ -33,13 +33,16 @@ static int recv_criu_msg(int socket_fd, CriuReq **msg)
>  		return -1;
>  	}
>  
> +	if (len == 0)
> +		return 0;
> +
>  	*msg = criu_req__unpack(NULL, len, buf);
>  	if (!*msg) {
>  		pr_perror("Failed unpacking request");
>  		return -1;
>  	}
>  
> -	return 0;
> +	return 1;
>  }
>  
>  static int send_criu_msg(int socket_fd, CriuResp *msg)
> @@ -231,38 +234,50 @@ static int check(int sk)
>  
>  static int cr_service_work(int sk)
>  {
> +	int pid, ret;
>  	CriuReq *msg = 0;
> +	CriuResp err_resp = CRIU_RESP__INIT;
>  
> -	init_opts();
> +	err_resp.type = CRIU_REQ_TYPE__EMPTY;
> +	err_resp.success = false;
>  
> -	if (recv_criu_msg(sk, &msg) == -1) {
> -		pr_perror("Can't recv request");
> -		goto err;
> -	}
> +	init_opts();
>  
> -	switch (msg->type) {
> -	case CRIU_REQ_TYPE__DUMP:
> -		return dump_using_req(sk, msg->opts);
> -	case CRIU_REQ_TYPE__RESTORE:
> -		return restore_using_req(sk, msg->opts);
> -	case CRIU_REQ_TYPE__CHECK:
> -		return check(sk);
> +	do {
> +		ret = recv_criu_msg(sk, &msg);
> +		if (ret < 0)
> +			goto err;
>  
> -	default: {
> -		CriuResp resp = CRIU_RESP__INIT;
> +		if (ret == 0)
> +			break;
> +
> +		pid = fork();

NAK. Each request should be synchronous withing session.

> +		if (pid == 0) {
> +			switch (msg->type) {
> +			case CRIU_REQ_TYPE__DUMP:
> +				return dump_using_req(sk, msg->opts);
> +			case CRIU_REQ_TYPE__RESTORE:
> +				return restore_using_req(sk, msg->opts);
> +			case CRIU_REQ_TYPE__CHECK:
> +				return check(sk);
> +
> +			default:
> +				goto err;
> +			}
> +		}
>  
> -		resp.type = CRIU_REQ_TYPE__EMPTY;
> -		resp.success = false;
> -		/* XXX -- add optional error code to CriuResp */
> +		if (pid < 0)
> +			goto err;
>  
> -		pr_perror("Invalid request");
> -		send_criu_msg(sk, &resp);
> +	} while (1);
>  
> -		goto err;
> -	}
> -	}
> +	return 0;
>  
>  err:
> +	/* XXX -- add optional error code to CriuResp */
> +
> +	send_criu_msg(sk, &err_resp);
> +
>  	return -1;
>  }
>  
> 




More information about the CRIU mailing list