Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lwS0W-0007MK-Jp for pgsql-bugs@arkaria.postgresql.org; Thu, 24 Jun 2021 16:15:12 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1lwS0V-0001Hv-8F for pgsql-bugs@arkaria.postgresql.org; Thu, 24 Jun 2021 16:15:11 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lwS0U-0001Hn-SW for pgsql-bugs@lists.postgresql.org; Thu, 24 Jun 2021 16:15:11 +0000 Received: from mail-lj1-x233.google.com ([2a00:1450:4864:20::233]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1lwS0O-0002nb-Ev for pgsql-bugs@lists.postgresql.org; Thu, 24 Jun 2021 16:15:09 +0000 Received: by mail-lj1-x233.google.com with SMTP id c11so8479783ljd.6 for ; Thu, 24 Jun 2021 09:15:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-language; bh=TJFi4vR6rkqA4DALA8ClnQB5nONN+ECr6nnH+BSofRk=; b=ncWdtRaugS6Sd27fJpiObjTKDTqORzDAB7vDxLN+1KvDVsL2CwVf8IckOwNSby4eoi 6deLVWnSv89IhYs6c4CrOTj+ZLripplf1oLoqm2tqAryzqKPCtgsItUL/Lrp77lpQfEX pUnOYxUig7TzrvInmkXNWhCAUxuzwjDZtt//MEEhPjSSTdcqusQwbkls7ED005IfaQ2M CzyVlMYYri0gBNW6+xNA/IqDmh7QpVIk3FNg/AQwJqE0GazDARsxF1YR5LRZ2MgvJuwZ Jnq5f4UX0m1bEFB027GQDZL2zM9pccPp+81DO6ZPZpDWdofkzsBxGhvcE6vaq4/lIfFV JYcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language; bh=TJFi4vR6rkqA4DALA8ClnQB5nONN+ECr6nnH+BSofRk=; b=SNPw61L/BqlVsetpNPhI4+SqI6xJJkYEjzeFLH008kBimAPFA8efczJLb5UblgRB5m Rmfr7Bd7PW5BvREN0YUQnfbCrz+ITsRoQtN2fBFa+RtTsilvNYaamFr+Hhraz75LTPQj Qdh1GDYl3MCcJvj3Phy4WSNzeBJPp2caFGWWej4STPOJnFJMJxVVALq/VPNOUbKr1Nqu K0lVWo1b/aJkAA3Ej4jc5azzPiRJ5m1kYbVfdyW9hV8JzRfk22FfLIvYyQRFJZqb39B/ 81ogLxUJU8yA2WcZj4HhSJnpsXwl2uc/xlXtTPo1HKUDrcEE/HbMueDdlBN1Uh9yqVlP D3mw== X-Gm-Message-State: AOAM532Rys8O41ogWq1q/NIKb8x4TI0nJkVgzb91JlGeXQaVFdV3hrBh WXvAmMxSlGy1fUD8v2HBm3MMTTisgC4= X-Google-Smtp-Source: ABdhPJxOuBFbcKQytZAePXGS25b4iZKKmKP9B61YI1Rd8jYHLJtrppEXt1INWPPqtnfFcWgtmhBFLg== X-Received: by 2002:a2e:9252:: with SMTP id v18mr4665678ljg.122.1624551302193; Thu, 24 Jun 2021 09:15:02 -0700 (PDT) Received: from [1.0.0.7] ([178.155.6.177]) by smtp.gmail.com with ESMTPSA id n17sm265561lft.74.2021.06.24.09.15.01 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 24 Jun 2021 09:15:01 -0700 (PDT) Subject: Re: BUG #17072: Assert for clogGroupNext failed due to a race condition in TransactionGroupUpdateXidStatus() To: pgsql-bugs@lists.postgresql.org References: <17072-2f8764857ef2c92a@postgresql.org> From: Alexander Lakhin Message-ID: <1ede0650-1fe1-9ab4-af34-64eda8fec665@gmail.com> Date: Thu, 24 Jun 2021 19:15:00 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1 MIME-Version: 1.0 In-Reply-To: <17072-2f8764857ef2c92a@postgresql.org> Content-Type: multipart/mixed; boundary="------------13A570D77E355D2F04759BE9" Content-Language: en-US List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------13A570D77E355D2F04759BE9 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit 24.06.2021 19:00, PG Bug reporting form wrote: > With some diagnostic output added I've got in the server log: The diagnostic patch is attached. I could not find an easy reproduction for the issue, so I can propose only dirty one, with the special debug patch and the following script: for i in `seq 100`; do createdb db$i done echo " CREATE TABLE tst (i INT); INSERT INTO tst SELECT i FROM generate_series(1,100) i; DROP TABLE tst; " >/tmp/action.sql for n in `seq 100`; do   echo "iteration $n"   for i in `seq 100`; do     ( { for f in `seq 10`; do cat /tmp/action.sql; done } | psql -d db$i ) >psql-$i.log 2>&1 &   done   wait   coredumpctl --no-pager && break done (You need to set max_connections = 100 in postgresql.conf.) This script with the patched server fails for me on iterations 66, 12, 12. Best regards, Alexander --------------13A570D77E355D2F04759BE9 Content-Type: text/x-patch; charset=UTF-8; name="clog-diagnostics.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="clog-diagnostics.patch" diff --git a/src/backend/access/transam/clog.c b/src/backend/access/transam/clog.c index 880f18c1473..126502363f5 100644 --- a/src/backend/access/transam/clog.c +++ b/src/backend/access/transam/clog.c @@ -432,7 +432,7 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, proc->clogGroupMemberLsn = lsn; nextidx = pg_atomic_read_u32(&procglobal->clogGroupFirst); - +elog(WARNING, "TransactionGroupUpdateXidStatus: %d, %d", proc->pgprocno, nextidx); while (true) { /* @@ -451,9 +451,10 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, ProcGlobal->allProcs[nextidx].clogGroupMemberPage != proc->clogGroupMemberPage) { proc->clogGroupMember = false; +elog(WARNING, "TransactionGroupUpdateXidStatus: return false (%d)", nextidx); return false; } - +elog(WARNING, "TransactionGroupUpdateXidStatus: pg_atomic_write_u32 nextidx: %p, %d", &proc->clogGroupNext, nextidx); pg_atomic_write_u32(&proc->clogGroupNext, nextidx); if (pg_atomic_compare_exchange_u32(&procglobal->clogGroupFirst, @@ -461,7 +462,7 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, (uint32) proc->pgprocno)) break; } - +elog(WARNING, "TransactionGroupUpdateXidStatus: after while: %d", nextidx); /* * If the list was not empty, the leader will update the status of our * XID. It is impossible to have followers without a leader because the @@ -489,6 +490,7 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, /* Fix semaphore count for any absorbed wakeups */ while (extraWaits-- > 0) PGSemaphoreUnlock(proc->sem); +elog(WARNING, "TransactionGroupUpdateXidStatus: return true (%d)", nextidx); return true; } @@ -540,8 +542,8 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, while (wakeidx != INVALID_PGPROCNO) { PGPROC *proc = &ProcGlobal->allProcs[wakeidx]; - wakeidx = pg_atomic_read_u32(&proc->clogGroupNext); +elog(WARNING, "TransactionGroupUpdateXidStatus: pg_atomic_write_u32 INVALID_PGPROCNO: %p, %d", &proc->clogGroupNext, INVALID_PGPROCNO); pg_atomic_write_u32(&proc->clogGroupNext, INVALID_PGPROCNO); /* ensure all previous writes are visible before follower continues. */ @@ -553,6 +555,7 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, PGSemaphoreUnlock(proc->sem); } +elog(WARNING, "TransactionGroupUpdateXidStatus: end"); return true; } --------------13A570D77E355D2F04759BE9 Content-Type: text/x-patch; charset=UTF-8; name="clog-debug.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="clog-debug.patch" diff --git a/src/backend/access/transam/clog.c b/src/backend/access/transam/clog.c index 880f18c1473..499989cb3a1 100644 --- a/src/backend/access/transam/clog.c +++ b/src/backend/access/transam/clog.c @@ -305,7 +305,7 @@ TransactionIdSetPageStatus(TransactionId xid, int nsubxids, * update. If that doesn't work out, fall back to waiting for the * lock to perform an update for this transaction only. */ - if (LWLockConditionalAcquire(XactSLRULock, LW_EXCLUSIVE)) + if (0) { /* Got the lock without waiting! Do the update. */ TransactionIdSetPageStatusInternal(xid, nsubxids, subxids, status, @@ -432,7 +432,6 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, proc->clogGroupMemberLsn = lsn; nextidx = pg_atomic_read_u32(&procglobal->clogGroupFirst); - while (true) { /* @@ -451,10 +450,15 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, ProcGlobal->allProcs[nextidx].clogGroupMemberPage != proc->clogGroupMemberPage) { proc->clogGroupMember = false; +elog(WARNING, "TransactionGroupUpdateXidStatus: return false"); return false; } - pg_atomic_write_u32(&proc->clogGroupNext, nextidx); +do { +instr_time t; +INSTR_TIME_SET_CURRENT(t); +if ((t.tv_nsec % 1000000L) < 10L) break; +} while (1); if (pg_atomic_compare_exchange_u32(&procglobal->clogGroupFirst, &nextidx, --------------13A570D77E355D2F04759BE9--