From nobody Thu Oct 15 12:16:33 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4j56W54YN8z6vtMg for ; Thu, 15 Oct 2026 12:16:33 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4j56W54601z3G04 for ; Thu, 15 Oct 2026 12:16:33 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792066593; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=e3jh4aMMHlju+v8A06fO8f2+KMo8rRVjxyN4rnZwnJA=; b=sC9rETmOqjb6hcrfvsr2DyjrnRda9wiD9LzsPGAriEJ+DBT+VCv9qYPeY5uDFQ+5xqBzHi 3uhepb8AC/K0lqffMlgX6YDHrTrNipR+vzFbOR8sayrRsVXPHHL5jhdCseegD/iRr4G3vR IJrW3RacP00+2Tl2i+XBowPM02lhxJ1vnDNf2j2TDe4lfiQNMH+S+3v1J1lBpClVoanI0D O+BBUJBjoJlvS3ES4MpPylyZj4D4969q0nv2Pm/3HuGo/cuiULny//Y3arQCWKAbRfD9eM SYhbbYY+80dbcqEtvir5jey+R6CdQnEWWjJ1Fi3MLjcvHwyuMuXYomwsMLh7jw== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1792066593; b=nSkXdwu9Edp/aDb6miQCh5zvqAhRq7TlIgcsyaxJIPuo8VldIBj1z80vFz254GnxloREur CgzILVYLAIYjCWuastDC/AWhNSUY+kfcmmDzDGmlPmsdgwV71qLdHjyAGqx/PEJ4QOnlCm NOLQQMJ9fBEY2tvjuXgs+2clwCyejSuSTUEuqehmZo2lAJCGfUQYoquRCnTVe7rXuG5oR0 F4VWpxmflhKx3OrMkQf4KalJszlsMErdzWhb6+Gs39ma/+L+N4rWODvMpI15xIVuCYhIKQ qea3Anuhji58e8hlgU/UmRS56+56UM1llQfasTbdSFCNyQSJ6nvRBNIUGZ8NYw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792066593; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=e3jh4aMMHlju+v8A06fO8f2+KMo8rRVjxyN4rnZwnJA=; b=uyiwf/21eXcu7Bp6Ol6soNLSGnxhtCULzDFSt0dlkUA4kH0Ave5KS1SmvpHPjlvqIt7Fu/ FGJOGLc8eElDDDQi3IgZz5z8zjG3JcvK+heqD2As2lCbsO0Yzz/IEsRd5+/aT6OjMFB0lV a4ZQ1yIyzyMmQ+ymouAXFRPETHPAF8+TD2AosaJlSeydPHUSaEPNaxKhNj7Cmq2gsq/H/X FZndXxCIz8/zHGTjxVvM3qMARs3/x/exm+OWI1ecS8ZWaBpJksQpqGJQm9+8SO+eR7YRTn kWqNw4tZQW6d9P8OaZJqtoVYZ9iqZZW35xzWBWb+i3JGK4uz9cvt8bV9Qsg2gg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4j56W52vNGzY3C for ; Thu, 15 Oct 2026 12:16:33 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1bcb8 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 15 Oct 2026 12:16:33 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Alan Somers Subject: git: 802f5e4d6926 - main - ggate: fix test intermittency List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: Commit messages for the main branch of the src repository List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: asomers X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 802f5e4d6926f0be9294d71c6cadcbe872dbddf2 Auto-Submitted: auto-generated Date: Thu, 15 Oct 2026 12:16:33 +0000 Message-Id: <6ad0c421.1bcb8.47e61c74@gitrepo.freebsd.org> The branch main has been updated by asomers: URL: https://cgit.FreeBSD.org/src/commit/?id=802f5e4d6926f0be9294d71c6cadcbe872dbddf2 commit 802f5e4d6926f0be9294d71c6cadcbe872dbddf2 Author: Alan Somers AuthorDate: 2026-10-13 17:40:22 +0000 Commit: Alan Somers CommitDate: 2026-10-15 12:16:16 +0000 ggate: fix test intermittency * ggatel: fix piped output. Flush stdout before daemonizing, so the output can be read when it's in a command pipeline. * ggated: bind the port _before_ daemonizing, so an invoking script can be sure that the port is bound as soon as the command returns. * tests: allow ggatec or ggatel to automatically allocate a device number instead of choosing one in a racy way. With all of these changes I can no run the tests 1000 times without fail. And in parallel, too. MFC after: 1 week Sponsored by: ConnectWise PR: 298942 Reported by: siva Reviewed by: ngie Differential Revision: https://reviews.freebsd.org/D60707 --- sbin/ggate/ggated/ggated.c | 21 +++++++++------ sbin/ggate/ggatel/ggatel.c | 4 ++- tests/sys/geom/class/gate/Makefile | 3 --- tests/sys/geom/class/gate/ggate_test.sh | 48 ++++++++++++--------------------- 4 files changed, 33 insertions(+), 43 deletions(-) diff --git a/sbin/ggate/ggated/ggated.c b/sbin/ggate/ggated/ggated.c index ef7b61cb13c4..dd6c53c80ccf 100644 --- a/sbin/ggate/ggated/ggated.c +++ b/sbin/ggate/ggated/ggated.c @@ -1100,14 +1100,6 @@ main(int argc, char *argv[]) err(EXIT_FAILURE, "Cannot open/create pidfile"); } - if (!g_gate_verbose) { - /* Run in daemon mode. */ - if (daemon(0, 0) == -1) - g_gate_xlog("Cannot daemonize: %s", strerror(errno)); - } - - pidfile_write(pfh); - signal(SIGCHLD, SIG_IGN); sfd = socket(AF_INET, SOCK_STREAM, 0); @@ -1129,6 +1121,19 @@ main(int argc, char *argv[]) signal(SIGHUP, huphandler); + if (!g_gate_verbose) { + /* + * Run in daemon mode. Daemonize _after_ opening the socket, + * so consumers may connect as soon as the ggated command + * returns, but _before_ writing the pidfile, because daemon() + * changes the pid. + */ + if (daemon(0, 0) == -1) + g_gate_xlog("Cannot daemonize: %s", strerror(errno)); + } + + pidfile_write(pfh); + for (;;) { fromlen = sizeof(from); tmpsfd = accept(sfd, &from, &fromlen); diff --git a/sbin/ggate/ggatel/ggatel.c b/sbin/ggate/ggatel/ggatel.c index 1cbb6af28b7e..cafa6a385457 100644 --- a/sbin/ggate/ggatel/ggatel.c +++ b/sbin/ggate/ggatel/ggatel.c @@ -191,8 +191,10 @@ g_gatel_create(void) ggioc.gctl_maxcount = 0; strlcpy(ggioc.gctl_info, path, sizeof(ggioc.gctl_info)); g_gate_ioctl(G_GATE_CMD_CREATE, &ggioc); - if (unit == -1) + if (unit == -1) { printf("%s%u\n", G_GATE_PROVIDER_NAME, ggioc.gctl_unit); + fflush(stdout); + } unit = ggioc.gctl_unit; g_gatel_serve(fd); } diff --git a/tests/sys/geom/class/gate/Makefile b/tests/sys/geom/class/gate/Makefile index 5ebc1d9304e0..8ecb2e1a3751 100644 --- a/tests/sys/geom/class/gate/Makefile +++ b/tests/sys/geom/class/gate/Makefile @@ -4,7 +4,4 @@ TESTSDIR= ${TESTSBASE}/sys/geom/class/${.CURDIR:T} ATF_TESTS_SH+= ggate_test -# Tests listen on the same port. -TEST_METADATA.ggate_test+= is_exclusive=true - .include diff --git a/tests/sys/geom/class/gate/ggate_test.sh b/tests/sys/geom/class/gate/ggate_test.sh index 4cbc5d80ae89..398d5bee6d80 100644 --- a/tests/sys/geom/class/gate/ggate_test.sh +++ b/tests/sys/geom/class/gate/ggate_test.sh @@ -16,14 +16,14 @@ ggatec_trim_body() load_ggate port=33080 - us=$(alloc_ggate_dev) work=$(alloc_md) atf_check -e ignore -o ignore dd if=/dev/random of=/dev/$work bs=1m count=1 conv=notrunc echo $CONF >> $PLAINFILES echo "localhost RW /dev/$work" > $CONF atf_check ggated -p $port -F $PIDFILE $CONF - atf_check ggatec create -p $port -u $us localhost /dev/$work - ggate_dev=/dev/ggate${us} + atf_check -o save:ggateu ggatec create -p $port localhost /dev/$work + ggate_dev=/dev/`cat ggateu` + cat ggateu | sed 's:ggate::' >> ggate.devs wait_for_ggate_device ${ggate_dev} # ggatec only supports read or write. @@ -55,7 +55,6 @@ ggated_body() load_ggate port=33081 - us=$(alloc_ggate_dev) work=$(alloc_md) src=$(alloc_md) @@ -68,16 +67,16 @@ ggated_body() echo "127.0.0.1 RW /dev/$work" > $CONF atf_check ggated -p $port -F $PIDFILE $CONF - atf_check ggatec create -p $port -u $us 127.0.0.1 /dev/$work - - ggate_dev=/dev/ggate${us} + atf_check -o save:ggateu ggatec create -p $port 127.0.0.1 /dev/$work + ggate_dev=/dev/`cat ggateu` + cat ggateu | sed 's:ggate::' >> ggate.devs wait_for_ggate_device ${ggate_dev} atf_check -e ignore -o ignore \ dd if=/dev/${src} of=${ggate_dev} bs=1m count=1 conv=notrunc - checksum /dev/$src /dev/$work + checksum /dev/$src /dev/$work $ggate_dev } ggated_cleanup() @@ -98,22 +97,21 @@ ggatel_file_body() { load_ggate - us=$(alloc_ggate_dev) echo src work >> ${PLAINFILES} dd if=/dev/random of=work bs=1m count=1 dd if=/dev/random of=src bs=1m count=1 - atf_check ggatel create -u $us work - - ggate_dev=/dev/ggate${us} + atf_check -o save:ggateu ggatel create work + ggate_dev=/dev/`cat ggateu` + cat ggateu | sed 's:ggate::' >> ggate.devs wait_for_ggate_device ${ggate_dev} atf_check -e ignore -o ignore \ dd if=src of=${ggate_dev} bs=1m count=1 conv=notrunc - checksum src work + checksum src work $ggate_dev } ggatel_file_cleanup() @@ -134,7 +132,6 @@ ggatel_md_body() { load_ggate - us=$(alloc_ggate_dev) work=$(alloc_md) src=$(alloc_md) @@ -143,16 +140,16 @@ ggatel_md_body() atf_check -e ignore -o ignore \ dd if=/dev/random of=$src bs=1m count=1 conv=notrunc - atf_check ggatel create -u $us /dev/$work - - ggate_dev=/dev/ggate${us} + atf_check -o save:ggateu ggatel create /dev/$work + ggate_dev=/dev/`cat ggateu` + cat ggateu | sed 's:ggate::' >> ggate.devs wait_for_ggate_device ${ggate_dev} atf_check -e ignore -o ignore \ dd if=/dev/$src of=${ggate_dev} bs=1m count=1 conv=notrunc - checksum /dev/$src /dev/$work + checksum /dev/$src /dev/$work $ggate_dev } ggatel_md_cleanup() @@ -168,18 +165,6 @@ atf_init_test_cases() atf_add_test_case ggatec_trim } -alloc_ggate_dev() -{ - local us - - us=0 - while [ -c /dev/ggate${us} ]; do - : $(( us += 1 )) - done - echo ${us} > ggate.devs - echo ${us} -} - alloc_md() { local md @@ -195,6 +180,7 @@ checksum() local src work src=$1 work=$2 + ggate_dev=$3 src_checksum=$(md5 -q $src) work_checksum=$(md5 -q $work) @@ -203,7 +189,7 @@ checksum() atf_fail "work md5 checksum didn't match" fi - ggate_checksum=$(md5 -q /dev/ggate${us}) + ggate_checksum=$(md5 -q $ggate_dev) if [ "$ggate_checksum" != "$src_checksum" ]; then atf_fail "ggate md5 checksum didn't match" fi