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 1kcDOR-0006DS-IZ for pgsql-hackers@arkaria.postgresql.org; Mon, 09 Nov 2020 20:04:00 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1kcDOQ-0005oj-Gk for pgsql-hackers@arkaria.postgresql.org; Mon, 09 Nov 2020 20:03:58 +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 1kcDOP-0005ob-U0 for pgsql-hackers@lists.postgresql.org; Mon, 09 Nov 2020 20:03:58 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by makus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1kcDOM-00084Y-I0 for pgsql-hackers@lists.postgresql.org; Mon, 09 Nov 2020 20:03:56 +0000 Received: from mail.postgrespro.ru (cyclops.postgrespro.ru [93.174.131.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id 816CF21C1738; Mon, 9 Nov 2020 23:03:53 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1604952233; bh=2wO/kiMH6MXjofYBD6RU5Wzf5xF1GjfsZvN2HHY6+fQ=; h=Date:From:To:Cc:Subject:In-Reply-To:References; b=iY5/AfbacEn8pnGac2Effpl1d/tdbVb6KK5hGb+TnZHZtXzV8pNh92lQ3shlGpRu2 OEcBxf7lkIPuVFtFHdndHX8DRd3kEopqZMD+oGpg6kLM6osob95jV1XGp78IjCjVCK 7wM1Fb2PQEW7DjIBT0bt4ACvJRN72wQYIQOfeja0= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_9a2fd88ea4bf489233212064168b84f1" Content-Transfer-Encoding: 8bit Date: Mon, 09 Nov 2020 23:03:53 +0300 From: Alexey Kondratov To: Tom Lane Cc: PostgreSQL Hackers , Robert Haas Subject: Re: Misuse of TimestampDifference() in the autoprewarm feature of pg_prewarm In-Reply-To: <1992985.1604948005@sss.pgh.pa.us> References: <3b1c053a21c07c1ed5e00be3b2b855ef@postgrespro.ru> <1992985.1604948005@sss.pgh.pa.us> User-Agent: Roundcube Webmail/1.4.0 Message-ID: X-Sender: a.kondratov@postgrespro.ru List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --=_9a2fd88ea4bf489233212064168b84f1 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed On 2020-11-09 21:53, Tom Lane wrote: > Alexey Kondratov writes: >> After fixing this issue I have noticed that it still dumps blocks >> twice >> at each timeout (here I set autoprewarm_interval to 15s): >> ... >> This happens because at timeout time we were using continue, but >> actually we still have to wait the entire autoprewarm_interval after >> successful dumping. > > I don't think your 0001 is correct. It would be okay if apw_dump_now() > could be counted on to take negligible time, but we shouldn't assume > that should we? > Yes, it seems so, if I understand you correctly. I had a doubt about possibility of pg_ctl to exit earlier than a dumping process. Now I added an explicit wait for dump file into test. > I agree that the "continue" seems a bit bogus, because it's skipping > the ResetLatch call at the bottom of the loop; it's not quite clear > to me whether that's a good thing or not. But the general idea of > the existing code seems to be to loop around and make a fresh > calculation > of how-long-to-wait, and that doesn't seem wrong. I have left the last patch intact, since it resolves the 'double dump' issue, but I agree with нщгк point about existing logic of the code, although it is a bit broken. So I have to think more about how to fix it in a better way. > 0002 seems like a pretty clear bug fix, though I wonder if this is > exactly > what we want to do going forward. It seems like a very large fraction > of > the callers of TimestampDifference would like to have the value in > msec, > which means we're doing a whole lot of expensive and error-prone > arithmetic to break down the difference to sec/usec and then put it > back together again. Let's get rid of that by inventing, say > TimestampDifferenceMilliseconds(...). Yeah, I get into this problem after a bug in another extension — pg_wait_sampling. I have attached 0002, which implements TimestampDifferenceMilliseconds(), so 0003 just uses this new function to solve the initial issues. If it looks good to you, then we can switch all similar callers to it. > BTW, I see another bug of a related ilk. Look what > postgres_fdw/connection.c is doing: > > TimestampDifference(now, endtime, &secs, µsecs); > > /* To protect against clock skew, limit sleep to one > minute. */ > cur_timeout = Min(60000, secs * USECS_PER_SEC + > microsecs); > > /* Sleep until there's something to do */ > wc = WaitLatchOrSocket(MyLatch, > WL_LATCH_SET | > WL_SOCKET_READABLE | > WL_TIMEOUT | > WL_EXIT_ON_PM_DEATH, > PQsocket(conn), > cur_timeout, PG_WAIT_EXTENSION); > > WaitLatchOrSocket's timeout is measured in msec not usec. I think the > comment about "clock skew" is complete BS, and the Min() calculation > was > put in as a workaround by somebody observing that the sleep waited too > long, but not understanding why. I wonder how many troubles one can get with all these unit conversions. Regards -- Alexey Kondratov Postgres Professional https://www.postgrespro.com Russian Postgres Company --=_9a2fd88ea4bf489233212064168b84f1 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v2-0004-pg_prewarm-refactor-autoprewarm-waits.patch Content-Disposition: attachment; filename=v2-0004-pg_prewarm-refactor-autoprewarm-waits.patch; size=891 RnJvbSBjNzlkZTE3MDE0NzUzYjMxMTg1OGI0NTcwY2E0NzVmNzEzMzI4YzYyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4ZXkgS29uZHJhdG92IDxrb25kcmF0b3YuYWxla3NleUBn bWFpbC5jb20+CkRhdGU6IE1vbiwgOSBOb3YgMjAyMCAxOToyNDo1NSArMDMwMApTdWJqZWN0OiBb UEFUQ0ggdjIgNC80XSBwZ19wcmV3YXJtOiByZWZhY3RvciBhdXRvcHJld2FybSB3YWl0cwoKUHJl dmlvdXNseSBpdCB3YXMgZHVtcGluZyB0d2ljZSBhdCBldmVyeSB0aW1lb3V0IHRpbWUuCi0tLQog Y29udHJpYi9wZ19wcmV3YXJtL2F1dG9wcmV3YXJtLmMgfCA0ICsrKy0KIDEgZmlsZSBjaGFuZ2Vk LCAzIGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKCmRpZmYgLS1naXQgYS9jb250cmliL3Bn X3ByZXdhcm0vYXV0b3ByZXdhcm0uYyBiL2NvbnRyaWIvcGdfcHJld2FybS9hdXRvcHJld2FybS5j CmluZGV4IGU1YmQxMzBiYzguLjg3MmM3ZDUxYjEgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcGdfcHJl d2FybS9hdXRvcHJld2FybS5jCisrKyBiL2NvbnRyaWIvcGdfcHJld2FybS9hdXRvcHJld2FybS5j CkBAIC0yMzYsNyArMjM2LDkgQEAgYXV0b3ByZXdhcm1fbWFpbihEYXR1bSBtYWluX2FyZykKIAkJ CXsKIAkJCQlsYXN0X2R1bXBfdGltZSA9IEdldEN1cnJlbnRUaW1lc3RhbXAoKTsKIAkJCQlhcHdf ZHVtcF9ub3codHJ1ZSwgZmFsc2UpOwotCQkJCWNvbnRpbnVlOworCisJCQkJLyogV2UgaGF2ZSB0 byBzbGVlcCBldmVuIGFmdGVyIGEgc3VjY2Vzc2Z1bCBkdW1wICovCisJCQkJZGVsYXlfaW5fbXMg PSBhdXRvcHJld2FybV9pbnRlcnZhbCAqIDEwMDA7CiAJCQl9CiAKIAkJCS8qIFNsZWVwIHVudGls IHRoZSBuZXh0IGR1bXAgdGltZS4gKi8KLS0gCjIuMTkuMQoK --=_9a2fd88ea4bf489233212064168b84f1 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v2-0003-pg_prewarm-fix-autoprewarm_interval-behaviour.patch Content-Disposition: attachment; filename=v2-0003-pg_prewarm-fix-autoprewarm_interval-behaviour.patch; size=1335 RnJvbSBjMzhjMDc3MDhkNTdkNmRlYzVhOGExNjk3Y2E5Yzk4MTBhZDRkN2NlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4ZXkgS29uZHJhdG92IDxrb25kcmF0b3YuYWxla3NleUBn bWFpbC5jb20+CkRhdGU6IE1vbiwgOSBOb3YgMjAyMCAxOToxMjowMCArMDMwMApTdWJqZWN0OiBb UEFUQ0ggdjIgMy80XSBwZ19wcmV3YXJtOiBmaXggYXV0b3ByZXdhcm1faW50ZXJ2YWwgYmVoYXZp b3VyLgoKUHJldmlvdXNseSBpdCBtaXN1c2VkIHNlY29uZHMgZnJvbSBUaW1lc3RhbXBEaWZmZXJl bmNlKCkgYXMKbWlsbGlzZWNvbmRzLCBzbyBpdCB3YXMgZHVtcGluZyBhdXRvcHJld2FybS5ibG9j a3MgfmV2ZXJ5IHNlY29uZApldmVudCB3aXRoIGRlZmF1bHQgYXV0b3ByZXdhcm1faW50ZXJ2YWwg PSAzMDBzLgotLS0KIGNvbnRyaWIvcGdfcHJld2FybS9hdXRvcHJld2FybS5jIHwgOCArKystLS0t LQogMSBmaWxlIGNoYW5nZWQsIDMgaW5zZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkKCmRpZmYg LS1naXQgYS9jb250cmliL3BnX3ByZXdhcm0vYXV0b3ByZXdhcm0uYyBiL2NvbnRyaWIvcGdfcHJl d2FybS9hdXRvcHJld2FybS5jCmluZGV4IGQzZGVjNmUzZWMuLmU1YmQxMzBiYzggMTAwNjQ0Ci0t LSBhL2NvbnRyaWIvcGdfcHJld2FybS9hdXRvcHJld2FybS5jCisrKyBiL2NvbnRyaWIvcGdfcHJl d2FybS9hdXRvcHJld2FybS5jCkBAIC0yMjIsMTYgKzIyMiwxNCBAQCBhdXRvcHJld2FybV9tYWlu KERhdHVtIG1haW5fYXJnKQogCQl7CiAJCQlsb25nCQlkZWxheV9pbl9tcyA9IDA7CiAJCQlUaW1l c3RhbXBUeiBuZXh0X2R1bXBfdGltZSA9IDA7Ci0JCQlsb25nCQlzZWNzID0gMDsKLQkJCWludAkJ CXVzZWNzID0gMDsKIAogCQkJLyogQ29tcHV0ZSB0aGUgbmV4dCBkdW1wIHRpbWUuICovCiAJCQlu ZXh0X2R1bXBfdGltZSA9CiAJCQkJVGltZXN0YW1wVHpQbHVzTWlsbGlzZWNvbmRzKGxhc3RfZHVt cF90aW1lLAogCQkJCQkJCQkJCQlhdXRvcHJld2FybV9pbnRlcnZhbCAqIDEwMDApOwotCQkJVGlt ZXN0YW1wRGlmZmVyZW5jZShHZXRDdXJyZW50VGltZXN0YW1wKCksIG5leHRfZHVtcF90aW1lLAot CQkJCQkJCQkmc2VjcywgJnVzZWNzKTsKLQkJCWRlbGF5X2luX21zID0gc2VjcyArICh1c2VjcyAv IDEwMDApOworCQkJZGVsYXlfaW5fbXMgPQorCQkJCVRpbWVzdGFtcERpZmZlcmVuY2VNaWxsaXNl Y29uZHMoR2V0Q3VycmVudFRpbWVzdGFtcCgpLAorCQkJCQkJCQkJCQkJbmV4dF9kdW1wX3RpbWUp OwogCiAJCQkvKiBQZXJmb3JtIGEgZHVtcCBpZiBpdCdzIHRpbWUuICovCiAJCQlpZiAoZGVsYXlf aW5fbXMgPD0gMCkKLS0gCjIuMTkuMQoK --=_9a2fd88ea4bf489233212064168b84f1 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v2-0002-Implement-TimestampDifferenceMilliseconds.patch Content-Disposition: attachment; filename=v2-0002-Implement-TimestampDifferenceMilliseconds.patch; size=2239 RnJvbSAyM2E4YTk2N2U4MDZiNzZmM2VkMmY5MDc4ZDZjOWFmZGM3YThkYzQ4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4ZXkgS29uZHJhdG92IDxrb25kcmF0b3YuYWxla3NleUBn bWFpbC5jb20+CkRhdGU6IE1vbiwgOSBOb3YgMjAyMCAyMjoyOTo0OCArMDMwMApTdWJqZWN0OiBb UEFUQ0ggdjIgMi80XSBJbXBsZW1lbnQgVGltZXN0YW1wRGlmZmVyZW5jZU1pbGxpc2Vjb25kcygp CgpNYW55IGNhbGxlcnMgb2YgVGltZXN0YW1wRGlmZmVyZW5jZSgpIGFjdHVhbGx5IHdhbnQgYSBk aWZmZXJlbmNlCmluIG1pbGxpc2Vjb25kcy4gIFRoaXMgbmV3IGZ1bmN0aW9uIGFsbG93cyB0aGVt IHRvIGdldCByaWQgb2YKdW5uZWNlc3NhcnkgKGFuZCBmcmVxdWVudGx5IHVuc2FmZSkgY2FsY3Vs YXRpb25zIG9mIG1pbGxpc2Vjb25kcyBmcm9tCnNlY29uZHMgYW5kIG1pY3Jvc2Vjb25kcy4KLS0t CiBzcmMvYmFja2VuZC91dGlscy9hZHQvdGltZXN0YW1wLmMgfCAyMCArKysrKysrKysrKysrKysr KysrKwogc3JjL2luY2x1ZGUvdXRpbHMvdGltZXN0YW1wLmggICAgIHwgIDIgKysKIDIgZmlsZXMg Y2hhbmdlZCwgMjIgaW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxz L2FkdC90aW1lc3RhbXAuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC90aW1lc3RhbXAuYwppbmRl eCBlYTBhZGE3MDRmLi43YjI4ZjA3MGNjIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9h ZHQvdGltZXN0YW1wLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3RpbWVzdGFtcC5jCkBA IC0xNjY2LDYgKzE2NjYsMjYgQEAgVGltZXN0YW1wRGlmZmVyZW5jZShUaW1lc3RhbXBUeiBzdGFy dF90aW1lLCBUaW1lc3RhbXBUeiBzdG9wX3RpbWUsCiAJfQogfQogCisvKgorICogVGltZXN0YW1w RGlmZmVyZW5jZU1pbGxpc2Vjb25kcyAtLSBjb252ZXJ0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4g dHdvCisgKiAJCXRpbWVzdGFtcHMgaW50byBpbnRlZ2VyIG1pbGxpc2Vjb25kcy4KKyAqCisgKiBC b3RoIGlucHV0cyBtdXN0IGJlIG9yZGluYXJ5IGZpbml0ZSB0aW1lc3RhbXBzIChpbiBjdXJyZW50 IHVzYWdlLAorICogdGhleSdsbCBiZSByZXN1bHRzIGZyb20gR2V0Q3VycmVudFRpbWVzdGFtcCgp KS4KKyAqCisgKiBXZSBleHBlY3Qgc3RhcnRfdGltZSA8PSBzdG9wX3RpbWUuICBJZiBub3QsIHdl IHJldHVybiB6ZXJvLgorICovCitsb25nCitUaW1lc3RhbXBEaWZmZXJlbmNlTWlsbGlzZWNvbmRz KFRpbWVzdGFtcFR6IHN0YXJ0X3RpbWUsIFRpbWVzdGFtcFR6IHN0b3BfdGltZSkKK3sKKwlUaW1l c3RhbXBUeiBkaWZmID0gc3RvcF90aW1lIC0gc3RhcnRfdGltZTsKKworCWlmIChkaWZmIDw9IDAp CisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIChsb25nKSAoZGlmZiAvIDEwMDApOworfQor CiAvKgogICogVGltZXN0YW1wRGlmZmVyZW5jZUV4Y2VlZHMgLS0gcmVwb3J0IHdoZXRoZXIgdGhl IGRpZmZlcmVuY2UgYmV0d2VlbiB0d28KICAqCQl0aW1lc3RhbXBzIGlzID49IGEgdGhyZXNob2xk IChleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzKQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvdXRp bHMvdGltZXN0YW1wLmggYi9zcmMvaW5jbHVkZS91dGlscy90aW1lc3RhbXAuaAppbmRleCAxNmMz ZmQ4ZWM5Li5kNDViZjJiYjdiIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGlscy90aW1lc3Rh bXAuaAorKysgYi9zcmMvaW5jbHVkZS91dGlscy90aW1lc3RhbXAuaApAQCAtNzIsNiArNzIsOCBA QCBleHRlcm4gVGltZXN0YW1wVHogR2V0U1FMQ3VycmVudFRpbWVzdGFtcChpbnQzMiB0eXBtb2Qp OwogZXh0ZXJuIFRpbWVzdGFtcCBHZXRTUUxMb2NhbFRpbWVzdGFtcChpbnQzMiB0eXBtb2QpOwog ZXh0ZXJuIHZvaWQgVGltZXN0YW1wRGlmZmVyZW5jZShUaW1lc3RhbXBUeiBzdGFydF90aW1lLCBU aW1lc3RhbXBUeiBzdG9wX3RpbWUsCiAJCQkJCQkJCWxvbmcgKnNlY3MsIGludCAqbWljcm9zZWNz KTsKK2V4dGVybiBsb25nIFRpbWVzdGFtcERpZmZlcmVuY2VNaWxsaXNlY29uZHMoVGltZXN0YW1w VHogc3RhcnRfdGltZSwKKwkJCQkJCQkJCQkJVGltZXN0YW1wVHogc3RvcF90aW1lKTsKIGV4dGVy biBib29sIFRpbWVzdGFtcERpZmZlcmVuY2VFeGNlZWRzKFRpbWVzdGFtcFR6IHN0YXJ0X3RpbWUs CiAJCQkJCQkJCQkgICBUaW1lc3RhbXBUeiBzdG9wX3RpbWUsCiAJCQkJCQkJCQkgICBpbnQgbXNl Yyk7Ci0tIAoyLjE5LjEKCg== --=_9a2fd88ea4bf489233212064168b84f1 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v2-0001-pg_prewarm-add-tap-test-for-autoprewarm-feature.patch Content-Disposition: attachment; filename=v2-0001-pg_prewarm-add-tap-test-for-autoprewarm-feature.patch; size=2530 RnJvbSA1MmE3N2E1MjUwZjc2NWM3OWNjZGEzYWYwMDkwNjUwNWMwMTYzMTQxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4ZXkgS29uZHJhdG92IDxrb25kcmF0b3YuYWxla3NleUBn bWFpbC5jb20+CkRhdGU6IE1vbiwgOSBOb3YgMjAyMCAxOTowNDoxMCArMDMwMApTdWJqZWN0OiBb UEFUQ0ggdjIgMS80XSBwZ19wcmV3YXJtOiBhZGQgdGFwIHRlc3QgZm9yIGF1dG9wcmV3YXJtIGZl YXR1cmUKCi0tLQogY29udHJpYi9wZ19wcmV3YXJtL01ha2VmaWxlICAgICAgICAgICAgIHwgIDIg KwogY29udHJpYi9wZ19wcmV3YXJtL3QvMDAxX2F1dG9wcmV3YXJtLnBsIHwgNTkgKysrKysrKysr KysrKysrKysrKysrKysrKwogMiBmaWxlcyBjaGFuZ2VkLCA2MSBpbnNlcnRpb25zKCspCiBjcmVh dGUgbW9kZSAxMDA2NDQgY29udHJpYi9wZ19wcmV3YXJtL3QvMDAxX2F1dG9wcmV3YXJtLnBsCgpk aWZmIC0tZ2l0IGEvY29udHJpYi9wZ19wcmV3YXJtL01ha2VmaWxlIGIvY29udHJpYi9wZ19wcmV3 YXJtL01ha2VmaWxlCmluZGV4IGIxM2FjM2M4MTMuLjljZmRlOGM0ZTQgMTAwNjQ0Ci0tLSBhL2Nv bnRyaWIvcGdfcHJld2FybS9NYWtlZmlsZQorKysgYi9jb250cmliL3BnX3ByZXdhcm0vTWFrZWZp bGUKQEAgLTEwLDYgKzEwLDggQEAgRVhURU5TSU9OID0gcGdfcHJld2FybQogREFUQSA9IHBnX3By ZXdhcm0tLTEuMS0tMS4yLnNxbCBwZ19wcmV3YXJtLS0xLjEuc3FsIHBnX3ByZXdhcm0tLTEuMC0t MS4xLnNxbAogUEdGSUxFREVTQyA9ICJwZ19wcmV3YXJtIC0gcHJlbG9hZCByZWxhdGlvbiBkYXRh IGludG8gc3lzdGVtIGJ1ZmZlciBjYWNoZSIKIAorVEFQX1RFU1RTID0gMQorCiBpZmRlZiBVU0Vf UEdYUwogUEdfQ09ORklHID0gcGdfY29uZmlnCiBQR1hTIDo9ICQoc2hlbGwgJChQR19DT05GSUcp IC0tcGd4cykKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfcHJld2FybS90LzAwMV9hdXRvcHJld2Fy bS5wbCBiL2NvbnRyaWIvcGdfcHJld2FybS90LzAwMV9hdXRvcHJld2FybS5wbApuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi43NDRjNDQzMTY5Ci0tLSAvZGV2L251bGwKKysr IGIvY29udHJpYi9wZ19wcmV3YXJtL3QvMDAxX2F1dG9wcmV3YXJtLnBsCkBAIC0wLDAgKzEsNTkg QEAKKyMKKyMgQ2hlY2sgdGhhdCBwZ19wcmV3YXJtIGNhbiBkdW1wIGJsb2NrcyBmcm9tIHNoYXJl ZCBidWZmZXJzCisjIHRvIFBHREFUQS9hdXRvcHJld2FybS5ibG9ja3MuCisjCisKK3VzZSBzdHJp Y3Q7Cit1c2UgVGVzdDo6TW9yZTsKK3VzZSBUZXN0TGliOwordXNlIFRpbWU6OkhpUmVzIHF3KHVz bGVlcCk7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBQb3N0Z3Jlc05vZGU7CisKK3BsYW4gdGVzdHMg PT4gMzsKKworIyBXYWl0IHVwIHRvIDE4MHMgZm9yIHBnX3ByZXdhcm0gdG8gZHVtcCBibG9ja3Mu CitzdWIgd2FpdF9mb3JfZHVtcAoreworCW15ICRwYXRoID0gc2hpZnQ7CisKKwlmb3JlYWNoIG15 ICRpICgwIC4uIDE4MDApCisJeworCQlsYXN0IGlmIC1lICRwYXRoOworCQl1c2xlZXAoMTAwXzAw MCk7CisJfQorfQorCitteSAkbm9kZSA9IGdldF9uZXdfbm9kZSgibm9kZSIpOworJG5vZGUtPmlu aXQ7Ciskbm9kZS0+YXBwZW5kX2NvbmYoCisJJ3Bvc3RncmVzcWwuY29uZicsIHFxKAorc2hhcmVk X3ByZWxvYWRfbGlicmFyaWVzID0gJ3BnX3ByZXdhcm0nCitwZ19wcmV3YXJtLmF1dG9wcmV3YXJt ID0gJ29uJworcGdfcHJld2FybS5hdXRvcHJld2FybV9pbnRlcnZhbCA9IDEKKykpOworJG5vZGUt PnN0YXJ0OworCitteSAkYmxvY2tzX3BhdGggPSAkbm9kZS0+ZGF0YV9kaXIgLiAnL2F1dG9wcmV3 YXJtLmJsb2Nrcyc7CisKKyMgQ2hlY2sgdGhhdCB3ZSBjYW4gZHVtcCBibG9ja3Mgb24gdGltZW91 dC4KK3dhaXRfZm9yX2R1bXAoJGJsb2Nrc19wYXRoKTsKK29rKC1lICRibG9ja3NfcGF0aCwgJ2Zp bGUgYXV0b3ByZXdhcm0uYmxvY2tzIHNob3VsZCBiZSBwcmVzZW50IGluIHRoZSBQR0RBVEEnKTsK KworIyBDaGVjayB0aGF0IHdlIGNhbiBkdW1wIGJsb2NrcyBvbiBzaHV0ZG93bi4KKyRub2RlLT5z dG9wOworJG5vZGUtPmFwcGVuZF9jb25mKAorICAgICdwb3N0Z3Jlc3FsLmNvbmYnLCBxcSgKK3Bn X3ByZXdhcm0uYXV0b3ByZXdhcm1faW50ZXJ2YWwgPSAwCispKTsKKworIyBSZW1vdmUgYXV0b3By ZXdhcm0uYmxvY2tzCit1bmxpbmsoJGJsb2Nrc19wYXRoKSB8fCBkaWUgIiRibG9ja3NfcGF0aDog JCEiOworb2soIS1lICRibG9ja3NfcGF0aCwgJ3Nhbml0eSBjaGVjaywgZHVtcCBvbiB0aW1lb3V0 IGlzIHR1cm5lZCBvZmYnKTsKKworJG5vZGUtPnN0YXJ0OworJG5vZGUtPnN0b3A7CisKK3dhaXRf Zm9yX2R1bXAoJGJsb2Nrc19wYXRoKTsKK29rKC1lICRibG9ja3NfcGF0aCwgJ2ZpbGUgYXV0b3By ZXdhcm0uYmxvY2tzIHNob3VsZCBiZSBwcmVzZW50IGluIHRoZSBQR0RBVEEgYWZ0ZXIgY2xlYW4g c2h1dGRvd24nKTsKCmJhc2UtY29tbWl0OiA4ZjExMzY5OGI2M2IxNWE0ZTBhNGIxNWQzZWUzNzIz OGMxZDE4MjFkCi0tIAoyLjE5LjEKCg== --=_9a2fd88ea4bf489233212064168b84f1--