Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1ugGuT-000apN-4Y for pgsql-hackers@arkaria.postgresql.org; Mon, 28 Jul 2025 06:00:30 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1ugGuQ-004lnX-1T for pgsql-hackers@arkaria.postgresql.org; Mon, 28 Jul 2025 06:00:26 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1ugGuP-004lnM-LP for pgsql-hackers@lists.postgresql.org; Mon, 28 Jul 2025 06:00:26 +0000 Received: from mail-vs1-xe2e.google.com ([2607:f8b0:4864:20::e2e]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1ugGuM-001F2w-2T for pgsql-hackers@postgresql.org; Mon, 28 Jul 2025 06:00:25 +0000 Received: by mail-vs1-xe2e.google.com with SMTP id ada2fe7eead31-4fa5d6b04feso559309137.2 for ; Sun, 27 Jul 2025 23:00:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1753682422; x=1754287222; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=ATEYkxsdpCjMr4OVtNgHjdPqoaHIqlucNCrVJZ7i4vo=; b=cAff3Vec201QJyOgIKw1O61QJDxuocn0TOO1iuzvGquygvoR56BW7qiFJIbFWHU9z8 YB3ArRIQNIMLswiqVucw5uFO3xg3RxbW+EJZ0eXNZ9gleRkz51rh+f/bFZJXUX5Ar1uf xfNPosGifAKrZZVb2nmZdtkW3r06FTggxY7lskx6NXSzSqloH/FOIekMaVua9HokeCoX lH90lUXoRY1A+wGnPOUcKF+vqW9YKwF3zZB9OwtpvSLAOfTQDiugHejMNaHHuX5JfV+W 5jehOEf3NR96/kx54RX7Jk7JmGsTqoCAQA8qaohD+WQpYNC1hpMNA+Y7m115g4j1I2Yv fnbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753682422; x=1754287222; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ATEYkxsdpCjMr4OVtNgHjdPqoaHIqlucNCrVJZ7i4vo=; b=ZnnUargxOuVKyavaL+3M54Vf760v6pGXSPyOIVPXlisVhwvCOPkLPmtqDAP2p7faD8 WY/r8lLXKbeEwDBO2QSOcjUMSLOIWOkAXUpe/zKso6xBn6Knwvx04h+vsavg9UZ4pZrm 8mo67+hN0K+aGwcwVMaEXwlqW4j2s+EdsEeDh5QshbxwnNa9mkS5AuGBNnzwy/eOEqWQ GeYrKP413idohe4OaEKDUmAfahof1cm2bhhrPb1Vzh1UH/824ZgCxsxFVNSPTzf9EoXo ahjQMChKxbnJi7j6Lgxtdz6H9UmZmTfAZRc+djkGB0FZrlSNLqQKP9tXu3sDaXb7Z6R0 QqyQ== X-Forwarded-Encrypted: i=1; AJvYcCU4EXEyRIQ+Z8ZId0wQEKgrDlSrO/ypx+x70S/rANLxraqktyWBJ/MWYnwwHvuH/jrjJmD//gJsCI0TM05t@postgresql.org X-Gm-Message-State: AOJu0YxrVv01YNqLa6LEPH3AH+cPv9wBbG5KFgX1OYZwgg3or0n6aRS8 UIXG0e19n3pn/xlGE4ijzTTY4osqN8mP9U7l/i0RQdTdHlJeyjF71qeXJkdtfXlb1quu7sE4WRQ jjhg+rtakuiPWCyndbXXxnYZ/z6uOop0= X-Gm-Gg: ASbGncuqrkKy3vLn5tbRhEvaKYktcP3uQBXGJbkdgZS8PqQzt0dPPoyBApDA2HODRMb x+3tTa9XF8cdysCdGq6dcfs3i5cVL/SWtk/8/xjDg54TaRIXMF/l0qmzZVMGhZ9+9I5CuEd4cQq qT7ozyxomty6JJWUT3/q/UM2FXQt7uvYLdsd9JjqA8YzDRjq0uegn5i3v+ccxDbteet+7lDtdQD u1cGCEOLpX9DaLCZpc= X-Google-Smtp-Source: AGHT+IF8IjV1fmXRWaQ38/puE89/8DKBNLS2xxYRlIZreEwW/pL8JOTlWi9qm3OD//2UkbzDpfpqWlLA49QZHx41i2E= X-Received: by 2002:a05:6102:5717:b0:4f1:37f4:8c32 with SMTP id ada2fe7eead31-4fa3fab898emr4523849137.11.1753682421693; Sun, 27 Jul 2025 23:00:21 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Ashutosh Bapat Date: Mon, 28 Jul 2025 11:30:08 +0530 X-Gm-Features: Ac12FXz0yE5HIO7JFmKnRwEcLw03yq3kAP-tqDXWrjGY6O-EoUMb-Svy7H0dTbc Message-ID: Subject: Re: [Proposal] Expose internal MultiXact member count function for efficient monitoring To: Michael Paquier , Naga Appani Cc: Kirill Reshke , pgsql-hackers@postgresql.org Content-Type: multipart/mixed; boundary="000000000000cb5e53063af7013c" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000cb5e53063af7013c Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Jul 28, 2025 at 9:52=E2=80=AFAM Michael Paquier wrote: > > May I also suggest a split of the multixact SQL functions into a > separate file, a src/backend/utils/adt/multixactfuncs.c? The existing > pg_get_multixact_members() relies on GetMultiXactIdMembers(), > available in multixact.h. The new function pg_get_multixact_count() > relies on ReadMultiXactCounts(), which would mean adding it in > multixact.h. Even if we finish without an agreement about the SQL > function and the end, publishing ReadMultiXactCounts() would give an > access to the internals to external code. > > +PG_FUNCTION_INFO_V1(pg_get_multixact_count); > > There should be no need for that, pg_proc.dat handling the > declaration AFAIK. > > FWIW, these functions are always kind of hard to use for the end-user > without proper documentation. You may want to add an example of how > one can use it for monitoring in the docs. +1. Let's say if the user knows that the counts are so high that a wraparound is imminent, but vacuuming isn't solving the problem, they would like to know which transactions are holding it back. pg_get_multixact_members() can be used to get the members of the oldest multixact if it's reported and then the user can deal with those transactions. However, the oldest multixact is not reported anywhere, AFAIK. It's also part of MultiXactState, so can be extracted via ReadMultiXactCounts(). We could report it through pg_get_multixact_counts - after renaming it and ReadMultiXactCounts to pg_get_multixact_stats() and ReadMultiXactStats() respectively. Or we could write another function to do so. But it comes handy using query like below #select oldestmultixact, pg_get_multixact_members(oldestmultixact::text::xid) from pg_get_multixact_count(); oldestmultixact | pg_get_multixact_members ------------------+-------------------------- 1 | (757,sh) 1 | (768,sh) (2 rows) Here's a quick patch implementing the same. Please feel free to incorporate and refine it in your patch if you like it. --=20 Best Wishes, Ashutosh Bapat --000000000000cb5e53063af7013c Content-Type: text/plain; charset="US-ASCII"; name="oldest_multixact.patch.txt" Content-Disposition: attachment; filename="oldest_multixact.patch.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mdmp6jt30 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL211bHRpeGFjdC5jIGIvc3Jj L2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vbXVsdGl4YWN0LmMKaW5kZXggNmIzZjM4YTJmZDYuLjhi MzFiNTcxNDBkIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9tdWx0aXhh Y3QuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9tdWx0aXhhY3QuYwpAQCAtMjg2 MywxNyArMjg2MywxNiBAQCBmaW5kX211bHRpeGFjdF9zdGFydChNdWx0aVhhY3RJZCBtdWx0aSwg TXVsdGlYYWN0T2Zmc2V0ICpyZXN1bHQpCiAgKiBleGlzdC4gIFJldHVybiBmYWxzZSBpZiB1bmFi bGUgdG8gZGV0ZXJtaW5lLgogICovCiBzdGF0aWMgYm9vbAotUmVhZE11bHRpWGFjdENvdW50cyh1 aW50MzIgKm11bHRpeGFjdHMsIE11bHRpWGFjdE9mZnNldCAqbWVtYmVycykKK1JlYWRNdWx0aVhh Y3RDb3VudHModWludDMyICptdWx0aXhhY3RzLCBNdWx0aVhhY3RPZmZzZXQgKm1lbWJlcnMsIE11 bHRpWGFjdElkICpvbGRlc3RNdWx0aVhhY3RJZCkKIHsKIAlNdWx0aVhhY3RPZmZzZXQgbmV4dE9m ZnNldDsKIAlNdWx0aVhhY3RPZmZzZXQgb2xkZXN0T2Zmc2V0OwotCU11bHRpWGFjdElkIG9sZGVz dE11bHRpWGFjdElkOwogCU11bHRpWGFjdElkIG5leHRNdWx0aVhhY3RJZDsKIAlib29sCQlvbGRl c3RPZmZzZXRLbm93bjsKIAogCUxXTG9ja0FjcXVpcmUoTXVsdGlYYWN0R2VuTG9jaywgTFdfU0hB UkVEKTsKIAluZXh0T2Zmc2V0ID0gTXVsdGlYYWN0U3RhdGUtPm5leHRPZmZzZXQ7Ci0Jb2xkZXN0 TXVsdGlYYWN0SWQgPSBNdWx0aVhhY3RTdGF0ZS0+b2xkZXN0TXVsdGlYYWN0SWQ7CisJKm9sZGVz dE11bHRpWGFjdElkID0gTXVsdGlYYWN0U3RhdGUtPm9sZGVzdE11bHRpWGFjdElkOwogCW5leHRN dWx0aVhhY3RJZCA9IE11bHRpWGFjdFN0YXRlLT5uZXh0TVhhY3Q7CiAJb2xkZXN0T2Zmc2V0ID0g TXVsdGlYYWN0U3RhdGUtPm9sZGVzdE9mZnNldDsKIAlvbGRlc3RPZmZzZXRLbm93biA9IE11bHRp WGFjdFN0YXRlLT5vbGRlc3RPZmZzZXRLbm93bjsKQEAgLTI4ODMsNyArMjg4Miw3IEBAIFJlYWRN dWx0aVhhY3RDb3VudHModWludDMyICptdWx0aXhhY3RzLCBNdWx0aVhhY3RPZmZzZXQgKm1lbWJl cnMpCiAJCXJldHVybiBmYWxzZTsKIAogCSptZW1iZXJzID0gbmV4dE9mZnNldCAtIG9sZGVzdE9m ZnNldDsKLQkqbXVsdGl4YWN0cyA9IG5leHRNdWx0aVhhY3RJZCAtIG9sZGVzdE11bHRpWGFjdElk OworCSptdWx0aXhhY3RzID0gbmV4dE11bHRpWGFjdElkIC0gKm9sZGVzdE11bHRpWGFjdElkOwog CXJldHVybiB0cnVlOwogfQogCkBAIC0yOTIyLDkgKzI5MjEsMTAgQEAgTXVsdGlYYWN0TWVtYmVy RnJlZXplVGhyZXNob2xkKHZvaWQpCiAJdWludDMyCQl2aWN0aW1fbXVsdGl4YWN0czsKIAlkb3Vi bGUJCWZyYWN0aW9uOwogCWludAkJCXJlc3VsdDsKKwlNdWx0aVhhY3RJZCBvbGRlc3RNdWx0aVhh Y3RJZDsKIAogCS8qIElmIHdlIGNhbid0IGRldGVybWluZSBtZW1iZXIgc3BhY2UgdXRpbGl6YXRp b24sIGFzc3VtZSB0aGUgd29yc3QuICovCi0JaWYgKCFSZWFkTXVsdGlYYWN0Q291bnRzKCZtdWx0 aXhhY3RzLCAmbWVtYmVycykpCisJaWYgKCFSZWFkTXVsdGlYYWN0Q291bnRzKCZtdWx0aXhhY3Rz LCAmbWVtYmVycywgJm9sZGVzdE11bHRpWGFjdElkKSkKIAkJcmV0dXJuIDA7CiAKIAkvKiBJZiBt ZW1iZXIgc3BhY2UgdXRpbGl6YXRpb24gaXMgbG93LCBubyBzcGVjaWFsIGFjdGlvbiBpcyByZXF1 aXJlZC4gKi8KQEAgLTM1MDMsMjIgKzM1MDMsMjQgQEAgRGF0dW0KIHBnX2dldF9tdWx0aXhhY3Rf Y291bnQoUEdfRlVOQ1RJT05fQVJHUykKIHsKIAlUdXBsZURlc2MJCXR1cGRlc2M7Ci0JRGF0dW0J CQl2YWx1ZXNbMl07Ci0JYm9vbAkJCW51bGxzWzJdID0ge2ZhbHNlLCBmYWxzZX07CisJRGF0dW0J CQl2YWx1ZXNbM107CisJYm9vbAkJCW51bGxzWzNdID0ge2ZhbHNlLCBmYWxzZSwgZmFsc2V9Owog CU11bHRpWGFjdE9mZnNldAltZW1iZXJzOwogCXVpbnQzMgkJCW11bHRpeGFjdHM7CiAJSGVhcFR1 cGxlCQl0dXBsZTsKKwlNdWx0aVhhY3RJZCBvbGRlc3RNdWx0aVhhY3RJZDsKIAogCWlmIChnZXRf Y2FsbF9yZXN1bHRfdHlwZShmY2luZm8sIE5VTEwsICZ0dXBkZXNjKSAhPSBUWVBFRlVOQ19DT01Q T1NJVEUpCiAJCWVyZXBvcnQoRVJST1IsCiAJCQkJKGVycm1zZygicmV0dXJuIHR5cGUgbXVzdCBi ZSBhIHJvdyB0eXBlIikpKTsKIAotCWlmICghUmVhZE11bHRpWGFjdENvdW50cygmbXVsdGl4YWN0 cywgJm1lbWJlcnMpKQorCWlmICghUmVhZE11bHRpWGFjdENvdW50cygmbXVsdGl4YWN0cywgJm1l bWJlcnMsICZvbGRlc3RNdWx0aVhhY3RJZCkpCiAJCWVyZXBvcnQoRVJST1IsCiAJCQkJKGVycm1z ZygiY291bGQgbm90IHJlYWQgbXVsdGl4YWN0IGNvdW50cyIpKSk7CiAKIAl2YWx1ZXNbMF0gPSBV SW50MzJHZXREYXR1bShtdWx0aXhhY3RzKTsKIAl2YWx1ZXNbMV0gPSBVSW50MzJHZXREYXR1bSht ZW1iZXJzKTsKKwl2YWx1ZXNbMl0gPSBVSW50MzJHZXREYXR1bShvbGRlc3RNdWx0aVhhY3RJZCk7 CiAKIAl0dXBsZSA9IGhlYXBfZm9ybV90dXBsZSh0dXBkZXNjLCB2YWx1ZXMsIG51bGxzKTsKIAlQ R19SRVRVUk5fREFUVU0oSGVhcFR1cGxlR2V0RGF0dW0odHVwbGUpKTsKZGlmZiAtLWdpdCBhL3Ny Yy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3By b2MuZGF0CmluZGV4IDBlNTExZGQzNDczLi4yYmUwY2QzNWUxMiAxMDA2NDQKLS0tIGEvc3JjL2lu Y2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3By b2MuZGF0CkBAIC0xMjU3OSwxMyArMTI1NzksMTMgQEAKICMgUmV0dXJucyBjdXJyZW50IGNvdW50 cyBvZiBtdWx0aXhhY3QgbWVtYmVycyBhbmQgbXVsdGl4YWN0IElEcwogewogICBvaWQgPT4gJzkw MDEnLAotICBkZXNjciA9PiAnZ2V0IGN1cnJlbnQgbXVsdGl4YWN0IG1lbWJlciBhbmQgbXVsdGl4 YWN0IElEIGNvdW50cycsCisgIGRlc2NyID0+ICdnZXQgY3VycmVudCBtdWx0aXhhY3QgbWVtYmVy IGFuZCBtdWx0aXhhY3QgSUQgY291bnRzIGFuZCBvbGRlc3QgbXVsdGl4YWN0JywKICAgcHJvbmFt ZSA9PiAncGdfZ2V0X211bHRpeGFjdF9jb3VudCcsCiAgIHByb3JldHR5cGUgPT4gJ3JlY29yZCcs CiAgIHByb2FyZ3R5cGVzID0+ICcnLAotICBwcm9hbGxhcmd0eXBlcyA9PiAne2ludDQsaW50OH0n LAotICBwcm9hcmdtb2RlcyA9PiAne28sb30nLAotICBwcm9hcmduYW1lcyA9PiAne211bHRpeGFj dHMsbWVtYmVyc30nLAorICBwcm9hbGxhcmd0eXBlcyA9PiAne2ludDQsaW50OCxpbnQ0fScsCisg IHByb2FyZ21vZGVzID0+ICd7byxvLG99JywKKyAgcHJvYXJnbmFtZXMgPT4gJ3ttdWx0aXhhY3Rz LG1lbWJlcnMsb2xkZXN0bXVsdGl4YWN0fScsCiAgIHByb3ZvbGF0aWxlID0+ICd2JywKICAgcHJv cGFyYWxsZWwgPT4gJ3MnLAogICBwcm9zcmMgPT4gJ3BnX2dldF9tdWx0aXhhY3RfY291bnQnCg== --000000000000cb5e53063af7013c--