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 1pPOXN-0006PQ-Uo for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Feb 2023 14:01:34 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1pPOXM-0005KT-Ou for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Feb 2023 14:01:32 +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 1pPOXM-0005KK-5Q for pgsql-hackers@lists.postgresql.org; Tue, 07 Feb 2023 14:01:32 +0000 Received: from mail-lj1-x22e.google.com ([2a00:1450:4864:20::22e]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1pPOXJ-0002rv-Ma for pgsql-hackers@lists.postgresql.org; Tue, 07 Feb 2023 14:01:31 +0000 Received: by mail-lj1-x22e.google.com with SMTP id d8so15645331ljq.9 for ; Tue, 07 Feb 2023 06:01:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=RsVDub5+7MAuOSua5XBwEJxAaLBlVLtIFPHPz7Q4g80=; b=BQYGsp+hF5tM0Ks6YG7hWUtecoBMQKO6VcgWhndKjTdZP2j7yRYmJhN+hYOk31JjBp +ApXJPvsHLsNPLjJ3grZdiHFFRIRw4QzRK8jJ8y6Xhze6sTYHwE8fsCm9ghlOPaM3cES +MR0GClCDGRoqPXLCEOE2DxM5ABnhFNXuag7oUH3NqpYKt6XqBe1bSnJyN0mTBSJlf6p pqd2D1Fh8E/20Go+1+/qCVtq0z+Lg9wX3Ov98JWTm/VnoGe5LOC85k58AunfGptWVEkM 5r1Q9slIt5PlFQRSnqY8PsLBsEkiq0L+hv25udEchvOfHZxsfYRfvBKuHkncBGrf5HGU r/Tw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=RsVDub5+7MAuOSua5XBwEJxAaLBlVLtIFPHPz7Q4g80=; b=o5DmvkLs/3vsmWXPii0bOz3ww6E56tmaI81UvvrU77YiUPPA07ndTnc+60KT91o4nO 33oPpxsj7zdy2Djl8OT+0ljJYtKImk0GELidkfCLwPFcC/8aFNxVzYJ3fe1l9ePhw+wz nJDtHI3yAnz2rst+uQDVQ2y4XybekAdyicoVIBhkCL44I5kwGQJ1Du3qVnoRHkzvp76c Q666E6MIGrmoxPAc4baHgcaaeEMvEQj2h/wAqcvU8J+RRUOUyVV/SCfXv5HpsCIaLkzk xygmKR8oMjZnNuY2TygT4p8bB13XHxNkHaHv0urZLAYNbarHqBBESf9J5SAr6slFjslu f2kQ== X-Gm-Message-State: AO0yUKWebBw9E1qaWIqZpct69UQb9nydYNhwuBd8fWCEzGyFgWnV4l0z GE7Phtx0GTj8MN8E40dXoELEF/s06CbOomFi97026Se9 X-Google-Smtp-Source: AK7set9FEEp6ATlvNXWMxCNdgB4mDj3Hn6gRWlAbNhIDyngeIjRQ0IzIG7EtqclO+jibx4MZfb43pdPPe1KKwGgfgxg= X-Received: by 2002:a2e:9c5a:0:b0:290:2306:66ec with SMTP id t26-20020a2e9c5a000000b00290230666ecmr506337ljj.193.1675778487439; Tue, 07 Feb 2023 06:01:27 -0800 (PST) MIME-Version: 1.0 From: Bharath Rupireddy Date: Tue, 7 Feb 2023 19:30:00 +0530 Message-ID: Subject: Track Oldest Initialized WAL Buffer Page To: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="00000000000077997c05f41c95a5" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000077997c05f41c95a5 Content-Type: text/plain; charset="UTF-8" Hi, While working on [1], I was looking for a quick way to tell if a WAL record is present in the WAL buffers array without scanning but I couldn't find one. Hence, I put up a patch that basically tracks the oldest initialized WAL buffer page, named OldestInitializedPage, in XLogCtl. With OldestInitializedPage, we can easily illustrate WAL buffers array properties: 1) At any given point of time, pages in the WAL buffers array are sorted in an ascending order from OldestInitializedPage till InitializedUpTo. Note that we verify this property for assert-only builds, see IsXLogBuffersArraySorted() in the patch for more details. 2) OldestInitializedPage is monotonically increasing (by virtue of how postgres generates WAL records), that is, its value never decreases. This property lets someone read its value without a lock. There's no problem even if its value is slightly stale i.e. concurrently being updated. One can still use it for finding if a given WAL record is available in WAL buffers. At worst, one might get false positives (i.e. OldestInitializedPage may tell that the WAL record is available in WAL buffers, but when one actually looks at it, it isn't really available). This is more efficient and performant than acquiring a lock for reading. Note that we may not need a lock to read OldestInitializedPage but we need to update it holding WALBufMappingLock. 3) One can start traversing WAL buffers from OldestInitializedPage till InitializedUpTo to list out all valid WAL records and stats, and expose them via SQL-callable functions to users, for instance, as pg_walinspect functions. 4) WAL buffers array is inherently organized as a circular, sorted and rotated array with OldestInitializedPage as pivot/first element of the array with the property where LSN of previous buffer page (if valid) is greater than OldestInitializedPage and LSN of the next buffer page (if valid) is greater than OldestInitializedPage. Thoughts? [1] https://www.postgresql.org/message-id/CALj2ACXKKK=wbiG5_t6dGao5GoecMwRkhr7GjVBM_jg54+Na=Q@mail.gmail.com -- Bharath Rupireddy PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com --00000000000077997c05f41c95a5 Content-Type: application/x-patch; name="v1-0001-Track-Oldest-Initialized-WAL-Buffer-Page.patch" Content-Disposition: attachment; filename="v1-0001-Track-Oldest-Initialized-WAL-Buffer-Page.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ldsgq8lb0 RnJvbSA2ODNmOGYyNzY0OTcwY2E1NzM3MDM5NTc3ZDY0YzkxZTQ5MTkwOGQ2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBCaGFyYXRoIFJ1cGlyZWRkeSA8YmhhcmF0aC5ydXBpcmVkZHlm b3Jwb3N0Z3Jlc0BnbWFpbC5jb20+CkRhdGU6IE1vbiwgNiBGZWIgMjAyMyAwNjo1ODo1NCArMDAw MApTdWJqZWN0OiBbUEFUQ0ggdjFdIFRyYWNrIE9sZGVzdCBJbml0aWFsaXplZCBXQUwgQnVmZmVy IFBhZ2UKCi0tLQogc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jIHwgMTcwICsrKysr KysrKysrKysrKysrKysrKysrKysrKysrKwogc3JjL2luY2x1ZGUvYWNjZXNzL3hsb2cuaCAgICAg ICAgIHwgICAxICsKIDIgZmlsZXMgY2hhbmdlZCwgMTcxIGluc2VydGlvbnMoKykKCmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMgYi9zcmMvYmFja2VuZC9hY2Nl c3MvdHJhbnNhbS94bG9nLmMKaW5kZXggZjlmMGY2ZGI4ZC4uNzYyNTkwNzU0MiAxMDA2NDQKLS0t IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jCisrKyBiL3NyYy9iYWNrZW5kL2Fj Y2Vzcy90cmFuc2FtL3hsb2cuYwpAQCAtNTA0LDYgKzUwNCw0NCBAQCB0eXBlZGVmIHN0cnVjdCBY TG9nQ3RsRGF0YQogCVhMb2dSZWNQdHIgKnhsYmxvY2tzOwkJLyogMXN0IGJ5dGUgcHRyLXMgKyBY TE9HX0JMQ0tTWiAqLwogCWludAkJCVhMb2dDYWNoZUJsY2s7CS8qIGhpZ2hlc3QgYWxsb2NhdGVk IHhsb2cgYnVmZmVyIGluZGV4ICovCiAKKwkvKgorCSAqIFN0YXJ0IGFkZHJlc3Mgb2Ygb2xkZXN0 IGluaXRpYWxpemVkIHBhZ2UgaW4gWExvZyBidWZmZXJzLgorCSAqCisJICogV2UgbWFpbmx5IHRy YWNrIG9sZGVzdCBpbml0aWFsaXplZCBwYWdlIGV4cGxpY2l0bHkgdG8gcXVpY2tseSB0ZWxsIGlm IGEKKwkgKiBnaXZlbiBXQUwgcmVjb3JkIGlzIGF2YWlsYWJsZSBpbiBYTG9nIGJ1ZmZlcnMuIEl0 IGFsc28gY2FuIGJlIHVzZWQgZm9yCisJICogb3RoZXIgcHVycG9zZXMsIHNlZSBub3RlcyBiZWxv dy4KKwkgKgorCSAqIE9sZGVzdEluaXRpYWxpemVkUGFnZSBnaXZlcyBYTG9nIGJ1ZmZlcnMgZm9s bG93aW5nIHByb3BlcnRpZXM6CisJICoKKwkgKiAxKSBBdCBhbnkgZ2l2ZW4gcG9pbnQgb2YgdGlt ZSwgcGFnZXMgaW4gWExvZyBidWZmZXJzIGFycmF5IGFyZSBzb3J0ZWQgaW4KKwkgKiBhbiBhc2Nl bmRpbmcgb3JkZXIgZnJvbSBPbGRlc3RJbml0aWFsaXplZFBhZ2UgdGlsbCBJbml0aWFsaXplZFVw VG8uCisJICogTm90ZSB0aGF0IHdlIHZlcmlmeSB0aGlzIHByb3BlcnR5IGZvciBhc3NlcnQtb25s eSBidWlsZHMsIHNlZQorCSAqIElzWExvZ0J1ZmZlcnNBcnJheVNvcnRlZCgpIGZvciBtb3JlIGRl dGFpbHMuCisJICoKKwkgKiAyKSBPbGRlc3RJbml0aWFsaXplZFBhZ2UgaXMgbW9ub3RvbmljYWxs eSBpbmNyZWFzaW5nIChieSB2aXJ0dWUgb2YgaG93CisJICogcG9zdGdyZXMgZ2VuZXJhdGVzIFdB TCByZWNvcmRzKSwgdGhhdCBpcywgaXRzIHZhbHVlIG5ldmVyIGRlY3JlYXNlcy4KKwkgKiBUaGlz IHByb3BlcnR5IGxldHMgc29tZW9uZSByZWFkIGl0cyB2YWx1ZSB3aXRob3V0IGEgbG9jay4gVGhl cmUncyBubworCSAqIHByb2JsZW0gZXZlbiBpZiBpdHMgdmFsdWUgaXMgc2xpZ2h0bHkgc3RhbGUg aS5lLiBjb25jdXJyZW50bHkgYmVpbmcKKwkgKiB1cGRhdGVkLiBPbmUgY2FuIHN0aWxsIHVzZSBp dCBmb3IgZmluZGluZyBpZiBhIGdpdmVuIFdBTCByZWNvcmQgaXMKKwkgKiBhdmFpbGFibGUgaW4g WExvZyBidWZmZXJzLiBBdCB3b3JzdCwgb25lIG1pZ2h0IGdldCBmYWxzZSBwb3NpdGl2ZXMgKGku ZS4KKwkgKiBPbGRlc3RJbml0aWFsaXplZFBhZ2UgbWF5IHRlbGwgdGhhdCB0aGUgV0FMIHJlY29y ZCBpcyBhdmFpbGFibGUgaW4gWExvZworCSAqIGJ1ZmZlcnMsIGJ1dCB3aGVuIG9uZSBhY3R1YWxs eSBsb29rcyBhdCBpdCwgaXQgaXNuJ3QgcmVhbGx5IGF2YWlsYWJsZSkuCisJICogVGhpcyBpcyBt b3JlIGVmZmljaWVudCBhbmQgcGVyZm9ybWFudCB0aGFuIGFjcXVpcmluZyBhIGxvY2sgZm9yIHJl YWRpbmcuCisJICogTm90ZSB0aGF0IHdlIG1heSBub3QgbmVlZCBhIGxvY2sgdG8gcmVhZCBPbGRl c3RJbml0aWFsaXplZFBhZ2UgYnV0IHdlCisJICogbmVlZCB0byB1cGRhdGUgaXQgaG9sZGluZyBX QUxCdWZNYXBwaW5nTG9jay4KKwkgKgorCSAqIDMpIE9uZSBjYW4gc3RhcnQgdHJhdmVyc2luZyBY TG9nIGJ1ZmZlcnMgZnJvbSBPbGRlc3RJbml0aWFsaXplZFBhZ2UgdGlsbAorCSAqIEluaXRpYWxp emVkVXBUbyB0byBsaXN0IG91dCBhbGwgdmFsaWQgV0FMIHJlY29yZHMgYW5kIHN0YXRzLCBhbmQg ZXhwb3NlCisJICogdGhlbSB2aWEgU1FMLWNhbGxhYmxlIGZ1bmN0aW9ucyB0byB1c2Vycy4KKwkg KgorCSAqIDQpIFhMb2cgYnVmZmVycyBhcnJheSBpcyBpbmhlcmVudGx5IG9yZ2FuaXplZCBhcyBh IGNpcmN1bGFyLCBzb3J0ZWQgYW5kCisJICogcm90YXRlZCBhcnJheSB3aXRoIE9sZGVzdEluaXRp YWxpemVkUGFnZSBhcyBwaXZvdCB3aXRoIHRoZSBwcm9wZXJ0eQorCSAqIHdoZXJlIExTTiBvZiBw cmV2aW91cyBidWZmZXIgcGFnZSAoaWYgdmFsaWQpIGlzIGdyZWF0ZXIgdGhhbgorCSAqIE9sZGVz dEluaXRpYWxpemVkUGFnZSBhbmQgTFNOIG9mIG5leHQgYnVmZmVyIHBhZ2UgKGlmIHZhbGlkKSBp cyBncmVhdGVyCisJICogdGhhbiBPbGRlc3RJbml0aWFsaXplZFBhZ2UuCisJICovCisJWExvZ1Jl Y1B0cglPbGRlc3RJbml0aWFsaXplZFBhZ2U7CisKIAkvKgogCSAqIEluc2VydFRpbWVMaW5lSUQg aXMgdGhlIHRpbWVsaW5lIGludG8gd2hpY2ggbmV3IFdBTCBpcyBiZWluZyBpbnNlcnRlZAogCSAq IGFuZCBmbHVzaGVkLiBJdCBpcyB6ZXJvIGR1cmluZyByZWNvdmVyeSwgYW5kIGRvZXMgbm90IGNo YW5nZSBvbmNlIHNldC4KQEAgLTU4MCw2ICs2MTgsMTAgQEAgc3RhdGljIENvbnRyb2xGaWxlRGF0 YSAqQ29udHJvbEZpbGUgPSBOVUxMOwogI2RlZmluZSBOZXh0QnVmSWR4KGlkeCkJCVwKIAkJKCgo aWR4KSA9PSBYTG9nQ3RsLT5YTG9nQ2FjaGVCbGNrKSA/IDAgOiAoKGlkeCkgKyAxKSkKIAorLyog TWFjcm8gdG8gcmV0cmVhdCB0byBwcmV2aW91cyBidWZmZXIgaW5kZXguICovCisjZGVmaW5lIFBy ZXZpb3VzQnVmSWR4KGlkeCkJCVwKKwkJKCgoaWR4KSA9PSAwKSA/IFhMb2dDdGwtPlhMb2dDYWNo ZUJsY2sgOiAoKGlkeCkgLSAxKSkKKwogLyoKICAqIFhMb2dSZWNQdHJUb0J1ZklkeCByZXR1cm5z IHRoZSBpbmRleCBvZiB0aGUgV0FMIGJ1ZmZlciB0aGF0IGhvbGRzLCBvcgogICogd291bGQgaG9s ZCBpZiBpdCB3YXMgaW4gY2FjaGUsIHRoZSBwYWdlIGNvbnRhaW5pbmcgJ3JlY3B0cicuCkBAIC02 OTgsNiArNzQwLDEwIEBAIHN0YXRpYyB2b2lkIFdBTEluc2VydExvY2tBY3F1aXJlRXhjbHVzaXZl KHZvaWQpOwogc3RhdGljIHZvaWQgV0FMSW5zZXJ0TG9ja1JlbGVhc2Uodm9pZCk7CiBzdGF0aWMg dm9pZCBXQUxJbnNlcnRMb2NrVXBkYXRlSW5zZXJ0aW5nQXQoWExvZ1JlY1B0ciBpbnNlcnRpbmdB dCk7CiAKKyNpZmRlZiBVU0VfQVNTRVJUX0NIRUNLSU5HCitzdGF0aWMgYm9vbCBJc1hMb2dCdWZm ZXJzQXJyYXlTb3J0ZWQodm9pZCk7CisjZW5kaWYKKwogLyoKICAqIEluc2VydCBhbiBYTE9HIHJl Y29yZCByZXByZXNlbnRlZCBieSBhbiBhbHJlYWR5LWNvbnN0cnVjdGVkIGNoYWluIG9mIGRhdGEK ICAqIGNodW5rcy4gIFRoaXMgaXMgYSBsb3ctbGV2ZWwgcm91dGluZTsgdG8gY29uc3RydWN0IHRo ZSBXQUwgcmVjb3JkIGhlYWRlcgpAQCAtMTkyNSw2ICsxOTcxLDUzIEBAIEFkdmFuY2VYTEluc2Vy dEJ1ZmZlcihYTG9nUmVjUHRyIHVwdG8sIFRpbWVMaW5lSUQgdGxpLCBib29sIG9wcG9ydHVuaXN0 aWMpCiAJCVhMb2dDdGwtPkluaXRpYWxpemVkVXBUbyA9IE5ld1BhZ2VFbmRQdHI7CiAKIAkJbnBh Z2VzKys7CisKKwkJLyoKKwkJICogVHJ5IHVwZGF0aW5nIG9sZGVzdCBpbml0aWFsaXplZCBYTG9n IGJ1ZmZlciBwYWdlLgorCQkgKgorCQkgKiBVcGRhdGUgaXQgaWYgd2UgYXJlIGluaXRpYWxpemlu ZyBhbiBYTG9nIGJ1ZmZlciBwYWdlIGZvciB0aGUgZmlyc3QKKwkJICogdGltZSBvciBpZiBYTG9n IGJ1ZmZlcnMgYXJlIGZ1bGwgYW5kIHdlIGFyZSB3cmFwcGluZyBhcm91bmQuCisJCSAqLworCQlp ZiAoWExvZ1JlY1B0cklzSW52YWxpZChYTG9nQ3RsLT5PbGRlc3RJbml0aWFsaXplZFBhZ2UpIHx8 CisJCQkoIVhMb2dSZWNQdHJJc0ludmFsaWQoWExvZ0N0bC0+T2xkZXN0SW5pdGlhbGl6ZWRQYWdl KSAmJgorCQkJIFhMb2dSZWNQdHJUb0J1ZklkeChYTG9nQ3RsLT5PbGRlc3RJbml0aWFsaXplZFBh Z2UpID09IG5leHRpZHgpKQorCQl7CisJCQlBc3NlcnQoWExvZ0N0bC0+T2xkZXN0SW5pdGlhbGl6 ZWRQYWdlIDwgTmV3UGFnZUJlZ2luUHRyKTsKKworCQkJWExvZ0N0bC0+T2xkZXN0SW5pdGlhbGl6 ZWRQYWdlID0gTmV3UGFnZUJlZ2luUHRyOworCQl9CisKKwkJLyoKKwkJICogQ2hlY2sgc29tZSBw cm9wZXJ0aWVzIGFib3V0IFhMb2cgYnVmZmVycyBhcnJheS4gV2UgZXNzZW50aWFsbHkKKwkJICog cGVyZm9ybSB0aGVzZSBjaGVja3MgYXMgYXNzZXJ0cyB0byBhdm9pZCBleHRyYSBjb3N0cy4KKwkJ ICoKKwkJICogWFhYOiBQZXJoYXBzIHRoZXNlIGV4dHJhIGNoZWNrcyBhcmUgdG9vIG11Y2ggZm9y IGFuIGFzc2VydCBidWlsZCwgc28KKwkJICogcGxhY2luZyB0aGVtIHVuZGVyIFdBTF9ERUJVRyBt aWdodCBiZSB3b3J0aCB0cnlpbmcuCisJCSAqLworCisJCS8qIE9sZGVzdEluaXRpYWxpemVkUGFn ZSBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLiAqLworCQlBc3NlcnQoIVhMb2dS ZWNQdHJJc0ludmFsaWQoWExvZ0N0bC0+T2xkZXN0SW5pdGlhbGl6ZWRQYWdlKSk7CisKKwkJLyoK KwkJICogT2xkZXN0SW5pdGlhbGl6ZWRQYWdlIGlzIGFsd2F5cyBhIHN0YXJ0aW5nIGFkZHJlc3Mg b2YgWExvZyBidWZmZXIKKwkJICogcGFnZS4KKwkJICovCisJCUFzc2VydCgoWExvZ0N0bC0+T2xk ZXN0SW5pdGlhbGl6ZWRQYWdlICUgWExPR19CTENLU1opID09IDApOworCisJCS8qCisJCSAqIE9s ZGVzdEluaXRpYWxpemVkUGFnZSBhbmQgSW5pdGlhbGl6ZWRVcFRvIGFyZSBhbHdheXMgc3RhcnRp bmcgYW5kCisJCSAqIGVuZGluZyBhZGRyZXNzZXMgb2YgKHNhbWUgb3IgZGlmZmVyZW50KSBYTG9n IGJ1ZmZlciBwYWdlCisJCSAqIHJlc3BlY3RpdmVseS4gSGVuY2UsIHRoZXkgY2FuIG5ldmVyIGJl IHNhbWUgZXZlbiBpZiB0aGVyZSdzIG9ubHkgb25lCisJCSAqIGluaXRpYWxpemVkIHBhZ2UgaW4g WExvZyBidWZmZXJzLgorCQkgKi8KKwkJQXNzZXJ0KFhMb2dDdGwtPk9sZGVzdEluaXRpYWxpemVk UGFnZSAhPSBYTG9nQ3RsLT5Jbml0aWFsaXplZFVwVG8pOworCisJCS8qCisJCSAqIEF0IGFueSBn aXZlbiBwb2ludCBvZiB0aW1lLCBwYWdlcyBpbiBYTG9nIGJ1ZmZlcnMgYXJyYXkgYXJlIHNvcnRl ZAorCQkgKiBpbiBhbiBhc2NlbmRpbmcgb3JkZXIgZnJvbSBPbGRlc3RJbml0aWFsaXplZFBhZ2Ug dGlsbAorCQkgKiBJbml0aWFsaXplZFVwVG8uCisJCSAqLworCQlBc3NlcnQoSXNYTG9nQnVmZmVy c0FycmF5U29ydGVkKCkpOwogCX0KIAlMV0xvY2tSZWxlYXNlKFdBTEJ1Zk1hcHBpbmdMb2NrKTsK IApAQCAtNDYxNiw2ICs0NzA5LDcgQEAgWExPR1NobWVtSW5pdCh2b2lkKQogCVhMb2dDdGwtPlNo YXJlZFJlY292ZXJ5U3RhdGUgPSBSRUNPVkVSWV9TVEFURV9DUkFTSDsKIAlYTG9nQ3RsLT5JbnN0 YWxsWExvZ0ZpbGVTZWdtZW50QWN0aXZlID0gZmFsc2U7CiAJWExvZ0N0bC0+V2FsV3JpdGVyU2xl ZXBpbmcgPSBmYWxzZTsKKwlYTG9nQ3RsLT5PbGRlc3RJbml0aWFsaXplZFBhZ2UgPSBJbnZhbGlk WExvZ1JlY1B0cjsKIAogCVNwaW5Mb2NrSW5pdCgmWExvZ0N0bC0+SW5zZXJ0Lmluc2VydHBvc19s Y2spOwogCVNwaW5Mb2NrSW5pdCgmWExvZ0N0bC0+aW5mb19sY2spOwpAQCAtNTYyMiw2ICs1NzE2 LDE0IEBAIFN0YXJ0dXBYTE9HKHZvaWQpCiAKIAkJWExvZ0N0bC0+eGxibG9ja3NbZmlyc3RJZHhd ID0gZW5kT2ZSZWNvdmVyeUluZm8tPmxhc3RQYWdlQmVnaW5QdHIgKyBYTE9HX0JMQ0tTWjsKIAkJ WExvZ0N0bC0+SW5pdGlhbGl6ZWRVcFRvID0gZW5kT2ZSZWNvdmVyeUluZm8tPmxhc3RQYWdlQmVn aW5QdHIgKyBYTE9HX0JMQ0tTWjsKKwkJWExvZ0N0bC0+T2xkZXN0SW5pdGlhbGl6ZWRQYWdlID0g ZW5kT2ZSZWNvdmVyeUluZm8tPmxhc3RQYWdlQmVnaW5QdHI7CisKKwkJLyoKKwkJICogT2xkZXN0 SW5pdGlhbGl6ZWRQYWdlIGlzIGFsd2F5cyBhIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgWExvZyBidWZm ZXIKKwkJICogcGFnZS4KKwkJICovCisJCUFzc2VydCghWExvZ1JlY1B0cklzSW52YWxpZChYTG9n Q3RsLT5PbGRlc3RJbml0aWFsaXplZFBhZ2UpKTsKKwkJQXNzZXJ0KChYTG9nQ3RsLT5PbGRlc3RJ bml0aWFsaXplZFBhZ2UgJSBYTE9HX0JMQ0tTWikgPT0gMCk7CiAJfQogCWVsc2UKIAl7CkBAIC04 OTMxLDMgKzkwMzMsNzEgQEAgU2V0V2FsV3JpdGVyU2xlZXBpbmcoYm9vbCBzbGVlcGluZykKIAlY TG9nQ3RsLT5XYWxXcml0ZXJTbGVlcGluZyA9IHNsZWVwaW5nOwogCVNwaW5Mb2NrUmVsZWFzZSgm WExvZ0N0bC0+aW5mb19sY2spOwogfQorCisjaWZkZWYgVVNFX0FTU0VSVF9DSEVDS0lORworLyoK KyAqIFJldHVybnMgd2hldGhlciBvciBub3QgWExvZyBidWZmZXJzIGFycmF5IGlzIHNvcnRlZC4K KyAqCisgKiBYWFg6IFBlcmhhcHMgdGhpcyBmdW5jdGlvbiBpcyB0b28gbXVjaCBmb3IgYW4gYXNz ZXJ0IGJ1aWxkLCBzbyBwbGFjaW5nIGl0CisgKiB1bmRlciBXQUxfREVCVUcgbWlnaHQgYmUgd29y dGggdHJ5aW5nLgorICovCitzdGF0aWMgYm9vbAorSXNYTG9nQnVmZmVyc0FycmF5U29ydGVkKHZv aWQpCit7CisJaW50CXN0YXJ0OworCWludAllbmQ7CisJaW50CWN1cnJlbnQ7CisJaW50CW5leHQ7 CisJWExvZ1JlY1B0ciBDdXJyZW50UGFnZTsKKwlYTG9nUmVjUHRyCU5leHRQYWdlOworCisJc3Rh cnQgPSBYTG9nUmVjUHRyVG9CdWZJZHgoWExvZ0N0bC0+T2xkZXN0SW5pdGlhbGl6ZWRQYWdlKTsK KwllbmQgPSBYTG9nUmVjUHRyVG9CdWZJZHgoWExvZ0N0bC0+SW5pdGlhbGl6ZWRVcFRvIC0gWExP R19CTENLU1opOworCisJaWYgKHN0YXJ0ID09IGVuZCkKKwkJcmV0dXJuIHRydWU7CisKKwljdXJy ZW50ID0gc3RhcnQ7CisKKwl3aGlsZSAoY3VycmVudCAhPSBlbmQpCisJeworCQlDdXJyZW50UGFn ZSA9IFhMb2dDdGwtPnhsYmxvY2tzW2N1cnJlbnRdOworCisJCW5leHQgPSBOZXh0QnVmSWR4KGN1 cnJlbnQpOworCQlOZXh0UGFnZSA9IFhMb2dDdGwtPnhsYmxvY2tzW25leHRdOworCisJCWlmICgh WExvZ1JlY1B0cklzSW52YWxpZChOZXh0UGFnZSkgJiYKKwkJCUN1cnJlbnRQYWdlID4gTmV4dFBh Z2UpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJY3VycmVudCA9IG5leHQ7CisJfQorCisJQXNzZXJ0 KFhMb2dDdGwtPnhsYmxvY2tzW2N1cnJlbnRdID09IFhMb2dDdGwtPnhsYmxvY2tzW2VuZF0pOwor CisJcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKworLyoKKyAqIFJldHVybnMgd2hldGhlciBvciBu b3QgYSBnaXZlbiBXQUwgcmVjb3JkIGlzIGF2YWlsYWJsZSBpbiBYTG9nIGJ1ZmZlcnMuCisgKgor ICogTm90ZSB0aGF0IHdlIGRvbid0IHJlYWQgT2xkZXN0SW5pdGlhbGl6ZWRQYWdlIHVuZGVyIGEg bG9jaywgc2VlIGRlc2NyaXB0aW9uCisgKiBuZWFyIGl0cyBkZWZpbml0aW9uIGluIHhsb2cuYyBm b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIE5vdGUgdGhhdCBjYWxsZXIgbmVlZHMgdG8gcGFzcyBp biBhbiBMU04ga25vd24gdG8gdGhlIHNlcnZlciwgbm90IGEgZnV0dXJlCisgKiBvciB1bndyaXR0 ZW4gb3IgdW5mbHVzaGVkIExTTi4KKyAqLworYm9vbAorSXNXQUxSZWNvcmRBdmFpbGFibGVJblhM b2dCdWZmZXJzKFhMb2dSZWNQdHIgbHNuKQoreworCWlmICghWExvZ1JlY1B0cklzSW52YWxpZChs c24pICYmCisJCSFYTG9nUmVjUHRySXNJbnZhbGlkKFhMb2dDdGwtPk9sZGVzdEluaXRpYWxpemVk UGFnZSkgJiYKKwkJbHNuID49IFhMb2dDdGwtPk9sZGVzdEluaXRpYWxpemVkUGFnZSAmJgorCQls c24gPCBYTG9nQ3RsLT5Jbml0aWFsaXplZFVwVG8pCisJeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisK KwlyZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9hY2Nlc3MveGxvZy5o IGIvc3JjL2luY2x1ZGUvYWNjZXNzL3hsb2cuaAppbmRleCBjZmU1NDA5NzM4Li4yYWZhNTMwMDhl IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9hY2Nlc3MveGxvZy5oCisrKyBiL3NyYy9pbmNsdWRl L2FjY2Vzcy94bG9nLmgKQEAgLTI1Nyw2ICsyNTcsNyBAQCBleHRlcm4gdm9pZCBSZWFjaGVkRW5k T2ZCYWNrdXAoWExvZ1JlY1B0ciBFbmRSZWNQdHIsIFRpbWVMaW5lSUQgdGxpKTsKIGV4dGVybiB2 b2lkIFNldEluc3RhbGxYTG9nRmlsZVNlZ21lbnRBY3RpdmUodm9pZCk7CiBleHRlcm4gYm9vbCBJ c0luc3RhbGxYTG9nRmlsZVNlZ21lbnRBY3RpdmUodm9pZCk7CiBleHRlcm4gdm9pZCBYTG9nU2h1 dGRvd25XYWxSY3Yodm9pZCk7CitleHRlcm4gYm9vbAlJc1dBTFJlY29yZEF2YWlsYWJsZUluWExv Z0J1ZmZlcnMoWExvZ1JlY1B0ciBsc24pOwogCiAvKgogICogUm91dGluZXMgdG8gc3RhcnQsIHN0 b3AsIGFuZCBnZXQgc3RhdHVzIG9mIGEgYmFzZSBiYWNrdXAuCi0tIAoyLjM0LjEKCg== --00000000000077997c05f41c95a5--