[10/10] zdtm: test pgid is restored fine in nested pidnses

Submitted by Pavel Tikhomirov on July 4, 2017, 9:08 a.m.

Details

Message ID 20170704090809.8127-11-ptikhomirov@virtuozzo.com
State New
Series "rework pgid restore for pidnses"
Headers show

Commit Message

Pavel Tikhomirov July 4, 2017, 9:08 a.m.
1) On restore pgid 29 is first added as shortcut variant through
lookup_replaceable_item for process 27 and then replaced adding
pgid for process 30 which is in aditional pidns.

2) Processes 33..35 first as leaders wait their pgid is received
by 32..34 respectively and only after change the group to their
real pgid.

(pid, sid, pgid, namespaces...)
session04(6, 6, 6,pid)-+-session04(8, 8, 8)---session04(9, 7, 7)
                       |-session04(10, 6, 6)---session04(11, 11, 11)
                       |-session04(13, 13, 13)---session04(14, 11, 11)
                       |-session04(15, 15, 15)
                       |-session04(17, 17, 17)-+-session04(18, 15, 15)
                       |                       `-session04(19, 17, 17,pid)---session04(22, 20, 20)
                       |-session04(20, 20, 20)
                       |-session04(23, 6, 6,pid)---session04(25, 20, 20)
                       |-session04(26, 26, 26)---session04(27, 26, 29)---session04(28, 26, 26,pid)---session04(30, 26, 29)
                       `-session04(31, 31, 31)-+-session04(32, 31, 33)
                                               |-session04(33, 31, 34)
                                               |-session04(34, 31, 35)
                                               `-session04(35, 31, 36)

Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
---
 test/zdtm/static/session04.c | 76 ++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 73 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

diff --git a/test/zdtm/static/session04.c b/test/zdtm/static/session04.c
index 155480f..0ccb982 100644
--- a/test/zdtm/static/session04.c
+++ b/test/zdtm/static/session04.c
@@ -22,12 +22,13 @@  struct process
 {
 	pid_t pid;
 	pid_t sid;
+	pid_t pgid;
 	int sks[2];
 	int dead;
 };
 
 struct process *processes;
-int nr_processes = 21;
+int nr_processes = 32;
 int current = 0;
 
 static void cleanup()
@@ -46,6 +47,8 @@  enum commands
 	TEST_DIE,
 	TEST_GETSID,
 	TEST_SETNS,
+	TEST_SETPGID,
+	TEST_GETPGID,
 };
 
 struct command
@@ -229,6 +232,19 @@  static void handle_command()
 		if(status == -1)
 			pr_perror("getsid");
 		break;
+	case TEST_SETPGID:
+		test_msg("%3d: setpgid(%d, %d)\n", current, cmd.arg1, cmd.arg2);
+		if(setpgid(processes[cmd.arg1].pid, processes[cmd.arg2].pid) == -1) {
+			pr_perror("setpgid");
+			status = -1;
+		}
+		break;
+	case TEST_GETPGID:
+		test_msg("%3d: getpgid()\n", current);
+		status = getpgid(0);
+		if(status == -1)
+			pr_perror("getpgid");
+		break;
 	case TEST_SETNS:
 		test_msg("%3d: setns(%d, %d) = %d\n", current,
 				cmd.arg1, cmd.arg2, processes[cmd.arg1].pid);
@@ -282,7 +298,7 @@  static int send_command(int id, enum commands op, int arg1, int arg2)
 		goto err;
 	}
 
-	if (status != -1 && op == TEST_GETSID)
+	if (status != -1 && (op == TEST_GETSID || op == TEST_GETPGID))
 		return status;
 
 	if (status) {
@@ -382,6 +398,42 @@  int main(int argc, char ** argv)
 	send_command(19, TEST_DIE,	0, 0);
 	send_command(15, TEST_WAIT,	19, 0);
 
+	/*
+	 * Test replaceable pgid and pgid helper is in right pidns
+	 */
+	send_command(1, TEST_FORK,	21, 0);
+	send_command(21, TEST_SETSID,	0, 0);
+	send_command(21, TEST_FORK,	22, 0);
+	send_command(22, TEST_FORK,	23, CLONE_NEWPID);
+	send_command(22, TEST_SETNS,	23, CLONE_NEWPID);
+	send_command(22, TEST_FORK,	24, 0);
+	send_command(22, TEST_SETPGID,  24, 24);
+	send_command(22, TEST_SETPGID,  22, 24);
+	send_command(24, TEST_FORK,	25, 0);
+	send_command(24, TEST_DIE,	0, 0);
+	send_command(22, TEST_WAIT,	24, 0);
+
+	/*
+	 * Test leaders wait their group before changing pgid
+	 */
+	send_command(1, TEST_FORK,	26, 0);
+	send_command(26, TEST_SETSID,	0, 0);
+	send_command(26, TEST_FORK,	27, 0);
+	send_command(26, TEST_FORK,	28, 0);
+	send_command(26, TEST_FORK,	29, 0);
+	send_command(26, TEST_FORK,	30, 0);
+	send_command(26, TEST_FORK,	31, 0);
+	send_command(26, TEST_SETPGID,  28, 28);
+	send_command(26, TEST_SETPGID,  29, 29);
+	send_command(26, TEST_SETPGID,  30, 30);
+	send_command(26, TEST_SETPGID,  31, 31);
+	send_command(26, TEST_SETPGID,  27, 28);
+	send_command(26, TEST_SETPGID,  28, 29);
+	send_command(26, TEST_SETPGID,  29, 30);
+	send_command(26, TEST_SETPGID,  30, 31);
+	send_command(31, TEST_DIE,	0, 0);
+	send_command(26, TEST_WAIT,	31, 0);
+
 	for (i = 0; i < nr_processes; i++) {
 		if (processes[i].dead)
 			continue;
@@ -393,6 +445,12 @@  int main(int argc, char ** argv)
 			pr_perror("getsid(%d)", i);
 			goto err;
 		}
+
+		processes[i].pgid = send_command(i, TEST_GETPGID, 0, 0);
+		if (processes[i].pgid == -1) {
+			pr_perror("getpgid(%d)", i);
+			goto err;
+		}
 	}
 
 	test_daemon();
@@ -400,7 +458,7 @@  int main(int argc, char ** argv)
 	test_waitsig();
 
 	for (i = 0; i < nr_processes; i++) {
-		pid_t sid;
+		pid_t sid, pgid;
 
 		if (processes[i].dead)
 			continue;
@@ -418,6 +476,18 @@  int main(int argc, char ** argv)
 				i, processes[i].pid, sid, processes[i].sid);
 			fail_cnt++;
 		}
+
+		pgid = send_command(i, TEST_GETPGID, 0, 0);
+		if (pgid == -1) {
+			pr_perror("getpgid(%d)", i);
+			goto err;
+		}
+
+		if (pgid != processes[i].pgid) {
+			fail("%d, %d: wrong pgid %d (expected %d)",
+				i, processes[i].pid, pgid, processes[i].pgid);
+			fail_cnt++;
+		}
 	}
 
 	if (fail_cnt)