Received: from malur.postgresql.org ([2a02:16a8:dc51::56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1g8V8I-00081t-FZ for pgsql-hackers@arkaria.postgresql.org; Fri, 05 Oct 2018 18:47:26 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1g8V8E-00018K-GL for pgsql-hackers@arkaria.postgresql.org; Fri, 05 Oct 2018 18:47:22 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1g8V8E-00018D-61 for pgsql-hackers@lists.postgresql.org; Fri, 05 Oct 2018 18:47:22 +0000 Received: from mail-ot1-x344.google.com ([2607:f8b0:4864:20::344]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1g8V86-00043d-Nq for pgsql-hackers@postgresql.org; Fri, 05 Oct 2018 18:47:21 +0000 Received: by mail-ot1-x344.google.com with SMTP id e21-v6so13672421otk.10 for ; Fri, 05 Oct 2018 11:47:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=jOAqMJDw34z9XICD8pvEsa9ij3gjAkFBefDM9hlzhsg=; b=g1175vxf5slaOkhmz2O/UR/V4rbXaGlkz2zr0HeKIv1414QsWjpcRltIgiiN82OEDV xY24/Xz5VYG3hlTC+VTyvZQhcLVI2dpV9CcT9Kulg3XDgit99ugJl7aP+r79D5Frpr/G 3ExdT4pw1JKL26Z4fDzmpUrb5P6nVWfR2bY5XSn2tCzypNJ47v5iL0wGgafIUOSJ0/Wv 8TLx2rawKU+0T/P+4iO/5epN90xZbt/W7M5VhxzfXXondZtLGiL5irFK2km0JGRO9hiD +h2FeJw552mpflCDF7Iifc98lH4FZ9KM1I1QVshh8PMN6VaMxgfgsJsx2hhP4UzHp/bB pqrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=jOAqMJDw34z9XICD8pvEsa9ij3gjAkFBefDM9hlzhsg=; b=rM/iuIMO8UvUfBC/a+a2mWGiej6wDo5pB2HTP3OzbjJGgkRhWaPu2vdFQGL1alHcZZ jyoPdcK9SF5gYEtEy1E6VlAK0mINGFmcLoss2989U5eUyHA3wx9hMBEEBtziw7hMkvRB osjRLk+B82fUA3RcEPPqwxBOKMXSwEwhZV9BG71UKW+caXdAYFdTI80aKo9KVoEZ2cdW VaEDMBeWa4xfy4I84JYJMgjL1nXEAz5FgT39/7E0DH3+TQD2YdsXtsBiWbXcs4JkyGEK Dib1ozquX0qjfnYdhriZzZr0AMM0u5BOowu+6DCSRpatqSWzK4cMErdAHBgACYUnXu6W fj5A== X-Gm-Message-State: ABuFfohRJC9Amg8ZMbnlIg//j/y5timOS0xpISkDWFzoLMBFyrpXITRs C4B48u2gqYCsEgtNDKLq8gC1QFWIXSEVw/ls2s26mA== X-Google-Smtp-Source: ACcGV60O2+Pzc+JURC5QQDmL0Hmc1uT7G48vp2XE4VpQfcXoG8VDy8WszT2DyTTr26amK6hWiwp+RXfP8eSvwaQ08Jw= X-Received: by 2002:a9d:477:: with SMTP id 110mr7089513otc.78.1538765232090; Fri, 05 Oct 2018 11:47:12 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a8a:9c9:0:0:0:0:0 with HTTP; Fri, 5 Oct 2018 11:47:11 -0700 (PDT) From: John Naylor Date: Sat, 6 Oct 2018 01:47:11 +0700 Message-ID: Subject: WIP: Avoid creation of the free space map for small tables To: pgsql-hackers Content-Type: multipart/mixed; boundary="0000000000000d689605777fb3d4" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --0000000000000d689605777fb3d4 Content-Type: text/plain; charset="UTF-8" Hi all, A while back, Robert Haas noticed that the space taken up by very small tables is dominated by the FSM [1]. Tom suggested that we could prevent creation of the FSM until the heap has reached a certain threshold size [2]. Attached is a WIP patch to implement that. I've also attached a SQL script to demonstrate the change in behavior for various scenarios. The behavior that allows the simplest implementation I thought of is as follows: -The FSM isn't created if the heap has fewer than 10 blocks (or whatever). If the last known good block has insufficient space, try every block before extending the heap. -If a heap with a FSM is truncated back to below the threshold, the FSM stays around and can be used as usual. -If the heap tuples are all deleted, the FSM stays but has no leaf blocks (same as on master). Although it exists, it won't be re-extended until the heap re-passes the threshold. -- Some notes: -For normal mode, I taught fsm_set_and_search() to switch to a non-extending buffer call, but the biggest missing piece is WAL replay. I couldn't find a non-extending equivalent of XLogReadBufferExtended(), so I might have to create one. -There'll need to be some performance testing to make sure there's no regression, and to choose a good value for the threshold. I'll look into that, but if anyone has any ideas for tests, that'll help this effort along. -A possible TODO item is to teach pg_upgrade not to link FSMs for small heaps. I haven't look into the feasibility of that, however. -RelationGetBufferForTuple() now has two boolean variables that mean "don't use the FSM", but with different behaviors. To avoid confusion, I've renamed use_fsm to always_extend and revised the commentary accordingly. -I've only implemented this for heaps, because indexes (at least B-tree) don't seem to be as eager to create a FSM. I haven't looked at the code, however. -- [1] https://www.postgresql.org/message-id/CA%2BTgmoac%2B6qTNp2U%2BwedY8-PU6kK_b6hbdhR5xYGBG3GtdFcww%40mail.gmail.com [2] https://www.postgresql.org/message-id/11360.1345502641%40sss.pgh.pa.us -- I'll add this to the November commitfest. -John Naylor --0000000000000d689605777fb3d4 Content-Type: application/sql; name="fsmtest.sql" Content-Disposition: attachment; filename="fsmtest.sql" Content-Transfer-Encoding: base64 X-Attachment-Id: file2 ZHJvcCB0YWJsZSBpZiBleGlzdHMgZm9vOwoKLS0gTmV3IHRhYmxlCmNyZWF0ZSB0YWJsZSBmb28g KG51bSBpbnQpOwpzZWxlY3QgcGdfcmVsYXRpb25fc2l6ZSgnZm9vJywgJ21haW4nKSBhcyBoZWFw LCBwZ19yZWxhdGlvbl9zaXplKCdmb28nLCAnZnNtJykgYXMgZnNtOwoKLS0gMSBoZWFwIGJsb2Nr Ci0tIE9uIG1hc3RlciBGU00gaXMgY3JlYXRlZCB3aXRoIDMgYmxvY2tzLCB3aXRoIHBhdGNoIG5v dAppbnNlcnQgaW50byBmb28gdmFsdWVzICgwKTsKdmFjdXVtIGZvbzsKc2VsZWN0IHBnX3JlbGF0 aW9uX3NpemUoJ2ZvbycsICdtYWluJykgYXMgaGVhcCwgcGdfcmVsYXRpb25fc2l6ZSgnZm9vJywg J2ZzbScpIGFzIGZzbTsKCi0tIE1vcmUgdGhhbiAxMCBoZWFwIGJsb2NrcwotLSBOb3cgRlNNIGNy ZWF0ZWQgd2l0aCBwYXRjaAppbnNlcnQgaW50byBmb28gc2VsZWN0IGcgZnJvbSBnZW5lcmF0ZV9z ZXJpZXMoMSwzMDAwKSBnOwp2YWN1dW0gZm9vOwpzZWxlY3QgcGdfcmVsYXRpb25fc2l6ZSgnZm9v JywgJ21haW4nKSBhcyBoZWFwLCBwZ19yZWxhdGlvbl9zaXplKCdmb28nLCAnZnNtJykgYXMgZnNt OwoKLS0gVHJ1bmNhdGUgaGVhcCB0byAxIGJsb2NrCi0tIE5vIGNoYW5nZSBpbiBGU00KZGVsZXRl IGZyb20gZm9vIHdoZXJlIG51bSA+IDA7CnZhY3V1bSBmb287CnNlbGVjdCBwZ19yZWxhdGlvbl9z aXplKCdmb28nLCAnbWFpbicpIGFzIGhlYXAsIHBnX3JlbGF0aW9uX3NpemUoJ2ZvbycsICdmc20n KSBhcyBmc207CgotLSBUcnVuY2F0ZSBoZWFwIHRvIDAgYmxvY2tzCi0tIEZTTSBub3cgdHJ1bmNh dGVkIHRvIDIgYmxvY2tzCmRlbGV0ZSBmcm9tIGZvbzsKdmFjdXVtIGZvbzsKc2VsZWN0IHBnX3Jl bGF0aW9uX3NpemUoJ2ZvbycsICdtYWluJykgYXMgaGVhcCwgcGdfcmVsYXRpb25fc2l6ZSgnZm9v JywgJ2ZzbScpIGFzIGZzbTsKCi0tIDEgaGVhcCBibG9jawotLSBPbiBtYXN0ZXIgRlNNIGlzIGV4 dGVuZGVkIHRvIDMgYmxvY2tzLCB3aXRoIHBhdGNoIG5vdAppbnNlcnQgaW50byBmb28gdmFsdWVz ICgwKTsKdmFjdXVtIGZvbzsKc2VsZWN0IHBnX3JlbGF0aW9uX3NpemUoJ2ZvbycsICdtYWluJykg YXMgaGVhcCwgcGdfcmVsYXRpb25fc2l6ZSgnZm9vJywgJ2ZzbScpIGFzIGZzbTsKCg== --0000000000000d689605777fb3d4 Content-Type: text/x-patch; charset="US-ASCII"; name="v1-0001-Avoid-creation-of-the-free-space-map-for-small-ta.patch" Content-Disposition: attachment; filename="v1-0001-Avoid-creation-of-the-free-space-map-for-small-ta.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: file0 RnJvbSA3N2M4NWY2MzNmOTE1YmQyNDdjNTU0YjY5MWExMzRmYWMxZjMyMzE2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKb2huIE5heWxvciA8amNuYXlsb3JAZ21haWwuY29tPgpEYXRl OiBTYXQsIDYgT2N0IDIwMTggMDA6MzU6MzMgKzA3MDAKU3ViamVjdDogW1BBVENIIHYxXSBBdm9p ZCBjcmVhdGlvbiBvZiB0aGUgZnJlZSBzcGFjZSBtYXAgZm9yIHNtYWxsIHRhYmxlcy4KClRoZSBG U00gaXNuJ3QgY3JlYXRlZCBpZiB0aGUgaGVhcCBoYXMgZmV3ZXIgdGhhbiAxMCBibG9ja3MuIElm IHRoZSBsYXN0Cmtub3duIGdvb2QgYmxvY2sgaGFzIGluc3VmZmljaWVudCBzcGFjZSwgdHJ5IGV2 ZXJ5IGJsb2NrIGJlZm9yZSBleHRlbmRpbmcKdGhlIGhlYXAuCgpJZiBhIGhlYXAgd2l0aCBhIEZT TSBpcyB0cnVuY2F0ZWQgYmFjayB0byBiZWxvdyB0aGUgdGhyZXNob2xkLCB0aGUgRlNNCnN0YXlz IGFyb3VuZCBhbmQgY2FuIGJlIHVzZWQgYXMgdXN1YWwuCgpJZiB0aGUgaGVhcCB0dXBsZXMgYXJl IGFsbCBkZWxldGVkLCB0aGUgRlNNIHN0YXlzIGJ1dCBoYXMgbm8gbGVhZiBibG9ja3MKKHNhbWUg YXMgYmVmb3JlKS4gQWx0aG91Z2ggaXQgZXhpc3RzLCBpdCB3b24ndCBiZSByZS1leHRlbmRlZCB1 bnRpbAp0aGUgaGVhcCByZS1wYXNzZXMgdGhlIHRocmVzaG9sZC4KLS0tCiBzcmMvYmFja2VuZC9h Y2Nlc3MvaGVhcC9oaW8uYyAgICAgICAgICAgICB8IDYwICsrKysrKysrKysrKysrKysrLS0tLS0t CiBzcmMvYmFja2VuZC9zdG9yYWdlL2ZyZWVzcGFjZS9mcmVlc3BhY2UuYyB8IDMyICsrKysrKysr KysrLQogc3JjL2luY2x1ZGUvc3RvcmFnZS9mcmVlc3BhY2UuaCAgICAgICAgICAgfCAgNCArKwog MyBmaWxlcyBjaGFuZ2VkLCA3OSBpbnNlcnRpb25zKCspLCAxNyBkZWxldGlvbnMoLSkKCmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9oaW8uYyBiL3NyYy9iYWNrZW5kL2FjY2Vz cy9oZWFwL2hpby5jCmluZGV4IGI4YjU4NzE1NTkuLmFhZGI3NWVlOGMgMTAwNjQ0Ci0tLSBhL3Ny Yy9iYWNrZW5kL2FjY2Vzcy9oZWFwL2hpby5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9oZWFw L2hpby5jCkBAIC0zMTUsNyArMzE1LDggQEAgUmVsYXRpb25HZXRCdWZmZXJGb3JUdXBsZShSZWxh dGlvbiByZWxhdGlvbiwgU2l6ZSBsZW4sCiAJCQkJCQkgIEJ1bGtJbnNlcnRTdGF0ZSBiaXN0YXRl LAogCQkJCQkJICBCdWZmZXIgKnZtYnVmZmVyLCBCdWZmZXIgKnZtYnVmZmVyX290aGVyKQogewot CWJvb2wJCXVzZV9mc20gPSAhKG9wdGlvbnMgJiBIRUFQX0lOU0VSVF9TS0lQX0ZTTSk7CisJYm9v bAkJYWx3YXlzX2V4dGVuZCA9IChvcHRpb25zICYgSEVBUF9JTlNFUlRfU0tJUF9GU00pLAorCQkJ CXZpc2l0X2V2ZXJ5X3BhZ2U7CiAJQnVmZmVyCQlidWZmZXIgPSBJbnZhbGlkQnVmZmVyOwogCVBh Z2UJCXBhZ2U7CiAJU2l6ZQkJcGFnZUZyZWVTcGFjZSA9IDAsCkBAIC0zNTcsMjEgKzM1OCwyNCBA QCBSZWxhdGlvbkdldEJ1ZmZlckZvclR1cGxlKFJlbGF0aW9uIHJlbGF0aW9uLCBTaXplIGxlbiwK IAkgKiBlYWNoIHBhZ2UgdGhhdCBwcm92ZXMgbm90IHRvIGJlIHN1aXRhYmxlLikgIElmIHRoZSBG U00gaGFzIG5vIHJlY29yZCBvZgogCSAqIGEgcGFnZSB3aXRoIGVub3VnaCBmcmVlIHNwYWNlLCB3 ZSBnaXZlIHVwIGFuZCBleHRlbmQgdGhlIHJlbGF0aW9uLgogCSAqCi0JICogV2hlbiB1c2VfZnNt IGlzIGZhbHNlLCB3ZSBlaXRoZXIgcHV0IHRoZSB0dXBsZSBvbnRvIHRoZSBleGlzdGluZyB0YXJn ZXQKLQkgKiBwYWdlIG9yIGV4dGVuZCB0aGUgcmVsYXRpb24uCisJICogU3BlY2lhbCBjYXNlcyBm b3Igd2hlbiB0aGUgZXhpc3RpbmcgdGFyZ2V0IHBhZ2UgZmFpbHM6CisJICogMS4gV2hlbiBhbHdh eXNfZXh0ZW5kIGlzIHRydWUsIHdlIGRvbid0IGJvdGhlciB3aXRoIGNvbnN1bHRpbmcgdGhlIEZT TQorCSAqICAgIGFuZCBqdXN0IGV4dGVuZCB0aGUgcmVsYXRpb24uCisJICogMi4gV2hlbiB2aXNp dF9ldmVyeV9wYWdlIGlzIHRydWUgYW5kIHRoZSBGU00gZG9lc24ndCBwcm92aWRlIGFueQorCSAq ICAgIGluZm9ybWF0aW9uLCB3ZSB0cnkgZXZlcnkgcGFnZSBiZWZvcmUgZXh0ZW5kaW5nIHRoZSBy ZWxhdGlvbi4KIAkgKi8KIAlpZiAobGVuICsgc2F2ZUZyZWVTcGFjZSA+IE1heEhlYXBUdXBsZVNp emUpCiAJewogCQkvKiBjYW4ndCBmaXQsIGRvbid0IGJvdGhlciBhc2tpbmcgRlNNICovCiAJCXRh cmdldEJsb2NrID0gSW52YWxpZEJsb2NrTnVtYmVyOwotCQl1c2VfZnNtID0gZmFsc2U7CisJCWFs d2F5c19leHRlbmQgPSB0cnVlOwogCX0KIAllbHNlIGlmIChiaXN0YXRlICYmIGJpc3RhdGUtPmN1 cnJlbnRfYnVmICE9IEludmFsaWRCdWZmZXIpCiAJCXRhcmdldEJsb2NrID0gQnVmZmVyR2V0Qmxv Y2tOdW1iZXIoYmlzdGF0ZS0+Y3VycmVudF9idWYpOwogCWVsc2UKIAkJdGFyZ2V0QmxvY2sgPSBS ZWxhdGlvbkdldFRhcmdldEJsb2NrKHJlbGF0aW9uKTsKIAotCWlmICh0YXJnZXRCbG9jayA9PSBJ bnZhbGlkQmxvY2tOdW1iZXIgJiYgdXNlX2ZzbSkKKwlpZiAodGFyZ2V0QmxvY2sgPT0gSW52YWxp ZEJsb2NrTnVtYmVyICYmICFhbHdheXNfZXh0ZW5kKQogCXsKIAkJLyoKIAkJICogV2UgaGF2ZSBu byBjYWNoZWQgdGFyZ2V0IHBhZ2UsIHNvIGFzayB0aGUgRlNNIGZvciBhbiBpbml0aWFsCkBAIC0z ODksNyArMzkzLDIwIEBAIFJlbGF0aW9uR2V0QnVmZmVyRm9yVHVwbGUoUmVsYXRpb24gcmVsYXRp b24sIFNpemUgbGVuLAogCQkJQmxvY2tOdW1iZXIgbmJsb2NrcyA9IFJlbGF0aW9uR2V0TnVtYmVy T2ZCbG9ja3MocmVsYXRpb24pOwogCiAJCQlpZiAobmJsb2NrcyA+IDApCisJCQl7CiAJCQkJdGFy Z2V0QmxvY2sgPSBuYmxvY2tzIC0gMTsKKworCQkJCS8qCisJCQkJICogSWYgdGhlIGhlYXAgaXMg c21hbGwgZW5vdWdoLCBpdCBsaWtlbHkgaGFzIG5vIEZTTS4KKwkJCQkgKiBIb3dldmVyLCBpZiBh dCBzb21lIHBvaW50IHRoZSBoZWFwIHBhc3NlZCB0aGUgdGhyZXNob2xkLAorCQkJCSAqIGFjcXVp cmVkIGEgRlNNLCBhbmQgd2FzIHN1YnNlcXVlbnRseSB0cnVuY2F0ZWQgdG8gYmVsb3cKKwkJCQkg KiB0aGUgdGhyZXNob2xkLCB0aGUgRlNNIHJlbWFpbnMuICBTaW5jZSB0aGVyZSBhcmUgc28gZmV3 CisJCQkJICogcGFnZXMgaW4gZWl0aGVyIGNhc2UsIGp1c3QgdHJ5IGV2ZXJ5IHBhZ2UsIHN0YXJ0 aW5nIHdpdGgKKwkJCQkgKiB0aGUgbGFzdCBwYWdlLgorCQkJCSAqLworCQkJCWlmIChuYmxvY2tz IDw9IEhFQVBfRlNNX0VYVEVOU0lPTl9USFJFU0hPTEQpCisJCQkJCXZpc2l0X2V2ZXJ5X3BhZ2Ug PSB0cnVlOworCQkJfQogCQl9CiAJfQogCkBAIC01MDIsMTggKzUxOSwyOSBAQCBsb29wOgogCQkJ UmVsZWFzZUJ1ZmZlcihidWZmZXIpOwogCQl9CiAKLQkJLyogV2l0aG91dCBGU00sIGFsd2F5cyBm YWxsIG91dCBvZiB0aGUgbG9vcCBhbmQgZXh0ZW5kICovCi0JCWlmICghdXNlX2ZzbSkKKwkJaWYg KGFsd2F5c19leHRlbmQpCiAJCQlicmVhazsKIAotCQkvKgotCQkgKiBVcGRhdGUgRlNNIGFzIHRv IGNvbmRpdGlvbiBvZiB0aGlzIHBhZ2UsIGFuZCBhc2sgZm9yIGFub3RoZXIgcGFnZQotCQkgKiB0 byB0cnkuCi0JCSAqLwotCQl0YXJnZXRCbG9jayA9IFJlY29yZEFuZEdldFBhZ2VXaXRoRnJlZVNw YWNlKHJlbGF0aW9uLAotCQkJCQkJCQkJCQkJCXRhcmdldEJsb2NrLAotCQkJCQkJCQkJCQkJCXBh Z2VGcmVlU3BhY2UsCi0JCQkJCQkJCQkJCQkJbGVuICsgc2F2ZUZyZWVTcGFjZSk7CisJCWlmICh2 aXNpdF9ldmVyeV9wYWdlKQorCQl7CisJCQkvKiBObyBwYWdlcyBoYXZlIGVub3VnaCBmcmVlIHNw YWNlOyBleHRlbmQuICovCisJCQlpZiAodGFyZ2V0QmxvY2sgPT0gMCkKKwkJCQlicmVhazsKKwor CQkJLyogVHJ5IHRoZSBuZXh0IGxvd2VyIHBhZ2UuICovCisJCQl0YXJnZXRCbG9jay0tOworCQl9 CisJCWVsc2UKKwkJeworCQkJLyoKKwkJCSAqIFVwZGF0ZSBGU00gYXMgdG8gY29uZGl0aW9uIG9m IHRoaXMgcGFnZSwgYW5kIGFzayBmb3IgYW5vdGhlcgorCQkJICogcGFnZSB0byB0cnkuCisJCQkg Ki8KKwkJCXRhcmdldEJsb2NrID0gUmVjb3JkQW5kR2V0UGFnZVdpdGhGcmVlU3BhY2UocmVsYXRp b24sCisJCQkJCQkJCQkJCQkJCXRhcmdldEJsb2NrLAorCQkJCQkJCQkJCQkJCQlwYWdlRnJlZVNw YWNlLAorCQkJCQkJCQkJCQkJCQlsZW4gKyBzYXZlRnJlZVNwYWNlKTsKKwkJfQogCX0KIAogCS8q CkBAIC01MzQsNyArNTYyLDcgQEAgbG9vcDoKIAkgKi8KIAlpZiAobmVlZExvY2spCiAJewotCQlp ZiAoIXVzZV9mc20pCisJCWlmIChhbHdheXNfZXh0ZW5kIHx8IHZpc2l0X2V2ZXJ5X3BhZ2UpCiAJ CQlMb2NrUmVsYXRpb25Gb3JFeHRlbnNpb24ocmVsYXRpb24sIEV4Y2x1c2l2ZUxvY2spOwogCQll bHNlIGlmICghQ29uZGl0aW9uYWxMb2NrUmVsYXRpb25Gb3JFeHRlbnNpb24ocmVsYXRpb24sIEV4 Y2x1c2l2ZUxvY2spKQogCQl7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdG9yYWdlL2ZyZWVz cGFjZS9mcmVlc3BhY2UuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvZnJlZXNwYWNlL2ZyZWVzcGFj ZS5jCmluZGV4IDdjNGFkMWM0NDkuLmFiYjAzODc0YjkgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L3N0b3JhZ2UvZnJlZXNwYWNlL2ZyZWVzcGFjZS5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2Uv ZnJlZXNwYWNlL2ZyZWVzcGFjZS5jCkBAIC0xOTMsNiArMTkzLDcgQEAgUmVjb3JkUGFnZVdpdGhG cmVlU3BhY2UoUmVsYXRpb24gcmVsLCBCbG9ja051bWJlciBoZWFwQmxrLCBTaXplIHNwYWNlQXZh aWwpCiAvKgogICogWExvZ1JlY29yZFBhZ2VXaXRoRnJlZVNwYWNlIC0gbGlrZSBSZWNvcmRQYWdl V2l0aEZyZWVTcGFjZSwgZm9yIHVzZSBpbgogICoJCVdBTCByZXBsYXkKKyAqIFRPRE86IEF2b2lk IGNyZWF0aW5nIGEgRlNNIGhlcmUsIGFsc28uCiAgKi8KIHZvaWQKIFhMb2dSZWNvcmRQYWdlV2l0 aEZyZWVTcGFjZShSZWxGaWxlTm9kZSBybm9kZSwgQmxvY2tOdW1iZXIgaGVhcEJsaywKQEAgLTY3 NSw3ICs2NzYsMzYgQEAgZnNtX3NldF9hbmRfc2VhcmNoKFJlbGF0aW9uIHJlbCwgRlNNQWRkcmVz cyBhZGRyLCB1aW50MTYgc2xvdCwKIAlQYWdlCQlwYWdlOwogCWludAkJCW5ld3Nsb3QgPSAtMTsK IAotCWJ1ZiA9IGZzbV9yZWFkYnVmKHJlbCwgYWRkciwgdHJ1ZSk7CisJLyoKKwkgKiBGb3IgaGVh cHMgd2UgcHJldmVudCBleHRlbnNpb24gb2YgdGhlIEZTTSB1bmxlc3MgdGhlIG51bWJlciBvZiBw YWdlcworCSAqIGV4Y2VlZHMgSEVBUF9GU01fRVhURU5TSU9OX1RIUkVTSE9MRC4gRm9yIHRhYmxl cyB0aGF0IGRvbid0IGFscmVhZHkKKwkgKiBoYXZlIGEgRlNNLCB0aGlzIHdpbGwgc2F2ZSBhbiBp bm9kZSBhbmQgYSBmZXcga0Igb2Ygc3BhY2UuCisJICogRm9yIHNhbmUgdGhyZXNob2xkIHZhbHVl cywgdGhlIEZTTSBhZGRyZXNzIHdpbGwgYmUgemVybywgc28gd2UKKwkgKiBkb24ndCBib3RoZXIg ZGVhbGluZyB3aXRoIGFueXRoaW5nIGVsc2UuCisJICovCisJaWYgKHJlbC0+cmRfcmVsLT5yZWxr aW5kID09IFJFTEtJTkRfUkVMQVRJT04KKwkJJiYgYWRkci5sb2dwYWdlbm8gPT0gMCkKKwl7CisJ CUZTTUFkZHJlc3MJdGhyZXNob2xkX2FkZHI7CisJCXVpbnQxNgkJdGhyZXNob2xkX3Nsb3Q7CisK KwkJLyogR2V0IHRoZSBsb2NhdGlvbiBpbiB0aGUgRlNNIG9mIHRoZSB0aHJlc2hvbGQuICovCisJ CXRocmVzaG9sZF9hZGRyID0gZnNtX2dldF9sb2NhdGlvbihIRUFQX0ZTTV9FWFRFTlNJT05fVEhS RVNIT0xELAorCQkJCQkJCQkJCSAgJnRocmVzaG9sZF9zbG90KTsKKwkJQXNzZXJ0KHRocmVzaG9s ZF9hZGRyLmxvZ3BhZ2VubyA9PSAwKTsKKworCQlpZiAoc2xvdCA8PSB0aHJlc2hvbGRfc2xvdCkK KwkJeworCQkJYnVmID0gZnNtX3JlYWRidWYocmVsLCBhZGRyLCBmYWxzZSk7CisJCQlpZiAoYnVm ID09IEludmFsaWRCdWZmZXIpCisJCQkJcmV0dXJuIG5ld3Nsb3Q7CisJCX0KKwkJZWxzZQorCQkJ YnVmID0gZnNtX3JlYWRidWYocmVsLCBhZGRyLCB0cnVlKTsKKwl9CisJZWxzZQorCQlidWYgPSBm c21fcmVhZGJ1ZihyZWwsIGFkZHIsIHRydWUpOworCiAJTG9ja0J1ZmZlcihidWYsIEJVRkZFUl9M T0NLX0VYQ0xVU0lWRSk7CiAKIAlwYWdlID0gQnVmZmVyR2V0UGFnZShidWYpOwpkaWZmIC0tZ2l0 IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9mcmVlc3BhY2UuaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2Uv ZnJlZXNwYWNlLmgKaW5kZXggNzI2ZWIzMGZiOC4uNjhlNGQyNzgxOCAxMDA2NDQKLS0tIGEvc3Jj L2luY2x1ZGUvc3RvcmFnZS9mcmVlc3BhY2UuaAorKysgYi9zcmMvaW5jbHVkZS9zdG9yYWdlL2Zy ZWVzcGFjZS5oCkBAIC0xOCw2ICsxOCwxMCBAQAogI2luY2x1ZGUgInN0b3JhZ2UvcmVsZmlsZW5v ZGUuaCIKICNpbmNsdWRlICJ1dGlscy9yZWxjYWNoZS5oIgogCisvKiBPbmx5IGV4dGVuZCBhIGhl YXAncyBGU00gaWYgdGhlIGhlYXAgaGFzIGdyZWF0ZXIgdGhhbiB0aGlzIG1hbnkgYmxvY2tzICov CisvKiBUT0RPOiBQZXJmb3JtYW5jZS10ZXN0IGRpZmZlcmVudCB2YWx1ZXMuICovCisjZGVmaW5l IEhFQVBfRlNNX0VYVEVOU0lPTl9USFJFU0hPTEQgMTAKKwogLyogcHJvdG90eXBlcyBmb3IgcHVi bGljIGZ1bmN0aW9ucyBpbiBmcmVlc3BhY2UuYyAqLwogZXh0ZXJuIFNpemUgR2V0UmVjb3JkZWRG cmVlU3BhY2UoUmVsYXRpb24gcmVsLCBCbG9ja051bWJlciBoZWFwQmxrKTsKIGV4dGVybiBCbG9j a051bWJlciBHZXRQYWdlV2l0aEZyZWVTcGFjZShSZWxhdGlvbiByZWwsIFNpemUgc3BhY2VOZWVk ZWQpOwotLSAKMi4xNy4xCgo= --0000000000000d689605777fb3d4--