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

Ruslan Kuprieiev kupruser at gmail.com
Fri Nov 22 11:45:44 PST 2013


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();
+		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;
 }
 
-- 
1.8.1.2



More information about the CRIU mailing list