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.96) (envelope-from ) id 1w3cHe-001OdY-32 for pgsql-hackers@arkaria.postgresql.org; Fri, 20 Mar 2026 16:01:11 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w3cHd-006zqx-11 for pgsql-hackers@arkaria.postgresql.org; Fri, 20 Mar 2026 16:01:09 +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.96) (envelope-from ) id 1w3cHd-006zqU-02 for pgsql-hackers@lists.postgresql.org; Fri, 20 Mar 2026 16:01:09 +0000 Received: from mail-oo1-xc34.google.com ([2607:f8b0:4864:20::c34]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w3cHa-00000000CZh-17I5 for pgsql-hackers@lists.postgresql.org; Fri, 20 Mar 2026 16:01:08 +0000 Received: by mail-oo1-xc34.google.com with SMTP id 006d021491bc7-67c281e3fa1so361396eaf.0 for ; Fri, 20 Mar 2026 09:01:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1774022465; cv=none; d=google.com; s=arc-20240605; b=LgaTeZldMqUyOEyWGGFEa2hQ/T/bccXp82MlcQSb2ifQ70/6trqIx0VMOvx17KdXMf kURSMztOwKJ/q2XOt4c3/uu9qH7TPbdNMurW24CPY+Ryz+hcSU56f9WXktOEQtj1K6Z9 fj+z7XLbBG54a3xr8MH8QaQ3joBCWJEi/FnnXQoqYRfwKFwd0UQ5gyt4S8SaafOjhKc+ +RghTsaiFQlqKX0s+ESFqchbByJmwA28bpp/svwEQ6PbmsGF6IQgC7G8M4qROK7Esibl e65Z+am7/9Av0JIEuBowfvF7GGm2B3bqckhGvW+ZJWWNiNrNqbmL+rcJidrPncrOdyZg AQfA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=mA7ZM/vzf5dz9kXt0tRArMcU1EUd/NQ2fAGQe7dZIAM=; fh=QvZKJ+oGtveuXis9HxVBQpsV0iPGsNNT2RW2g6DEy/o=; b=feLX7krz8/CyJ+z7bSEHcmYTsu/LvSbWi4OmMeTZ0KW02vfGylc7HW0ljc2vz6CREs NkK3d8Pn2AGpnpeKCVI+kTVOWpFsCC9IUXKueKKrJecC2PP8vbFjkIuiw77VYwJgsCzp dBCc5yotk/4zP6FrINvYymUTpXhk1ijw5O8Z8UQWw398Zstpdcb6tg8/SB1xKNCh5s4a HibkXHWlov+a2jHsoxFCtF/bwUa9I2OMqUMFI0wPYRjPTbofW5VIaGdqF4f2f34vlBb6 HlWYv/xKsj2XtWH2CkVJaoLHHd4qT5aU0ky9aBDxpP7MwEcnPSHsKrWrjOrD8KsbBHFo ROVA==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1774022465; x=1774627265; darn=lists.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=mA7ZM/vzf5dz9kXt0tRArMcU1EUd/NQ2fAGQe7dZIAM=; b=A51dJX0YMqnmFB38+9Seq/U1TXVK20i5k4kHgrC/mgdAiY7TaAuOTar0JV0la9A+E1 igIZMegL5gu31uoYHsQ2zHdnBxamhf0tFjE1KhUlId+A+RrPtMR+FEya0OjoM4LqJr7w /5bPYrBgOuzlNOZmDUSoS3LGD+KUChfm1UnMtgvrC+xEaKk8WfE679BvhAPvvEfX7xub auVfq6CM3FffAfryEsDpAUZNaTdV5CcnzVSgQJxiUrnsCOlvJ/ceeWH9WhAHinMus/vS sYlxd1poE59m6CPQO5gYIwrSS0Mm2g1fkkon4S+NF0sWZvVKWfkyS92c/pHY4gMm6QzC J3eQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774022465; x=1774627265; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=mA7ZM/vzf5dz9kXt0tRArMcU1EUd/NQ2fAGQe7dZIAM=; b=Wc5hyEjF+wLe9Z3hTYmH0KMUuzGibiBK+ICspvcY0eXRFCt7G5r8tHEY36n+mxf3sW O6coQ7YL8d3EvNjgTHta93Q8bTwWrAO5MP6gFi/4b1mKVm/gBxmtsr6NuAcMH0CkBMnO UODHvojLqiyTgS6Ywr5FAkVQK1PIKoNLsfBg8ItqpbiSTOGWvLwEG1SSAuxIXsmAAXbb E3DjUH3Vm6zBSUkywPxO4dU1ajRVMTFMXEE5MZo3P6YUZZPFwq2M2i5hHIXGcGs412wf xCLqm+IvnRKf1qEfvPeGpB7Sw85ClDxBYkhV75pA2YY0rJL3hq3P7C4UvLHlhModaE86 2fAQ== X-Forwarded-Encrypted: i=1; AJvYcCUqspjblHbScM6+bCC6W5bvliFFAHD8fOYOrgYZewVT8OshmIfOTVj5IseqA3PfvxwOiBoNhq/J4lLV60k6@lists.postgresql.org X-Gm-Message-State: AOJu0YwrvH9b5kg13UmmGo0qfZ8bedTWk8dH8Qt5OKqLIv70ZMOaIsYS 3ugTHzdsQwvO9OofYnxHq1MXCWbbHqbWol1ALD7xHT5CqnYOrNc/pee0Ic1qe48MJi++voG3g6L it6RMv9bh+jrCGNdOKjFzg84jeHBFYQA= X-Gm-Gg: ATEYQzyyoDaQncD6+wqLzusb3UZ5p4E462ZiU9Gif+2Ek31k6RqhltDKGBEfzBU7wnP 5ltdQUecpFiAYCNSSjCpc8xD94kXOXVbr5hI/QWl6+YoQ6cxzit2YDO0gZtZ0He+j6mqICsvK9i 2cVNFzcVPMxm6NYWe9CrdgBtgXsFt4N9sO4NsfDtvMNM7bvHyVhAtB3Fw/WHooy3PTAjVfVh12R PNTkArdFQ4VxGTc8KTcJ4QWNXfdoZWkAlAc4zEu759UNIbHpNCwrqzm3i6OjmpQJHs1o3161KrF 574/LoP0Wq8ukab3g2mcpUDMu4SY0B/HpS3O3hDcy0hbvB7j0O4= X-Received: by 2002:a05:6820:1a05:b0:67c:1d0b:d65e with SMTP id 006d021491bc7-67c22faa291mr2306648eaf.48.1774022464622; Fri, 20 Mar 2026 09:01:04 -0700 (PDT) MIME-Version: 1.0 References: <783426a05a756b29b5b1ef4d5640f22d999fdec8.camel@j-davis.com> In-Reply-To: From: Bharath Rupireddy Date: Fri, 20 Mar 2026 09:00:00 -0700 X-Gm-Features: AaiRm52CpmQPxaFkamLCpmHx0ui0y1BAGa2gXa_ISXMCQchml2mAMbzQ2cKlLRc Message-ID: Subject: Re: Use WALReadFromBuffers in more places To: Jeff Davis Cc: Jingtang Zhang , pgsql-hackers@lists.postgresql.org, Nitin Jadhav Content-Type: multipart/mixed; boundary="000000000000d3f706064d76ca22" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000d3f706064d76ca22 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Sep 24, 2025 at 12:32=E2=80=AFPM Bharath Rupireddy wrote: > > > On Wed, 2025-09-24 at 07:26 -0700, Bharath Rupireddy wrote: > > > Right. Reading unflushed WAL buffers for replication was one of the > > > motivations. But, in general, WALReadFromBuffers has more benefits > > > since it lets WAL buffers act as a cache for reads, avoiding the need > > > to re-read WAL from disk for (both physical and logical) replication. > > > For example, it makes the use of direct I/O for WAL more realistic > > > and > > > can provide significant performance benefits [1]. > > Thanks for looking into this. I did performance analysis with WAL directo= I/O to see how reading from WAL buffers affects walsenders: https://www.po= stgresql.org/message-id/CALj2ACV6rS%2B7iZx5%2BoAvyXJaN4AG-djAQeM1mrM%3DYSDk= VrUs7g%40mail.gmail.com. Following is from that thread. Please let me know = if you have any specific cases in mind. I'm happy to run the same test for = logical replication. > > It helps WAL DIO; since there's no OS > page cache, using WAL buffers as read cache helps a lot. It is clearly > evident from my experiment with WAL DIO patch [1], see the results [2] > and attached graph. As expected, WAL DIO brings down the TPS, whereas > WAL buffers read i.e. this patch brings it up. > > [2] Test case is an insert pgbench workload. > clients HEAD | WAL DIO | WAL DIO & WAL BUFFERS READ | WAL BUFFERS READ > 1 1404 1070 1424 1375 > 2 1487 796 1454 1517 > 4 3064 1743 3011 3019 > 8 6114 3556 6026 5954 > 16 11560 7051 12216 12132 > 32 23181 13079 23449 23561 > 64 43607 26983 43997 45636 > 128 80723 45169 81515 81911 > 256 110925 90185 107332 114046 > 512 119354 109817 110287 117506 > 768 112435 105795 106853 111605 > 1024 107554 105541 105942 109370 > 2048 88552 79024 80699 90555 > 4096 61323 54814 58704 61743 Thank you all for reviewing this. Please find the attached rebased patch for further review. -- Bharath Rupireddy Amazon Web Services: https://aws.amazon.com --000000000000d3f706064d76ca22 Content-Type: application/x-patch; name="v4-0001-Use-WALReadFromBuffers-in-more-places.patch" Content-Disposition: attachment; filename="v4-0001-Use-WALReadFromBuffers-in-more-places.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmyjcqck0 RnJvbSBiNWY2ZmMwODNjYWFhMzY0OGY4YWJmZGMzNzBkMDI4OWU2Mzc5MzFmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBCaGFyYXRoIFJ1cGlyZWRkeSA8YmhhcmF0aC5ydXBpcmVkZHlm b3Jwb3N0Z3Jlc0BnbWFpbC5jb20+CkRhdGU6IEZyaSwgMjAgTWFyIDIwMjYgMDY6NDQ6NDggKzAw MDAKU3ViamVjdDogW1BBVENIIHY0XSBVc2UgV0FMUmVhZEZyb21CdWZmZXJzIGluIG1vcmUgcGxh Y2VzCgpDb21taXQgOTFmMmNhZSBpbnRyb2R1Y2VkIFdBTFJlYWRGcm9tQnVmZmVycyBidXQgdXNl ZCBpdCBvbmx5IGZvcgpwaHlzaWNhbCByZXBsaWNhdGlvbiB3YWxzZW5kZXJzLiBUaGVyZSBhcmUg c2V2ZXJhbCBvdGhlciBjYWxsZXJzCnRoYXQgdXNlIHRoZSByZWFkX2xvY2FsX3hsb2dfcGFnZSBw YWdlX3JlYWQgY2FsbGJhY2ssIGFuZCBsb2dpY2FsCnJlcGxpY2F0aW9uIHdhbHNlbmRlcnMgY2Fu IGFsc28gYmVuZWZpdCBmcm9tIHJlYWRpbmcgV0FMIGZyb20gV0FMCmJ1ZmZlcnMgdXNpbmcgdGhl IG5ldyBmdW5jdGlvbi4gVGhpcyBjb21taXQgZXh0ZW5kcyB0aGUgdXNlIG9mCldBTFJlYWRGcm9t QnVmZmVycyB0byB0aGVzZSBjYWxsZXJzLgoKQXV0aG9yOiBCaGFyYXRoIFJ1cGlyZWRkeQpSZXZp ZXdlZC1ieTogSmluZ3RhbmcgWmhhbmcsIE5pdGluIEphZGhhdgpEaXNjdXNzaW9uOiBodHRwczov L3d3dy5wb3N0Z3Jlc3FsLm9yZy9tZXNzYWdlLWlkL0NBTGoyQUNWZkYyVWo5Tm9GeS01bTk4SE50 akhwdUQxN0VERTl0d1ZlSm5nLWpUQWU3QSU0MG1haWwuZ21haWwuY29tCi0tLQogc3JjL2JhY2tl bmQvYWNjZXNzL3RyYW5zYW0veGxvZ3V0aWxzLmMgfCAyMyArKysrKysrLQogc3JjL2JhY2tlbmQv cmVwbGljYXRpb24vd2Fsc2VuZGVyLmMgICAgfCA3NyArKysrKysrKysrKysrKysrKy0tLS0tLS0t LQogMiBmaWxlcyBjaGFuZ2VkLCA3MCBpbnNlcnRpb25zKCspLCAzMCBkZWxldGlvbnMoLSkKCmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ndXRpbHMuYyBiL3NyYy9i YWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2d1dGlscy5jCmluZGV4IDVmYmUzOTEzM2I4Li5jNGM2 NzdmNjlmZCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ3V0aWxz LmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ3V0aWxzLmMKQEAgLTg3Niw2 ICs4NzYsNyBAQCByZWFkX2xvY2FsX3hsb2dfcGFnZV9ndXRzKFhMb2dSZWFkZXJTdGF0ZSAqc3Rh dGUsIFhMb2dSZWNQdHIgdGFyZ2V0UGFnZVB0ciwKIAlpbnQJCQljb3VudDsKIAlXQUxSZWFkRXJy b3IgZXJyaW5mbzsKIAlUaW1lTGluZUlECWN1cnJUTEk7CisJU2l6ZQkJYnl0ZXNSZWFkOwogCiAJ bG9jID0gdGFyZ2V0UGFnZVB0ciArIHJlcUxlbjsKIApAQCAtOTk1LDkgKzk5NiwyNSBAQCByZWFk X2xvY2FsX3hsb2dfcGFnZV9ndXRzKFhMb2dSZWFkZXJTdGF0ZSAqc3RhdGUsIFhMb2dSZWNQdHIg dGFyZ2V0UGFnZVB0ciwKIAkJY291bnQgPSByZWFkX3VwdG8gLSB0YXJnZXRQYWdlUHRyOwogCX0K IAotCWlmICghV0FMUmVhZChzdGF0ZSwgY3VyX3BhZ2UsIHRhcmdldFBhZ2VQdHIsIGNvdW50LCB0 bGksCi0JCQkJICZlcnJpbmZvKSkKLQkJV0FMUmVhZFJhaXNlRXJyb3IoJmVycmluZm8pOworCS8q IEZpcnN0IGF0dGVtcHQgdG8gcmVhZCBmcm9tIFdBTCBidWZmZXJzICovCisJYnl0ZXNSZWFkID0g V0FMUmVhZEZyb21CdWZmZXJzKGN1cl9wYWdlLCB0YXJnZXRQYWdlUHRyLCBjb3VudCwgY3VyclRM SSk7CisKKwkvKiBJZiB3ZSBzdGlsbCBoYXZlIGJ5dGVzIHRvIHJlYWQsIGdldCB0aGVtIGZyb20g V0FMIGZpbGUgKi8KKwlpZiAoYnl0ZXNSZWFkIDwgY291bnQpCisJeworCQlpZiAoIVdBTFJlYWQo c3RhdGUsCisJCQkJCSBjdXJfcGFnZSArIGJ5dGVzUmVhZCwKKwkJCQkJIHRhcmdldFBhZ2VQdHIg KyBieXRlc1JlYWQsCisJCQkJCSBjb3VudCAtIGJ5dGVzUmVhZCwKKwkJCQkJIHRsaSwKKwkJCQkJ ICZlcnJpbmZvKSkKKwkJeworCQkJV0FMUmVhZFJhaXNlRXJyb3IoJmVycmluZm8pOworCQl9CisJ CWJ5dGVzUmVhZCA9IGNvdW50OwkJLyogQWxsIHJlcXVlc3RlZCBieXRlcyByZWFkICovCisJfQor CisJQXNzZXJ0KGJ5dGVzUmVhZCA9PSBjb3VudCk7CiAKIAkvKiBudW1iZXIgb2YgdmFsaWQgYnl0 ZXMgaW4gdGhlIGJ1ZmZlciAqLwogCXJldHVybiBjb3VudDsKZGlmZiAtLWdpdCBhL3NyYy9iYWNr ZW5kL3JlcGxpY2F0aW9uL3dhbHNlbmRlci5jIGIvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vd2Fs c2VuZGVyLmMKaW5kZXggMDgyNTMxMDNjYjMuLjk1MjU1OTQ4ZWNhIDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9yZXBsaWNhdGlvbi93YWxzZW5kZXIuYworKysgYi9zcmMvYmFja2VuZC9yZXBsaWNh dGlvbi93YWxzZW5kZXIuYwpAQCAtMTA1NCw2ICsxMDU0LDcgQEAgbG9naWNhbF9yZWFkX3hsb2df cGFnZShYTG9nUmVhZGVyU3RhdGUgKnN0YXRlLCBYTG9nUmVjUHRyIHRhcmdldFBhZ2VQdHIsIGlu dCByZXEKIAlXQUxSZWFkRXJyb3IgZXJyaW5mbzsKIAlYTG9nU2VnTm8Jc2Vnbm87CiAJVGltZUxp bmVJRAljdXJyVExJOworCVNpemUJCWJ5dGVzUmVhZDsKIAogCS8qCiAJICogTWFrZSBzdXJlIHdl IGhhdmUgZW5vdWdoIFdBTCBhdmFpbGFibGUgYmVmb3JlIHJldHJpZXZpbmcgdGhlIGN1cnJlbnQK QEAgLTEwOTEsMTYgKzEwOTIsMjkgQEAgbG9naWNhbF9yZWFkX3hsb2dfcGFnZShYTG9nUmVhZGVy U3RhdGUgKnN0YXRlLCBYTG9nUmVjUHRyIHRhcmdldFBhZ2VQdHIsIGludCByZXEKIAllbHNlCiAJ CWNvdW50ID0gZmx1c2hwdHIgLSB0YXJnZXRQYWdlUHRyOwkvKiBwYXJ0IG9mIHRoZSBwYWdlIGF2 YWlsYWJsZSAqLwogCi0JLyogbm93IGFjdHVhbGx5IHJlYWQgdGhlIGRhdGEsIHdlIGtub3cgaXQn cyB0aGVyZSAqLwotCWlmICghV0FMUmVhZChzdGF0ZSwKLQkJCQkgY3VyX3BhZ2UsCi0JCQkJIHRh cmdldFBhZ2VQdHIsCi0JCQkJIGNvdW50LAotCQkJCSBjdXJyVExJLAkJLyogUGFzcyB0aGUgY3Vy cmVudCBUTEkgYmVjYXVzZSBvbmx5CisJLyogRmlyc3QgYXR0ZW1wdCB0byByZWFkIGZyb20gV0FM IGJ1ZmZlcnMgKi8KKwlieXRlc1JlYWQgPSBXQUxSZWFkRnJvbUJ1ZmZlcnMoY3VyX3BhZ2UsIHRh cmdldFBhZ2VQdHIsIGNvdW50LCBjdXJyVExJKTsKKworCXRhcmdldFBhZ2VQdHIgKz0gYnl0ZXNS ZWFkOworCisJLyogSWYgd2Ugc3RpbGwgaGF2ZSBieXRlcyB0byByZWFkLCBnZXQgdGhlbSBmcm9t IFdBTCBmaWxlICovCisJaWYgKGJ5dGVzUmVhZCA8IGNvdW50KQorCXsKKwkJaWYgKCFXQUxSZWFk KHN0YXRlLAorCQkJCQkgY3VyX3BhZ2UgKyBieXRlc1JlYWQsCisJCQkJCSB0YXJnZXRQYWdlUHRy LAorCQkJCQkgY291bnQgLSBieXRlc1JlYWQsCisJCQkJCSBjdXJyVExJLAkvKiBQYXNzIHRoZSBj dXJyZW50IFRMSSBiZWNhdXNlIG9ubHkKIAkJCQkJCQkJICogV2FsU25kU2VnbWVudE9wZW4gY29u dHJvbHMgd2hldGhlciBuZXcgVExJCiAJCQkJCQkJCSAqIGlzIG5lZWRlZC4gKi8KLQkJCQkgJmVy cmluZm8pKQotCQlXQUxSZWFkUmFpc2VFcnJvcigmZXJyaW5mbyk7CisJCQkJCSAmZXJyaW5mbykp CisJCXsKKwkJCVdBTFJlYWRSYWlzZUVycm9yKCZlcnJpbmZvKTsKKwkJfQorCQlieXRlc1JlYWQg PSBjb3VudDsJCS8qIEFsbCByZXF1ZXN0ZWQgYnl0ZXMgcmVhZCAqLworCX0KKworCUFzc2VydChi eXRlc1JlYWQgPT0gY291bnQpOwogCiAJLyoKIAkgKiBBZnRlciByZWFkaW5nIGludG8gdGhlIGJ1 ZmZlciwgY2hlY2sgdGhhdCB3aGF0IHdlIHJlYWQgd2FzIHZhbGlkLiBXZSBkbwpAQCAtMzIxOSw3 ICszMjMzLDcgQEAgWExvZ1NlbmRQaHlzaWNhbCh2b2lkKQogCVNpemUJCW5ieXRlczsKIAlYTG9n U2VnTm8Jc2Vnbm87CiAJV0FMUmVhZEVycm9yIGVycmluZm87Ci0JU2l6ZQkJcmJ5dGVzOworCVNp emUJCWJ5dGVzUmVhZDsKIAogCS8qIElmIHJlcXVlc3RlZCBzd2l0Y2ggdGhlIFdBTCBzZW5kZXIg dG8gdGhlIHN0b3BwaW5nIHN0YXRlLiAqLwogCWlmIChnb3RfU1RPUFBJTkcpCkBAIC0zNDM1LDI0 ICszNDQ5LDMzIEBAIFhMb2dTZW5kUGh5c2ljYWwodm9pZCkKIAllbmxhcmdlU3RyaW5nSW5mbygm b3V0cHV0X21lc3NhZ2UsIG5ieXRlcyk7CiAKIHJldHJ5OgotCS8qIGF0dGVtcHQgdG8gcmVhZCBX QUwgZnJvbSBXQUwgYnVmZmVycyBmaXJzdCAqLwotCXJieXRlcyA9IFdBTFJlYWRGcm9tQnVmZmVy cygmb3V0cHV0X21lc3NhZ2UuZGF0YVtvdXRwdXRfbWVzc2FnZS5sZW5dLAotCQkJCQkJCQlzdGFy dHB0ciwgbmJ5dGVzLCB4bG9ncmVhZGVyLT5zZWcud3NfdGxpKTsKLQlvdXRwdXRfbWVzc2FnZS5s ZW4gKz0gcmJ5dGVzOwotCXN0YXJ0cHRyICs9IHJieXRlczsKLQluYnl0ZXMgLT0gcmJ5dGVzOwot Ci0JLyogbm93IHJlYWQgdGhlIHJlbWFpbmluZyBXQUwgZnJvbSBXQUwgZmlsZSAqLwotCWlmIChu Ynl0ZXMgPiAwICYmCi0JCSFXQUxSZWFkKHhsb2dyZWFkZXIsCi0JCQkJICZvdXRwdXRfbWVzc2Fn ZS5kYXRhW291dHB1dF9tZXNzYWdlLmxlbl0sCi0JCQkJIHN0YXJ0cHRyLAotCQkJCSBuYnl0ZXMs Ci0JCQkJIHhsb2dyZWFkZXItPnNlZy53c190bGksCS8qIFBhc3MgdGhlIGN1cnJlbnQgVExJIGJl Y2F1c2UKLQkJCQkJCQkJCQkJICogb25seSBXYWxTbmRTZWdtZW50T3BlbiBjb250cm9scwotCQkJ CQkJCQkJCQkgKiB3aGV0aGVyIG5ldyBUTEkgaXMgbmVlZGVkLiAqLwotCQkJCSAmZXJyaW5mbykp Ci0JCVdBTFJlYWRSYWlzZUVycm9yKCZlcnJpbmZvKTsKKwkvKiBGaXJzdCBhdHRlbXB0IHRvIHJl YWQgZnJvbSBXQUwgYnVmZmVycyAqLworCWJ5dGVzUmVhZCA9IFdBTFJlYWRGcm9tQnVmZmVycygm b3V0cHV0X21lc3NhZ2UuZGF0YVtvdXRwdXRfbWVzc2FnZS5sZW5dLAorCQkJCQkJCQkgICBzdGFy dHB0ciwKKwkJCQkJCQkJICAgbmJ5dGVzLAorCQkJCQkJCQkgICB4bG9ncmVhZGVyLT5zZWcud3Nf dGxpKTsKKworCXN0YXJ0cHRyICs9IGJ5dGVzUmVhZDsKKworCS8qIElmIHdlIHN0aWxsIGhhdmUg Ynl0ZXMgdG8gcmVhZCwgZ2V0IHRoZW0gZnJvbSBXQUwgZmlsZSAqLworCWlmIChieXRlc1JlYWQg PCBuYnl0ZXMpCisJeworCQlpZiAoIVdBTFJlYWQoeGxvZ3JlYWRlciwKKwkJCQkJICZvdXRwdXRf bWVzc2FnZS5kYXRhW291dHB1dF9tZXNzYWdlLmxlbiArIGJ5dGVzUmVhZF0sCisJCQkJCSBzdGFy dHB0ciwKKwkJCQkJIG5ieXRlcyAtIGJ5dGVzUmVhZCwKKwkJCQkJIHhsb2dyZWFkZXItPnNlZy53 c190bGksCS8qIFBhc3MgdGhlIGN1cnJlbnQgVExJCisJCQkJCQkJCQkJCQkgKiBiZWNhdXNlIG9u bHkKKwkJCQkJCQkJCQkJCSAqIFdhbFNuZFNlZ21lbnRPcGVuIGNvbnRyb2xzCisJCQkJCQkJCQkJ CQkgKiB3aGV0aGVyIG5ldyBUTEkgaXMgbmVlZGVkLiAqLworCQkJCQkgJmVycmluZm8pKQorCQl7 CisJCQlXQUxSZWFkUmFpc2VFcnJvcigmZXJyaW5mbyk7CisJCX0KKwkJYnl0ZXNSZWFkID0gbmJ5 dGVzOwkJLyogQWxsIHJlcXVlc3RlZCBieXRlcyByZWFkICovCisJfQorCisJQXNzZXJ0KGJ5dGVz UmVhZCA9PSBuYnl0ZXMpOwogCiAJLyogU2VlIGxvZ2ljYWxfcmVhZF94bG9nX3BhZ2UoKS4gKi8K IAlYTEJ5dGVUb1NlZyhzdGFydHB0ciwgc2Vnbm8sIHhsb2dyZWFkZXItPnNlZ2N4dC53c19zZWdz aXplKTsKLS0gCjIuNDcuMwoK --000000000000d3f706064d76ca22--