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 1uOzqB-00FDLc-MT for pgsql-hackers@arkaria.postgresql.org; Tue, 10 Jun 2025 14:20:40 +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 1uOzq8-0056aw-0F for pgsql-hackers@arkaria.postgresql.org; Tue, 10 Jun 2025 14:20:36 +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 1uOkPu-00DrIG-7R for pgsql-hackers@lists.postgresql.org; Mon, 09 Jun 2025 21:52:30 +0000 Received: from mail-ed1-x52b.google.com ([2a00:1450:4864:20::52b]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1uOkPs-0017gO-2v for pgsql-hackers@postgresql.org; Mon, 09 Jun 2025 21:52:30 +0000 Received: by mail-ed1-x52b.google.com with SMTP id 4fb4d7f45d1cf-60179d8e65fso3935549a12.0 for ; Mon, 09 Jun 2025 14:52:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749505947; x=1750110747; 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=nUpheQLc58WAmscrRV9peP7FnTOWltWUYuUMUwFfTI8=; b=kPEhdbn7rn0vLo7ABopztxQuyzhYr76a1srIsac7mBemli4mnIkAU0127XeZeB5ma7 iaMbA/vBafjeMYeiudCGwuKW0ffYjBKl6Apz44mlkrExh8CChZfatQBtWZTkL+wKttzp XasNNQxiUJt7yXYHT+13Qp/xK1ldng5P1eAOXbcUG1HVI/vGe1bDvmzjdcfEdIbBFsr5 y2YFHs23bZk3oR4lVB8T0flobKpntmxF2YI6Dk4BgVnzqL8O10+AiYzUvwPNeAQj8KCw 7niUYIe9TqzhkhvwfDhiYHv9pD5YztU/y0vCsXYuHUBh7UkAONbLwUIfyUHIQg9Q61fa yd6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749505947; x=1750110747; 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=nUpheQLc58WAmscrRV9peP7FnTOWltWUYuUMUwFfTI8=; b=qIyIOtIgasvbTli7xECX4FMTOuk24UFWIGDSZa1kboMfKXKvFFQmm4Oe6EpA5YQnSh sppUM3e1VMMEMVG1tjnIq7fmYz3+5PJ9Ea1UIqlZ6+0QdkyYbh2gtsMz3HBtwgeuJwau lsKEN8YWplGJmTTJpdsKneT+KGaT8Kv2OZO1CGq/IiMSA2Azcu9e2DNtS1IDdhhfrkhm Ml6ongRN3eq/ee9Gp0vSRW4ij9s9/wGJtqSdfXFCKlqu8g2lZLD7QUduoqPcydKT2zcA 5v0Iq5OR7X4QIik5OAxy7aQmh79dXN2JRNWHmWIikU5zVN1pi9Q/+rWRfmrWb3jrFyyb EUEA== X-Gm-Message-State: AOJu0Yy2HMp+hqF8PJhvFIOgpsPt97TGO+NGao9VE3+tYdCJ331MlYGO ZG52q6EQJwg6usIWM2m9EGdsSXBaLK3eXWgiIfs75S46nWI/VyXFh2kVlA0UBMFGAporTWpYoXb G3bL4nHxsJoo2QYyex0A/AxMGW17Tx3tjkbhq X-Gm-Gg: ASbGncuCVqRzRvg2FdToaV0ZUMZc9DNWJ7rUq99bz7hB8/KE5xOotj8/IV7OOS9eyqc 0u6l5CSfvrT3WI1iwASEl5MCOBLy9zl/9KzMSZNMP/M6fqPvb8i11C0bAFOMgLPpkn31LO8v9xQ jVh48xgupCzf+GBEbuzzB5CQBbk86VM7z7fZrndwfu7pA= X-Google-Smtp-Source: AGHT+IH8zJUEtDIqGo0iQ/Wi0ngjbCWWGu8vMUeow5mpsOeLhI/t0Og9kGU6ihh++rbEH50hbC+eOITTm2Mc+K2adz8= X-Received: by 2002:a05:6402:4404:b0:602:ddbe:480f with SMTP id 4fb4d7f45d1cf-6082d58ea21mr133690a12.9.1749505947302; Mon, 09 Jun 2025 14:52:27 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Naga Appani Date: Mon, 9 Jun 2025 16:52:15 -0500 X-Gm-Features: AX0GCFsbMhDFqtNTaWd7cPYrQqZNsukEoLrQIVWqFScuYMWKMBAGLpTkM1KVzDA Message-ID: Subject: Re: [Proposal] Expose internal MultiXact member count function for efficient monitoring To: Kirill Reshke Cc: pgsql-hackers@postgresql.org Content-Type: multipart/mixed; boundary="00000000000085c9a606372a982a" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000085c9a606372a982a Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Mar 11, 2025 at 4:48=E2=80=AFAM Kirill Reshke wrote: > > On Tue, 11 Mar 2025 at 14:37, Naga Appani wrote: > > > > > > > > On Mon, Mar 10, 2025 at 10:43=E2=80=AFAM Naga Appani wrote: > >> > >> Hi, > >> > > Hi > > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > Proposal > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > The internal ReadMultiXactCounts() function, implemented in multixact.c= , directly calculates the number of MultiXact members by reading live state= from shared memory. This approach avoids the performance issues of the cur= rent filesystem-based estimation methods. > > This proposal looks sane. It is indeed helpful to keep an eye out for > multixact usage in systems that are heavily loaded. > > > By exposing ReadMultiXactCounts() for external use, we can provide Post= greSQL users with an efficient way to monitor MultiXact member usage. This = could be particularly useful for integrating with tools like Amazon RDS Per= formance Insights and Amazon CloudWatch to provide enhanced database insigh= ts and proactive managed monitoring for users. > > > > Please let me know if this approach is acceptable, so I=E2=80=99ll go a= head and submit a patch. > > Let's give it a try! Hi, As a follow-up, I=E2=80=99m submitting a patch that introduces a SQL-callab= le function to retrieve MultiXact usage metrics. Although the motivation has been discussed earlier in this thread, I=E2=80=99m including a brief re= cap below to provide context for the patch itself. While wraparound due to MultiXacts (MXID) is less frequent than XID wraparound, it can still lead to aggressive/wraparound vacuum behavior or downtime in certain workloads =E2=80=94 especially those involving forei= gn keys, shared row locks, or long-lived transactions. Currently, users have no SQL-level visibility into MultiXact member consumption, which makes it hard to proactively respond before issues arise. The only workaround today involves scanning the pg_multixact/members directory on disk, current workaround uses stat() calls over potentially millions of small segment files, adds I/O overhead, and is unsuitable for periodic monitoring or integration into observability platforms. Unlike the approach originally proposed or discussed in this thread, this patch does not expose the internal ReadMultiXactCounts() function directly. Instead, it wraps it internally (without changing its visibility) to make the data available via a new SQL function. This patch adds: pg_get_multixact_count() It returns a composite of: - multixacts: number of MultiXact IDs that currently exist - members: number of MultiXact member entries currently exist Implementation -------------- - Defined in multixact.c - Calls ReadMultiXactCounts() - Returns a composite record (multixacts, members) - Includes documentation Use cases --------- This function enables users to: - Monitor member usage to anticipate aggressive vacuum and avoid wraparound= risk - Track long-lived workloads that accumulate MultiXacts - Power lightweight monitoring/diagnostics tools without scanning the files= ystem - Log and analyze MultiXact growth over time Sample output ------------- multixacts | members ------------+------------ 182371396 | 2826221174 (1 row) Performance comparison ---------------------- While performance is not the primary motivation for this patch, it becomes important in monitoring scenarios where frequent polling is expected. The proposed function executes in sub-millisecond time and avoids any filesystem I/O, making it well-suited for lightweight, periodic monitoring. Implementation | Used size | MultiXact members | Time (ms) | Relative cost -------------------------------------+-----------+-------------------+-----= ------+---------------- Community (pg_ls_multixactdir) | 8642 MB | 1.8 billion | 96.879 | 1.00 (baseline) Linux (du command) | 8642 MB | 1.8 billion | 96 | 1.00 Proposal (ReadMultiXactCounts-based) | N/A | 1.99 billion | 0.167 | ~580x faster Documentation ------------- - A new section is added to func.sgml to group multixact-related functions - A reference to this new function is included in the "Multixacts and Wraparound" subsection of maintenance.sgml To keep related functions grouped together, we can consider moving mxid_age() into the new section as well unless there are objections to relocating it from the current section. This patch aims to fill a long-standing observability gap. Patch attached. Best regards, Naga Appani Postgres Database Engineer Amazon Web Services > > > > -- > Best regards, > Kirill Reshke --00000000000085c9a606372a982a Content-Type: application/octet-stream; name="v1-0001-Add-pg_get_multixact_count-function-and-related-d.patch" Content-Disposition: attachment; filename="v1-0001-Add-pg_get_multixact_count-function-and-related-d.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mbpml9720 RnJvbSAwZjliZmY1OTRlY2NmMmY3YWVhMjg4ZTczZjhjMTQ3ZWRmODg0ODU3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYWdhIEFwcGFuaSA8bmFnbnJpa0BnbWFpbC5jb20+CkRhdGU6 IEZyaSwgNiBKdW4gMjAyNSAwNToxODoxNSArMDAwMApTdWJqZWN0OiBbUEFUQ0ggdjFdIEFkZCBw Z19nZXRfbXVsdGl4YWN0X2NvdW50IGZ1bmN0aW9uIGFuZCByZWxhdGVkCgpBZGQgcGdfZ2V0X211 bHRpeGFjdF9jb3VudCgpIFNRTCBmdW5jdGlvbiBmb3IgbW9uaXRvcmluZyBNdWx0aVhhY3QgdXNh Z2UKClBvc3RncmVTUUwgZXhwb3NlcyBteGlkX2FnZSgpIHRvIHRyYWNrIE11bHRpWGFjdCBJRCB3 cmFwYXJvdW5kIHJpc2ssCmJ1dCB0aGVyZSBpcyBjdXJyZW50bHkgbm8gU1FMLWFjY2Vzc2libGUg d2F5IHRvIG1vbml0b3IgTXVsdGlYYWN0IG1lbWJlcgpjb25zdW1wdGlvbiwgd2hpY2ggY2FuIGlu ZGVwZW5kZW50bHkgdHJpZ2dlciBhZ2dyZXNzaXZlIHZhY3V1bWluZyBvcgp3cmFwYXJvdW5kIHBy b3RlY3Rpb24uIFRoZSBvbmx5IHdvcmthcm91bmQgdG9kYXkgaW52b2x2ZXMgc2Nhbm5pbmcgdGhl CnBnX211bHRpeGFjdC9tZW1iZXJzIGRpcmVjdG9yeSwgd2hpY2ggaXMgSS9PIGludGVuc2l2ZSBh bmQgdW5zdWl0YWJsZQpmb3IgbW9uaXRvcmluZyB0b29scy4KClRoaXMgcGF0Y2ggYWRkcyBwZ19n ZXRfbXVsdGl4YWN0X2NvdW50KCksIGEgU1FMLWNhbGxhYmxlIGZ1bmN0aW9uIHRoYXQKcmV0dXJu cyBhIGNvbXBvc2l0ZSByZWNvcmQgd2l0aCB0d28gZmllbGRzOgotIG11bHRpeGFjdHM6ICBudW1i ZXIgb2YgTXVsdGlYYWN0IElEcyB0aGF0IGN1cnJlbnRseSBleGlzdAotIG1lbWJlcnM6ICAgICBu dW1iZXIgb2YgTXVsdGlYYWN0IG1lbWJlciBlbnRyaWVzIHRoYXQgY3VycmVudGx5IGV4aXN0CgpU aGUgZnVuY3Rpb24gY2FsbHMgUmVhZE11bHRpWGFjdENvdW50cygpIGFuZCByZXR1cm5zIHRoZSB2 YWx1ZXMgdXNpbmcgdGhlCnN0YW5kYXJkIHJlY29yZCBvdXRwdXQgY29udmVudGlvbi4KCkRvY3Vt ZW50YXRpb24gaGFzIGJlZW4gYWRkZWQgdG8gZnVuYy5zZ21sIHVuZGVyIGEgbmV3IHNlY3Rpb24g dGl0bGVkCiJNdWx0aVhhY3QgSW5mb3JtYXRpb24gRnVuY3Rpb25zIiwgd2l0aCBhIGNyb3NzLXJl ZmVyZW5jZSBpbiBtYWludGVuYW5jZS5zZ21sCnRvIGhlbHAgdXNlcnMgdHJhY2sgTXVsdGlYYWN0 IHVzYWdlIHJlbGF0aXZlIHRvIGF1dG92YWN1dW0gdGhyZXNob2xkcy4KCkF1dGhvcjogTmFnYSBB cHBhbmkgPG5hZ25yaWtAZ21haWwuY29tPgpSZXZpZXdlZC1ieToKRGlzY3Vzc2lvbjogaHR0cHM6 Ly93d3cucG9zdGdyZXNxbC5vcmcvbWVzc2FnZS1pZC9mbGF0L0NBJTJCUWVZJTJCQUFzWUs2V3ZC VzRxWXpIejRiYWhIeWNEQVlfcTVFQ21Ia0VWX2VCOWNremclNDBtYWlsLmdtYWlsLmNvbQoKLS0t CiBkb2Mvc3JjL3NnbWwvZnVuYy5zZ21sICAgICAgICAgICAgICAgICB8IDU4ICsrKysrKysrKysr KysrKysrKysrKysrKysrCiBkb2Mvc3JjL3NnbWwvbWFpbnRlbmFuY2Uuc2dtbCAgICAgICAgICB8 ICA4ICsrKysKIHNyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL211bHRpeGFjdC5jIHwgMzAgKysr KysrKysrKysrKwogc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdCAgICAgICAgfCAxNSAr KysrKysrCiA0IGZpbGVzIGNoYW5nZWQsIDExMSBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEv ZG9jL3NyYy9zZ21sL2Z1bmMuc2dtbCBiL2RvYy9zcmMvc2dtbC9mdW5jLnNnbWwKaW5kZXggYzY3 Njg4Y2JmNWYuLmJkYjY0ZjgzYzIzIDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvZnVuYy5zZ21s CisrKyBiL2RvYy9zcmMvc2dtbC9mdW5jLnNnbWwKQEAgLTI4NDk2LDYgKzI4NDk2LDY0IEBAIGFj bCAgICAgIHwge3Bvc3RncmVzPWFyd2REeHRtL3Bvc3RncmVzLGZvbz1yL3Bvc3RncmVzfQogCiAg IDwvc2VjdDI+CiAKKyAgPHNlY3QyIGlkPSJmdW5jdGlvbnMtaW5mby1tdWx0aXhhY3QtaW5mb3Jt YXRpb24iPgorICAgPHRpdGxlPk11bHRpWGFjdCBJbmZvcm1hdGlvbiBGdW5jdGlvbnM8L3RpdGxl PgorCisgICA8cGFyYT4KKyAgICBUaGUgZnVuY3Rpb24gc2hvd24gaW4gPHhyZWYgbGlua2VuZD0i ZnVuY3Rpb25zLW11bHRpeGFjdC1pbmZvcm1hdGlvbiIvPgorICAgIGV4cG9zZXMgaW50ZXJuYWwg TXVsdGlYYWN0IGNvdW50ZXJzIHVzZWQgYnkKKyAgICA8cHJvZHVjdG5hbWU+UG9zdGdyZVNRTDwv cHJvZHVjdG5hbWU+J3MgbG9ja2luZyBhbmQgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCBzdWJzeXN0 ZW1zLgorICAgIEl0IGlzIHByaW1hcmlseSBpbnRlbmRlZCBmb3IgbW9uaXRvcmluZyBhbmQgZGlh Z25vc3RpYyBwdXJwb3Nlcywgc3VjaCBhcyBhbmFseXppbmcKKyAgICBNdWx0aVhhY3QgY29uc3Vt cHRpb24gcGF0dGVybnMgb3IgYW50aWNpcGF0aW5nIHdyYXBhcm91bmQtcmVsYXRlZCBtYWludGVu YW5jZS4KKyAgIDwvcGFyYT4KKworICAgPHRhYmxlIGlkPSJmdW5jdGlvbnMtbXVsdGl4YWN0LWlu Zm9ybWF0aW9uIj4KKyAgICA8dGl0bGU+TXVsdGlYYWN0IEluZm9ybWF0aW9uIEZ1bmN0aW9uczwv dGl0bGU+CisgICAgPHRncm91cCBjb2xzPSIxIj4KKyAgICAgPHRoZWFkPgorICAgICAgPHJvdz4K KyAgICAgICA8ZW50cnkgcm9sZT0iZnVuY190YWJsZV9lbnRyeSI+CisgICAgICAgIDxwYXJhIHJv bGU9ImZ1bmNfc2lnbmF0dXJlIj5GdW5jdGlvbjwvcGFyYT4KKyAgICAgICAgPHBhcmE+RGVzY3Jp cHRpb248L3BhcmE+CisgICAgICAgPC9lbnRyeT4KKyAgICAgIDwvcm93PgorICAgICA8L3RoZWFk PgorICAgICA8dGJvZHk+CisgICAgICA8cm93PgorICAgICAgIDxlbnRyeSByb2xlPSJmdW5jX3Rh YmxlX2VudHJ5Ij4KKyAgICAgICAgPHBhcmEgcm9sZT0iZnVuY19zaWduYXR1cmUiPgorICAgICAg ICAgPGluZGV4dGVybT48cHJpbWFyeT5wZ19nZXRfbXVsdGl4YWN0X2NvdW50PC9wcmltYXJ5Pjwv aW5kZXh0ZXJtPgorICAgICAgICAgPGZ1bmN0aW9uPnBnX2dldF9tdWx0aXhhY3RfY291bnQ8L2Z1 bmN0aW9uPiAoKQorICAgICAgICAgPHJldHVybnZhbHVlPnJlY29yZDwvcmV0dXJudmFsdWU+Cisg ICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICBSZXR1cm5zIGEgcmVjb3Jk IHdpdGggdGhlIGZpZWxkcyA8c3RydWN0ZmllbGQ+bXVsdGl4YWN0czwvc3RydWN0ZmllbGQ+IGFu ZCA8c3RydWN0ZmllbGQ+bWVtYmVyczwvc3RydWN0ZmllbGQ+OgorICAgICAgICAgPGl0ZW1pemVk bGlzdD4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgIDxwYXJhPjxzdHJ1Y3RmaWVs ZD5tdWx0aXhhY3RzPC9zdHJ1Y3RmaWVsZD46IE51bWJlciBvZiBNdWx0aVhhY3RzIGFzc2lnbmVk LgorICAgICAgICAgICAgUG9zdGdyZVNRTCBpbml0aWF0ZXMgYWdncmVzc2l2ZSBhdXRvdmFjdXVt IHdoZW4gdGhpcyB2YWx1ZSBncm93cyBiZXlvbmQgdGhlIHRocmVzaG9sZAorICAgICAgICAgICAg ZGVmaW5lZCBieSA8dmFybmFtZT5hdXRvdmFjdXVtX211bHRpeGFjdF9mcmVlemVfbWF4X2FnZTwv dmFybmFtZT4sIHdoaWNoIGlzIGJhc2VkIG9uCisgICAgICAgICAgICB0aGUgYWdlIG9mIDxsaXRl cmFsPmRhdG1pbm14aWQ8L2xpdGVyYWw+LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUKKyAgICAgICAg ICAgIDx1bGluayB1cmw9Imh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC9y b3V0aW5lLXZhY3V1bWluZy5odG1sI1ZBQ1VVTS1GT1ItTVVMVElYQUNULVdSQVBBUk9VTkQiPgor ICAgICAgICAgICAgUm91dGluZSBWYWN1dW1pbmc6IE11bHRpeGFjdCBXcmFwYXJvdW5kPC91bGlu az4uPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgor ICAgICAgICAgICA8cGFyYT48c3RydWN0ZmllbGQ+bWVtYmVyczwvc3RydWN0ZmllbGQ+OiBOdW1i ZXIgb2YgTXVsdGlYYWN0IG1lbWJlciBlbnRyaWVzIGNyZWF0ZWQuCisgICAgICAgICAgICBUaGVz ZSBhcmUgc3RvcmVkIGluIGZpbGVzIHVuZGVyIHRoZSA8ZmlsZW5hbWU+cGdfbXVsdGl4YWN0L21l bWJlcnM8L2ZpbGVuYW1lPiBzdWJkaXJlY3RvcnkuCisgICAgICAgICAgICBXcmFwYXJvdW5kIG9j Y3VycyBhZnRlciBhcHByb3hpbWF0ZWx5IDQuMjkgYmlsbGlvbiBlbnRyaWVzICh+MjDigK9HaUIp LiBQb3N0Z3JlU1FMIGluaXRpYXRlcworICAgICAgICAgICAgYWdncmVzc2l2ZSBhdXRvdmFjdXVt IHdoZW4gdGhlIG51bWJlciBvZiBtZW1iZXJzIGNyZWF0ZWQgZXhjZWVkcyBhcHByb3hpbWF0ZWx5 IDIuMTQ1IGJpbGxpb24KKyAgICAgICAgICAgIG9yIHdoZW4gc3RvcmFnZSBjb25zdW1wdGlvbiBp biA8ZmlsZW5hbWU+cGdfbXVsdGl4YWN0L21lbWJlcnM8L2ZpbGVuYW1lPiBhcHByb2FjaGVzIDEw 4oCvR2lCLjwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgPC9pdGVtaXpl ZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICA8L2VudHJ5PgorICAgICAgPC9yb3c+Cisg ICAgIDwvdGJvZHk+CisgICAgPC90Z3JvdXA+CisgICA8L3RhYmxlPgorCisgIDwvc2VjdDI+CisK ICAgPC9zZWN0MT4KIAogICA8c2VjdDEgaWQ9ImZ1bmN0aW9ucy1hZG1pbiI+CmRpZmYgLS1naXQg YS9kb2Mvc3JjL3NnbWwvbWFpbnRlbmFuY2Uuc2dtbCBiL2RvYy9zcmMvc2dtbC9tYWludGVuYW5j ZS5zZ21sCmluZGV4IDYwMGU0YjNmMmYzLi5hNDQ1ZDFiMDYxYyAxMDA2NDQKLS0tIGEvZG9jL3Ny Yy9zZ21sL21haW50ZW5hbmNlLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL21haW50ZW5hbmNlLnNn bWwKQEAgLTgxOCw2ICs4MTgsMTQgQEAgSElOVDogIEV4ZWN1dGUgYSBkYXRhYmFzZS13aWRlIFZB Q1VVTSBpbiB0aGF0IGRhdGFiYXNlLgogICAgICBhcmVhIGNhbiBncm93IHVwIHRvIGFib3V0IDIw R0IgYmVmb3JlIHJlYWNoaW5nIHdyYXBhcm91bmQuCiAgICAgPC9wYXJhPgogCisgICAgPHBhcmE+ CisgICAgIFRoZSA8ZnVuY3Rpb24+PGxpbmsgbGlua2VuZD0iZnVuY3Rpb25zLW11bHRpeGFjdC1p bmZvcm1hdGlvbiI+cGdfZ2V0X211bHRpeGFjdF9jb3VudDwvbGluaz48L2Z1bmN0aW9uPgorICAg ICBmdW5jdGlvbiBwcm92aWRlcyBhIHdheSB0byBjaGVjayBob3cgbWFueSBtdWx0aXhhY3RzIGFu ZCBtZW1iZXIgZW50cmllcyBoYXZlIGJlZW4gYWxsb2NhdGVkLiBUaGlzIGNhbgorICAgICBiZSB1 c2VmdWwgZm9yIGlkZW50aWZ5aW5nIHVudXN1YWwgbXVsdGl4YWN0IGFjdGl2aXR5LCBtb25pdG9y aW5nIHByb2dyZXNzIHRvd2FyZCB3cmFwYXJvdW5kLCBhbnRpY2lwYXRpbmcKKyAgICAgc3lzdGVt LXdpZGUgYWdncmVzc2l2ZSBhdXRvdmFjdXVtIGFzIHVzYWdlIGFwcHJvYWNoZXMgY3JpdGljYWwg dGhyZXNob2xkcywgb3IgdmVyaWZ5aW5nIHdoZXRoZXIgYXV0b3ZhY3V1bQorICAgICBpcyBrZWVw aW5nIHVwIHdpdGggZGVtYW5kLgorICAgIDwvcGFyYT4KKwogICAgIDxwYXJhPgogICAgICBTaW1p bGFyIHRvIHRoZSBYSUQgY2FzZSwgaWYgYXV0b3ZhY3V1bSBmYWlscyB0byBjbGVhciBvbGQgTVhJ RHMgZnJvbSBhIHRhYmxlLCB0aGUKICAgICAgc3lzdGVtIHdpbGwgYmVnaW4gdG8gZW1pdCB3YXJu aW5nIG1lc3NhZ2VzIHdoZW4gdGhlIGRhdGFiYXNlJ3Mgb2xkZXN0IE1YSURzIHJlYWNoIGZvcnR5 CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9tdWx0aXhhY3QuYyBiL3Ny Yy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL211bHRpeGFjdC5jCmluZGV4IDNjMDZhYzQ1NTMyLi5l ZDI5NzQ2ZWFhOSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vbXVsdGl4 YWN0LmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vbXVsdGl4YWN0LmMKQEAgLTM1 ODUsMyArMzU4NSwzMyBAQCBtdWx0aXhhY3RtZW1iZXJzc3luY2ZpbGV0YWcoY29uc3QgRmlsZVRh ZyAqZnRhZywgY2hhciAqcGF0aCkKIHsKIAlyZXR1cm4gU2xydVN5bmNGaWxlVGFnKE11bHRpWGFj dE1lbWJlckN0bCwgZnRhZywgcGF0aCk7CiB9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50 IGNvdW50IG9mIG11bHRpeGFjdCBtZW1iZXJzIGFuZCBtdWx0aXhhY3QgSURzCisgKi8KK1BHX0ZV TkNUSU9OX0lORk9fVjEocGdfZ2V0X211bHRpeGFjdF9jb3VudCk7CisKK0RhdHVtCitwZ19nZXRf bXVsdGl4YWN0X2NvdW50KFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJVHVwbGVEZXNjCQl0dXBkZXNj OworCURhdHVtCQkJdmFsdWVzWzJdOworCWJvb2wJCQludWxsc1syXSA9IHtmYWxzZSwgZmFsc2V9 OworCU11bHRpWGFjdE9mZnNldAltZW1iZXJzOworCXVpbnQzMgkJCW11bHRpeGFjdHM7CisJSGVh cFR1cGxlCQl0dXBsZTsKKworCWlmIChnZXRfY2FsbF9yZXN1bHRfdHlwZShmY2luZm8sIE5VTEws ICZ0dXBkZXNjKSAhPSBUWVBFRlVOQ19DT01QT1NJVEUpCisJCWVyZXBvcnQoRVJST1IsCisJCQkJ KGVycm1zZygicmV0dXJuIHR5cGUgbXVzdCBiZSBhIHJvdyB0eXBlIikpKTsKKworCWlmICghUmVh ZE11bHRpWGFjdENvdW50cygmbXVsdGl4YWN0cywgJm1lbWJlcnMpKQorCQllcmVwb3J0KEVSUk9S LAorCQkJCShlcnJtc2coImNvdWxkIG5vdCByZWFkIG11bHRpeGFjdCBjb3VudHMiKSkpOworCisJ dmFsdWVzWzBdID0gVUludDMyR2V0RGF0dW0obXVsdGl4YWN0cyk7CisJdmFsdWVzWzFdID0gVUlu dDMyR2V0RGF0dW0obWVtYmVycyk7CisKKwl0dXBsZSA9IGhlYXBfZm9ybV90dXBsZSh0dXBkZXNj LCB2YWx1ZXMsIG51bGxzKTsKKwlQR19SRVRVUk5fREFUVU0oSGVhcFR1cGxlR2V0RGF0dW0odHVw bGUpKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgYi9z cmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CmluZGV4IGQzZDI4YTI2M2ZhLi4wOTExNWFk MWIzNSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAorKysgYi9z cmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CkBAIC0xMjU1Niw0ICsxMjU1NiwxOSBAQAog ICBwcm9hcmduYW1lcyA9PiAne3BpZCxpb19pZCxpb19nZW5lcmF0aW9uLHN0YXRlLG9wZXJhdGlv bixvZmYsbGVuZ3RoLHRhcmdldCxoYW5kbGVfZGF0YV9sZW4scmF3X3Jlc3VsdCxyZXN1bHQsdGFy Z2V0X2Rlc2MsZl9zeW5jLGZfbG9jYWxtZW0sZl9idWZmZXJlZH0nLAogICBwcm9zcmMgPT4gJ3Bn X2dldF9haW9zJyB9LAogCisjIFJldHVybnMgY3VycmVudCBjb3VudHMgb2YgbXVsdGl4YWN0IG1l bWJlcnMgYW5kIG11bHRpeGFjdCBJRHMKK3sKKyAgb2lkID0+ICc5MDAxJywKKyAgZGVzY3IgPT4g J2dldCBjdXJyZW50IG11bHRpeGFjdCBtZW1iZXIgYW5kIG11bHRpeGFjdCBJRCBjb3VudHMnLAor ICBwcm9uYW1lID0+ICdwZ19nZXRfbXVsdGl4YWN0X2NvdW50JywKKyAgcHJvcmV0dHlwZSA9PiAn cmVjb3JkJywKKyAgcHJvYXJndHlwZXMgPT4gJycsCisgIHByb2FsbGFyZ3R5cGVzID0+ICd7aW50 NCxpbnQ4fScsCisgIHByb2FyZ21vZGVzID0+ICd7byxvfScsCisgIHByb2FyZ25hbWVzID0+ICd7 bXVsdGl4YWN0cyxtZW1iZXJzfScsCisgIHByb3ZvbGF0aWxlID0+ICd2JywKKyAgcHJvcGFyYWxs ZWwgPT4gJ3MnLAorICBwcm9zcmMgPT4gJ3BnX2dldF9tdWx0aXhhY3RfY291bnQnCit9LAorCiBd Ci0tIAoyLjQ3LjEKCg== --00000000000085c9a606372a982a--