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 1wnri3-000evs-0b for pgsql-hackers@arkaria.postgresql.org; Sun, 26 Jul 2026 05:47:35 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wnri2-008Prk-0c for pgsql-hackers@arkaria.postgresql.org; Sun, 26 Jul 2026 05:47:34 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wnri1-008Pra-1o for pgsql-hackers@lists.postgresql.org; Sun, 26 Jul 2026 05:47:33 +0000 Received: from mail-ed1-x532.google.com ([2a00:1450:4864:20::532]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wnrhz-00000000Nvz-19v4 for pgsql-hackers@lists.postgresql.org; Sun, 26 Jul 2026 05:47:32 +0000 Received: by mail-ed1-x532.google.com with SMTP id 4fb4d7f45d1cf-69fc6a09b5aso1309015a12.3 for ; Sat, 25 Jul 2026 22:47:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785044850; x=1785649650; darn=lists.postgresql.org; h=subject:from:content-language:to:user-agent:mime-version:date :message-id:content-type:from:to:cc:subject:date:message-id:reply-to :content-type; bh=xWK0HwU4XPNuL7S9fSifLQTJHFr5en1ADYdLD0q3pwE=; b=dbvUaqRAm7KAZO/DWApLtR07fDTtASHt/3MAjenih2J5v3WV1saJTRBz+W6VdQhDSQ wuwuLzVQqGtgasCO5CjF0XxIouz0caWhSz5BzhcpLgECNCxdyofV56HaJ1bNnBLtdMMe OrXmAOxn58YrNmz9NWRj4U2QzBe2XAWVeIrIi9v6v7jyOfVoeW1Oi+tDYqOVt9bTtpwn Gd/hwtAQ+wNdwB+HjH9Zbs0OuBT/R4NmJY0yIL3rgIEwYCarjd91OeJ2fkeZa65Ov5mT FpRQB0pzOX+OYLRXB8gy9B6uCSYX3Zd9UOeIUAd+ymV6b9SU2A8oYvaQAT2IL49YR07U LcJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785044850; x=1785649650; h=subject:from:content-language:to:user-agent:mime-version:date :message-id:content-type:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to:content-type; bh=xWK0HwU4XPNuL7S9fSifLQTJHFr5en1ADYdLD0q3pwE=; b=CoaQ/a47JgktWd0Ov9zg5zaTdWpAUxe48SqgdHzWpOKK5EAe2v/cs183hcyijwf534 QgQiX4X3DC6sIOT8nJRaDoV8ZefNTSueYTvNAcNvBxg+1f/sEug53LNuiZw4pJ1WpdKl PCx++/ZrI4xdqjAkZdb2LolFNQAaCZfkIU0dv70GOz2G8qD2B8HL+N1uKqwvOa2MaMAA Gu/u9W/3cZ2D6nGh6W+gDVyJ7wt5oTixAAeJ+6h/k1DO9tDOV9yyyh/4VWiLlAt7NZRU JI/NbAlIYn7I4sqalCAIC4rPWVAhtzkpyI08N4J6aswLpWCnPX0HPZ4YZAiMISYZAhmW vcFg== X-Gm-Message-State: AOJu0YwYYlGCAdeRj8/RdAr8f/rEH+owxQySZh728jROzvCetKEUwZc0 jMKhX9+WVdi58Y3+3LCStpsLW3+3uZ8BgfUPaps1oIEmMqpdkXmQl8RHAa26JQ== X-Gm-Gg: AR+sD13KN23YJIsJEjiQfSmgeDb/CUrfyjzYJBQ9jastAAEc259W91gcX+44FII6VLy H4fIWJxaBl8JNsonGmIGWMUh8piWsdJGWxHcw3V+0BANcOLz5RthzhulssYhdT/+o8CF3dC/jpm xd9pwyaIy64hUBJF7E8A/sp5a3Xbcqqm2Zk6nBJ6KG3Cod/YRiVeialX9n3NuN5XeWaKXt8ppew IStklRSYyzvfRei/RQhoqnPryF/GDim4ee0SLNbIiuxsgUjFydTSfsh0E77y0GJLksyi1i66IEY Y3RGP78io6V7lkCxdhwF6nY9vE0FONqCUomLYq0LRveqbAN1Ole8n71KikjThw4Y+NcAqMmIKXd Z4fFyBKkzkQwH4AnKwzALg4iBgTz45QjyzIaGHsfOSB0DE1/fEy4myvMhP6Mty7J+teelgnvD0O ZFv41OZB5RWy3Y7xGeQ60iDYYxffV9floKq6yu8MUjmSE= X-Received: by 2002:a05:6402:24c3:b0:697:cec5:d056 with SMTP id 4fb4d7f45d1cf-69fc0f6b38dmr1223837a12.0.1785044849588; Sat, 25 Jul 2026 22:47:29 -0700 (PDT) Received: from [192.168.0.11] (c151-177-23-39.bredband.tele2.se. [151.177.23.39]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-69fb55438easm1428159a12.18.2026.07.25.22.47.28 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 25 Jul 2026 22:47:28 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------wSmNkAHoSH9h7H50epPuMRzQ" Message-ID: <30e5bab4-8f61-4f03-9cec-e486540a78fb@gmail.com> Date: Sun, 26 Jul 2026 07:47:28 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: PostgreSQL Hackers Content-Language: en-US From: Mats Kindahl Subject: Recovery does not honor io_combine_limit, causing IOPS saturation List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------wSmNkAHoSH9h7H50epPuMRzQ Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi all, I have been running recovery of Postgres clusters and small AWS instances and with a long history to replay, this quickly eats up the I/O budget for the device. For example, with a gp3 with an IOPS limit of 3000 you quickly eat it up and get long stalls to recover the cluster. This is because the WAL replay reads the WAL in 8 KiB block rather than honoring io_combine_limit, which typically could allow reading 256 KiB in one go. Since Postgres already have the option io_combine_limit to combine multiple block reads into a single read, it is straightforward to honor it during recovery using a simple cache (see attached patch). Since WAL replay is mostly from beginning to end, it is a simple way to reduce IOPS usage. With this patch, and the default io_combine_limit of 16, I managed to reduce the number of I/O reads significantly: |            | reads  | read_bytes  | avg bytes/read | |------------|--------|-------------|----------------| | WAL before | 31,283 | 256,270,336 | 8,192          | | WAL after  | 1,955  | 256,131,072 | 131,013        | Some back-of-the-envelope calculations give that with this patch we should not be able to saturate the device interface with the maximum read bandwidth for gp3 is approx 125 MiB/s, but the maximum read speed if you want to not hit the limit when you read 8 KiB blocks is 23-24 MiB/s. I thought I'd share the patch and the results and hear if people think this is a useful improvement. There is already some work on pre-fetching, but this is such a simple patch that I think it could be worth to add to the current version. (I also have some Perl scripts to set up crash recovery and some bpftrace scripts that checks the reads, if anybody is interested, but I need to clean them up a little.) Best wishes, Mats Kindahl, Multigres Engineer, Supabase --------------wSmNkAHoSH9h7H50epPuMRzQ Content-Type: text/x-patch; charset=UTF-8; name="v1.0001-Combine-WAL-segment-reads-during-recovery-into-large.patch" Content-Disposition: attachment; filename*0="v1.0001-Combine-WAL-segment-reads-during-recovery-into-large"; filename*1=".patch" Content-Transfer-Encoding: base64 RnJvbSA1YWQxNzQ2YzY4NTBjZGQ4MWIzYjkwZjdjYmM5YzdjNTVlZmZhMTk4IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRzIEtpbmRhaGwgPG1hdHNAa2luZGFobC5uZXQ+ CkRhdGU6IFR1ZSwgMjEgSnVsIDIwMjYgMDk6NDk6NTggKzAyMDAKU3ViamVjdDogQ29tYmlu ZSBXQUwgc2VnbWVudCByZWFkcyBkdXJpbmcgcmVjb3ZlcnkgaW50byBsYXJnZXIgcHJlYWQo KSBjYWxscwoKWExvZ1BhZ2VSZWFkKCkgdW5jb25kaXRpb25hbGx5IHJlYWQgZXhhY3RseSBv bmUgWExPR19CTENLU1ogcGFnZSBwZXIKcHJlYWQoKSBjYWxsIHJlZ2FyZGxlc3Mgb2YgaG93 IG11Y2ggbW9yZSBvZiB0aGUgc2VnbWVudCB3YXMgYWxyZWFkeQprbm93biB0byBiZSBzYWZl bHkgcmVhZGFibGUuCgpUaGlzIG1lYW5zIHVwIHRvIH4zMnggbW9yZSBJL08gb3BlcmF0aW9u cyB0aGFuIG5lY2Vzc2FyeSBmb3Igc2VxdWVudGlhbApXQUwgcmVwbGF5IChjcmFzaCByZWNv dmVyeSwgYXJjaGl2ZSByZWNvdmVyeSwgc3RhbmRieSBXQUwgcmVwbGF5KSwgc2luY2UKYSBz aW5nbGUgcHJlYWQoKSByZXF1ZXN0IGNvdWxkIGluc3RlYWQgY292ZXIgdXAgdG8gaW9fY29t YmluZV9saW1pdApwYWdlcy4KCkFkZCBhIHJlYWQtYWhlYWQgY2FjaGUgcHJpdmF0ZSB0byBY TG9nUGFnZVJlYWQoKSBidXQga2VlcCB0aGUgZXhpc3RpbmcKdXNhZ2Ugb2YgcmV0dXJuaW5n IGEgc2luZ2xlIFhMT0dfQkxDS1NaIHBhZ2UgZm9yIGVhY2ggY2FsbC4gT24gYSBtaXNzLApy ZWFkIGFzIG1hbnkgcGFnZXMgYXMgYXJlIHNhZmUgaW4gb25lIHByZWFkKCkgaW50byB0aGUg Y2FjaGUgKHVwIHRvCmlvX2NvbWJpbmVfbGltaXQgcGFnZXMpLiBPbiBhIGhpdCwgbWVtY3B5 IHRoZSByZXF1ZXN0ZWQgcGFnZSBvdXQgb2YgdGhlCmNhY2hlLgoKQWxzbyBpbnRyb2R1Y2Vz IGEgbmV3IFhsb2dGaWxlQ2xvc2UoKSBoZWxwZXIgdGhhdCBhbHNvIGludmFsaWRhdGVzIHRo ZQpjYWNoZSBhbmQgdXNlIHRoYXQgaW5zdGVhZCBvZiBleHBsaWNpdGx5IGNsb3NpbmcgdGhl IGZpbGUgZWFjaCB0aW1lLgotLS0KIHNyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2dy ZWNvdmVyeS5jIHwgMjIyICsrKysrKysrKysrKysrKy0tLS0tLS0KIDEgZmlsZSBjaGFuZ2Vk LCAxNTcgaW5zZXJ0aW9ucygrKSwgNjUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ3JlY292ZXJ5LmMgYi9zcmMvYmFja2VuZC9h Y2Nlc3MvdHJhbnNhbS94bG9ncmVjb3ZlcnkuYwppbmRleCA1ZjNiMDY1Yjg5NC4uZTJjM2Y0 YmZkOWEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2dyZWNv dmVyeS5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2dyZWNvdmVyeS5j CkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSAicmVwbGljYXRpb24vc2xvdC5oIgogI2lu Y2x1ZGUgInJlcGxpY2F0aW9uL3Nsb3RzeW5jLmgiCiAjaW5jbHVkZSAicmVwbGljYXRpb24v d2FscmVjZWl2ZXIuaCIKKyNpbmNsdWRlICJzdG9yYWdlL2J1Zm1nci5oIgogI2luY2x1ZGUg InN0b3JhZ2UvZmQuaCIKICNpbmNsdWRlICJzdG9yYWdlL2lwYy5oIgogI2luY2x1ZGUgInN0 b3JhZ2UvbGF0Y2guaCIKQEAgLTYzLDYgKzY0LDcgQEAKICNpbmNsdWRlICJ1dGlscy9mbWdy cHJvdG9zLmgiCiAjaW5jbHVkZSAidXRpbHMvZ3VjLmgiCiAjaW5jbHVkZSAidXRpbHMvZ3Vj X2hvb2tzLmgiCisjaW5jbHVkZSAidXRpbHMvbWVtdXRpbHMuaCIKICNpbmNsdWRlICJ1dGls cy9wZ3N0YXRfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ1dGlscy9wZ19sc24uaCIKICNpbmNs dWRlICJ1dGlscy9wc19zdGF0dXMuaCIKQEAgLTIzOCw2ICsyNDAsMjQgQEAgc3RhdGljIHVp bnQzMiByZWFkT2ZmID0gMDsKIHN0YXRpYyB1aW50MzIgcmVhZExlbiA9IDA7CiBzdGF0aWMg WExvZ1NvdXJjZSByZWFkU291cmNlID0gWExPR19GUk9NX0FOWTsKIAorLyoKKyAqIFJlYWQt YWhlYWQgY2FjaGUgZm9yIFdBTCBzZWdtZW50IHJlYWRzLCBhbGxvY2F0ZWQgb25jZSBieSBJ bml0V2FsUmVjb3ZlcnkoKQorICogYW5kIGZpbGxlZCBieSBYTG9nUGFnZVJlYWQoKSB3aXRo IHVwIHRvIGlvX2NvbWJpbmVfbGltaXQgWExPR19CTENLU1ogcGFnZXMgaW4KKyAqIGEgc2lu Z2xlIHByZWFkKCkuCisgKgorICogVGhpcyBpcyBwcml2YXRlIHRvIFhMb2dQYWdlUmVhZCgp IGFuZCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHBhZ2UgcmVhZCBjb250cmFjdDoKKyAqIGNhbGxl cnMgc3RpbGwgZ2V0IGJhY2sgb25lIFhMT0dfQkxDS1NaIHBhZ2UgcGVyIGNhbGwgaW4gdGhl IGNhbGxlci1zdXBwbGllZAorICogYnVmZmVyLgorICoKKyAqIElmIHJlYWRBaGVhZExlbiA9 PSAwIG1lYW5zIHRoZSBjYWNoZSBpcyBlbXB0eSBvciBpbnZhbGlkIGFuZCBtdXN0IGJlIHJl c2V0IHRvCisgKiAwIGF0IGV2ZXJ5IHBvaW50IHRoYXQgYWxyZWFkeSBjbG9zZXMgb3Igb3Ro ZXJ3aXNlIGludmFsaWRhdGVzIHJlYWRGaWxlIChzZWUKKyAqIFhMb2dSZWFkQWhlYWRJbnZh bGlkYXRlKCkpLgorICovCitzdGF0aWMgY2hhciAqcmVhZEFoZWFkQnVmID0gTlVMTDsKK3N0 YXRpYyBYTG9nU2VnTm8gcmVhZEFoZWFkU2VnTm8gPSAwOworc3RhdGljIHVpbnQzMiByZWFk QWhlYWRPZmYgPSAwOworc3RhdGljIHVpbnQzMiByZWFkQWhlYWRMZW4gPSAwOworCiAvKgog ICogS2VlcHMgdHJhY2sgb2Ygd2hpY2ggc291cmNlIHdlJ3JlIGN1cnJlbnRseSByZWFkaW5n IGZyb20uIFRoaXMgaXMKICAqIGRpZmZlcmVudCBmcm9tIHJlYWRTb3VyY2UgaW4gdGhhdCB0 aGlzIGlzIGFsd2F5cyBzZXQsIGV2ZW4gd2hlbiB3ZSBkb24ndApAQCAtMzcyLDYgKzM5Miw4 IEBAIHN0YXRpYyBYTG9nUmVjb3JkICpSZWFkUmVjb3JkKFhMb2dQcmVmZXRjaGVyICp4bG9n cHJlZmV0Y2hlciwKIAogc3RhdGljIGludAlYTG9nUGFnZVJlYWQoWExvZ1JlYWRlclN0YXRl ICp4bG9ncmVhZGVyLCBYTG9nUmVjUHRyIHRhcmdldFBhZ2VQdHIsCiAJCQkJCQkgaW50IHJl cUxlbiwgWExvZ1JlY1B0ciB0YXJnZXRSZWNQdHIsIGNoYXIgKnJlYWRCdWYpOworc3RhdGlj IHZvaWQgWExvZ0ZpbGVDbG9zZSh2b2lkKTsKK3N0YXRpYyB2b2lkIFhMb2dSZWFkQWhlYWRJ bnZhbGlkYXRlKHZvaWQpOwogc3RhdGljIFhMb2dQYWdlUmVhZFJlc3VsdCBXYWl0Rm9yV0FM VG9CZWNvbWVBdmFpbGFibGUoWExvZ1JlY1B0ciBSZWNQdHIsCiAJCQkJCQkJCQkJCQkJICBi b29sIHJhbmRBY2Nlc3MsCiAJCQkJCQkJCQkJCQkJICBib29sIGZldGNoaW5nX2NrcHQsCkBA IC01MTgsNiArNTQwLDEzIEBAIEluaXRXYWxSZWNvdmVyeShDb250cm9sRmlsZURhdGEgKkNv bnRyb2xGaWxlLCBib29sICp3YXNTaHV0ZG93bl9wdHIsCiAJICovCiAJWExvZ1JlYWRlclNl dERlY29kZUJ1ZmZlcih4bG9ncmVhZGVyLCBOVUxMLCB3YWxfZGVjb2RlX2J1ZmZlcl9zaXpl KTsKIAorCS8qCisJICogQWxsb2NhdGUgdGhlIHJlYWQtYWhlYWQgY2FjaGUgdXNlZCBieSBY TG9nUGFnZVJlYWQoKSB0byBjb21iaW5lIHNldmVyYWwKKwkgKiBYTE9HX0JMQ0tTWiBwYWdl IHJlYWRzIGludG8gb25lIGxhcmdlciBwcmVhZCgpLgorCSAqLworCUFzc2VydChyZWFkQWhl YWRCdWYgPT0gTlVMTCk7CisJcmVhZEFoZWFkQnVmID0gcGFsbG9jKE1BWF9JT19DT01CSU5F X0xJTUlUICogWExPR19CTENLU1opOworCiAJLyogQ3JlYXRlIGEgV0FMIHByZWZldGNoZXIu ICovCiAJeGxvZ3ByZWZldGNoZXIgPSBYTG9nUHJlZmV0Y2hlckFsbG9jYXRlKHhsb2dyZWFk ZXIpOwogCkBAIC0xNTExLDExICsxNTQwLDcgQEAgRmluaXNoV2FsUmVjb3Zlcnkodm9pZCkK IAkJICogSWYgdGhlIGVuZGluZyBsb2cgc2VnbWVudCBpcyBzdGlsbCBvcGVuLCBjbG9zZSBp dCAodG8gYXZvaWQKIAkJICogcHJvYmxlbXMgb24gV2luZG93cyB3aXRoIHRyeWluZyB0byBy ZW5hbWUgb3IgZGVsZXRlIGFuIG9wZW4gZmlsZSkuCiAJCSAqLwotCQlpZiAocmVhZEZpbGUg Pj0gMCkKLQkJewotCQkJY2xvc2UocmVhZEZpbGUpOwotCQkJcmVhZEZpbGUgPSAtMTsKLQkJ fQorCQlYTG9nRmlsZUNsb3NlKCk7CiAJfQogCiAJLyoKQEAgLTE1NzcsMTEgKzE2MDIsNyBA QCBTaHV0ZG93bldhbFJlY292ZXJ5KHZvaWQpCiAJWExvZ1ByZWZldGNoZXJDb21wdXRlU3Rh dHMoeGxvZ3ByZWZldGNoZXIpOwogCiAJLyogU2h1dCBkb3duIHhsb2dyZWFkZXIgKi8KLQlp ZiAocmVhZEZpbGUgPj0gMCkKLQl7Ci0JCWNsb3NlKHJlYWRGaWxlKTsKLQkJcmVhZEZpbGUg PSAtMTsKLQl9CisJWExvZ0ZpbGVDbG9zZSgpOwogCXBmcmVlKHhsb2dyZWFkZXItPnByaXZh dGVfZGF0YSk7CiAJWExvZ1JlYWRlckZyZWUoeGxvZ3JlYWRlcik7CiAJWExvZ1ByZWZldGNo ZXJGcmVlKHhsb2dwcmVmZXRjaGVyKTsKQEAgLTMxNTQsMTEgKzMxNzUsNyBAQCBSZWFkUmVj b3JkKFhMb2dQcmVmZXRjaGVyICp4bG9ncHJlZmV0Y2hlciwgaW50IGVtb2RlLAogCQkJCW1p c3NpbmdDb250cmVjUHRyID0geGxvZ3JlYWRlci0+bWlzc2luZ0NvbnRyZWNQdHI7CiAJCQl9 CiAKLQkJCWlmIChyZWFkRmlsZSA+PSAwKQotCQkJewotCQkJCWNsb3NlKHJlYWRGaWxlKTsK LQkJCQlyZWFkRmlsZSA9IC0xOwotCQkJfQorCQkJWExvZ0ZpbGVDbG9zZSgpOwogCiAJCQkv KgogCQkJICogV2Ugb25seSBlbmQgdXAgaGVyZSB3aXRob3V0IGEgbWVzc2FnZSB3aGVuIFhM b2dQYWdlUmVhZCgpCkBAIC0zMjUwLDYgKzMyNjcsMzkgQEAgUmVhZFJlY29yZChYTG9nUHJl ZmV0Y2hlciAqeGxvZ3ByZWZldGNoZXIsIGludCBlbW9kZSwKIAl9CiB9CiAKKy8qCisgKiBJ bnZhbGlkYXRlIHRoZSBXQUwgcmVhZC1haGVhZCBjYWNoZS4KKyAqCisgKiBNdXN0IGJlIGNh bGxlZCBhdCBldmVyeSBwb2ludCB0aGF0IGNsb3NlcyBvciBvdGhlcndpc2UgaW52YWxpZGF0 ZXMgcmVhZEZpbGUsCisgKiBidXQgY2FuIGJlIGNhbGxlZCBhdCBvdGhlciB0aW1lcyB0b28g YW5kIHdpbGwgZm9yY2UgYSByZS1yZWFkIG9mIHRoZSBuZXh0CisgKiBwYWdlLgorICovCitz dGF0aWMgdm9pZAorWExvZ1JlYWRBaGVhZEludmFsaWRhdGUodm9pZCkKK3sKKwlyZWFkQWhl YWRMZW4gPSAwOworfQorCisvKgorICogQ2xvc2UgdGhlIGN1cnJlbnQgV0FMIGZpbGUgYW5k IGludmFsaWRhdGUgdGhlIHJlYWQtYWhlYWQgY2FjaGUuCisgKgorICogSXQgaXMgc3RyaWN0 bHkgc3BlYWtpbmcgbm90IG5lY2Vzc2FyeSB0byBzZXQgcmVhZFNvdXJjZSBhbmQgcmVhZExl biB0bworICogdGhlaXIgaW5pdGlhbCB2YWx1ZXMsIGJ1dCB0aGUgb3JpZ2luYWwgY29kZSBk aWQgdGhhdCwgc28gd2Uga2VlcCBpdCBmb3IKKyAqIG5vdy4KKyAqLworc3RhdGljIHZvaWQK K1hMb2dGaWxlQ2xvc2Uodm9pZCkKK3sKKwlpZiAocmVhZEZpbGUgPj0gMCkKKwl7CisJCWNs b3NlKHJlYWRGaWxlKTsKKwkJcmVhZEZpbGUgPSAtMTsKKwkJcmVhZFNvdXJjZSA9IFhMT0df RlJPTV9BTlk7CisJCXJlYWRMZW4gPSAwOworCQlYTG9nUmVhZEFoZWFkSW52YWxpZGF0ZSgp OworCX0KK30KKwogLyoKICAqIFJlYWQgdGhlIFhMT0cgcGFnZSBjb250YWluaW5nIHRhcmdl dFBhZ2VQdHIgaW50byByZWFkQnVmIChpZiBub3QgcmVhZAogICogYWxyZWFkeSkuICBSZXR1 cm5zIG51bWJlciBvZiBieXRlcyByZWFkLCBpZiB0aGUgcGFnZSBpcyByZWFkIHN1Y2Nlc3Nm dWxseSwKQEAgLTMyODcsNyArMzMzNyw2IEBAIFhMb2dQYWdlUmVhZChYTG9nUmVhZGVyU3Rh dGUgKnhsb2dyZWFkZXIsIFhMb2dSZWNQdHIgdGFyZ2V0UGFnZVB0ciwgaW50IHJlcUxlbiwK IAlpbnQJCQllbW9kZSA9IHByaXZhdGUtPmVtb2RlOwogCXVpbnQzMgkJdGFyZ2V0UGFnZU9m ZjsKIAlYTG9nU2VnTm8JdGFyZ2V0U2VnTm8gUEdfVVNFRF9GT1JfQVNTRVJUU19PTkxZOwot CXNzaXplX3QJCXI7CiAJaW5zdHJfdGltZQlpb19zdGFydDsKIAogCUFzc2VydChBbVN0YXJ0 dXBQcm9jZXNzKCkgfHwgIUlzVW5kZXJQb3N0bWFzdGVyKTsKQEAgLTMzMTYsOSArMzM2NSw3 IEBAIFhMb2dQYWdlUmVhZChYTG9nUmVhZGVyU3RhdGUgKnhsb2dyZWFkZXIsIFhMb2dSZWNQ dHIgdGFyZ2V0UGFnZVB0ciwgaW50IHJlcUxlbiwKIAkJCX0KIAkJfQogCi0JCWNsb3NlKHJl YWRGaWxlKTsKLQkJcmVhZEZpbGUgPSAtMTsKLQkJcmVhZFNvdXJjZSA9IFhMT0dfRlJPTV9B Tlk7CisJCVhMb2dGaWxlQ2xvc2UoKTsKIAl9CiAKIAlYTEJ5dGVUb1NlZyh0YXJnZXRQYWdl UHRyLCByZWFkU2VnTm8sIHdhbF9zZWdtZW50X3NpemUpOwpAQCAtMzM0NiwxMSArMzM5Myw3 IEBAIHJldHJ5OgogCQkJY2FzZSBYTFJFQURfV09VTERCTE9DSzoKIAkJCQlyZXR1cm4gWExS RUFEX1dPVUxEQkxPQ0s7CiAJCQljYXNlIFhMUkVBRF9GQUlMOgotCQkJCWlmIChyZWFkRmls ZSA+PSAwKQotCQkJCQljbG9zZShyZWFkRmlsZSk7Ci0JCQkJcmVhZEZpbGUgPSAtMTsKLQkJ CQlyZWFkTGVuID0gMDsKLQkJCQlyZWFkU291cmNlID0gWExPR19GUk9NX0FOWTsKKwkJCQlY TG9nRmlsZUNsb3NlKCk7CiAJCQkJcmV0dXJuIFhMUkVBRF9GQUlMOwogCQkJY2FzZSBYTFJF QURfU1VDQ0VTUzoKIAkJCQlicmVhazsKQEAgLTMzODMsNDUgKzM0MjYsMTAxIEBAIHJldHJ5 OgogCS8qIFJlYWQgdGhlIHJlcXVlc3RlZCBwYWdlICovCiAJcmVhZE9mZiA9IHRhcmdldFBh Z2VPZmY7CiAKLQkvKiBNZWFzdXJlIEkvTyB0aW1pbmcgd2hlbiByZWFkaW5nIHNlZ21lbnQg Ki8KLQlpb19zdGFydCA9IHBnc3RhdF9wcmVwYXJlX2lvX3RpbWUodHJhY2tfd2FsX2lvX3Rp bWluZyk7Ci0KLQlwZ3N0YXRfcmVwb3J0X3dhaXRfc3RhcnQoV0FJVF9FVkVOVF9XQUxfUkVB RCk7Ci0JciA9IHBnX3ByZWFkKHJlYWRGaWxlLCByZWFkQnVmLCBYTE9HX0JMQ0tTWiwgKHBn b2ZmX3QpIHJlYWRPZmYpOwotCWlmIChyICE9IFhMT0dfQkxDS1NaKQorCS8qCisJICogSWYg dGhlIHJlcXVlc3RlZCBwYWdlIGlzIG5vdCBpbiB0aGUgcmVhZC1haGVhZCBjYWNoZSBmcm9t IGEgcHJldmlvdXMsCisJICogbGFyZ2VyIHJlYWQsIHRoZSBjYWNoZSBpcyBpbnZhbGlkLCBv ciBhbGwgYmxvY2tzIGZyb20gdGhlIGNhY2hlIGlzCisJICogcmVhZDsgZmV0Y2ggYSBsYXJn ZSBibG9jayBmcm9tIGRpc2sgKHVwIHRvIGlvX2NvbWJpbmVfbGltaXQgcGFnZXMpLgorCSAq CisJICogVGhlIGNhY2hlIGlzIGludmFsaWRhdGVkIChzZWUgWExvZ1JlYWRBaGVhZEludmFs aWRhdGUoKSkgYXQgZXZlcnkgcG9pbnQKKwkgKiB0aGF0IGNvdWxkIG1ha2UgcmVhZFNlZ05v IG1lYW4gYSBkaWZmZXJlbnQgdW5kZXJseWluZyBmaWxlLCBzbyBhIGhpdAorCSAqIGhlcmUg aXMgYWx3YXlzIHNhZmUgdG8gdHJ1c3QuCisJICovCisJaWYgKHJlYWRBaGVhZExlbiA8PSAw IHx8CisJCXJlYWRBaGVhZFNlZ05vICE9IHJlYWRTZWdObyB8fAorCQlyZWFkT2ZmIDwgcmVh ZEFoZWFkT2ZmIHx8CisJCXJlYWRPZmYgKyBYTE9HX0JMQ0tTWiA+IHJlYWRBaGVhZE9mZiAr IHJlYWRBaGVhZExlbikKIAl7Ci0JCWNoYXIJCWZuYW1lW01BWEZOQU1FTEVOXTsKLQkJaW50 CQkJc2F2ZV9lcnJubyA9IGVycm5vOworCQl1aW50MzIJCXdhbnRlZDsKKwkJc3NpemVfdAkJ cjsKIAotCQlwZ3N0YXRfcmVwb3J0X3dhaXRfZW5kKCk7CisJCUFzc2VydChyZWFkQWhlYWRC dWYgIT0gTlVMTCk7CisKKwkJLyogUmVhZCBhdCBtb3N0IHRvIHRoZSBlbmQgb2YgdGhlIFdB TCBzZWdtZW50IGFuZCBub3QgYmV5b25kICovCisJCXdhbnRlZCA9ICh1aW50MzIpIHdhbF9z ZWdtZW50X3NpemUgLSB0YXJnZXRQYWdlT2ZmOworCisJCS8qCisJCSAqIElmIHdlIHN0cmVh bSBmcm9tIHRoZSBwcmltYXJ5LCB3ZSBjYW5ub3QgcmVhZCBtb3JlIHRoYW4gd2UgaGF2ZSBp bgorCQkgKiB0aGUgYnVmZmVyLCBzbyBjYXAgdGhlIHJlYWQgYXQgdGhlIG51bWJlciBvZiBi eXRlcyBpbiB0aGUgYnVmZmVyLgorCQkgKi8KKwkJaWYgKHJlYWRTb3VyY2UgPT0gWExPR19G Uk9NX1NUUkVBTSkKKwkJCXdhbnRlZCA9IE1pbih3YW50ZWQsIHJlYWRMZW4pOwogCi0JCS8q IENvdW50IEkvTyBzdGF0cyBvbmx5IGZvciBzdWNjZXNzZnVsIHNob3J0IHJlYWRzICovCi0J CWlmIChyID4gMCkKLQkJCXBnc3RhdF9jb3VudF9pb19vcF90aW1lKElPT0JKRUNUX1dBTCwg SU9DT05URVhUX05PUk1BTCwgSU9PUF9SRUFELAotCQkJCQkJCQkJaW9fc3RhcnQsIDEsIHIp OworCQkvKgorCQkgKiBOZXZlciByZWFkIG1vcmUgYmxvY2tzIHRoYW4gd2hhdCBpb19jb21i aW5lX2xpbWl0IHNheXMgd2Ugc2hvdWxkCisJCSAqIHJlYWQKKwkJICovCisJCXdhbnRlZCA9 IE1pbih3YW50ZWQsIGlvX2NvbWJpbmVfbGltaXQgKiBYTE9HX0JMQ0tTWik7CisKKwkJLyog UmVhZCBhdCBsZWFzdCBvbmUgcGFnZSAqLworCQl3YW50ZWQgPSBNYXgod2FudGVkLCBYTE9H X0JMQ0tTWik7CisKKwkJLyogTWVhc3VyZSBJL08gdGltaW5nIHdoZW4gcmVhZGluZyBzZWdt ZW50ICovCisJCWlvX3N0YXJ0ID0gcGdzdGF0X3ByZXBhcmVfaW9fdGltZSh0cmFja193YWxf aW9fdGltaW5nKTsKKworCQlwZ3N0YXRfcmVwb3J0X3dhaXRfc3RhcnQoV0FJVF9FVkVOVF9X QUxfUkVBRCk7CisJCXIgPSBwZ19wcmVhZChyZWFkRmlsZSwgcmVhZEFoZWFkQnVmLCB3YW50 ZWQsIChwZ29mZl90KSByZWFkT2ZmKTsKKwkJcGdzdGF0X3JlcG9ydF93YWl0X2VuZCgpOwog Ci0JCVhMb2dGaWxlTmFtZShmbmFtZSwgY3VyRmlsZVRMSSwgcmVhZFNlZ05vLCB3YWxfc2Vn bWVudF9zaXplKTsKLQkJaWYgKHIgPCAwKQorCQlpZiAociA8IFhMT0dfQkxDS1NaKQogCQl7 Ci0JCQllcnJubyA9IHNhdmVfZXJybm87Ci0JCQllcmVwb3J0KGVtb2RlX2Zvcl9jb3JydXB0 X3JlY29yZChlbW9kZSwgdGFyZ2V0UGFnZVB0ciArIHJlcUxlbiksCi0JCQkJCShlcnJjb2Rl X2Zvcl9maWxlX2FjY2VzcygpLAotCQkJCQkgZXJybXNnKCJjb3VsZCBub3QgcmVhZCBmcm9t IFdBTCBzZWdtZW50ICVzLCBMU04gJVgvJTA4WCwgb2Zmc2V0ICV1OiAlbSIsCi0JCQkJCQkJ Zm5hbWUsIExTTl9GT1JNQVRfQVJHUyh0YXJnZXRQYWdlUHRyKSwKLQkJCQkJCQlyZWFkT2Zm KSkpOworCQkJY2hhcgkJZm5hbWVbTUFYRk5BTUVMRU5dOworCQkJaW50CQkJc2F2ZV9lcnJu byA9IGVycm5vOworCisJCQkvKiBDb3VudCBJL08gc3RhdHMgb25seSBmb3Igc3VjY2Vzc2Z1 bCBzaG9ydCByZWFkcyAqLworCQkJaWYgKHIgPiAwKQorCQkJCXBnc3RhdF9jb3VudF9pb19v cF90aW1lKElPT0JKRUNUX1dBTCwgSU9DT05URVhUX05PUk1BTCwgSU9PUF9SRUFELAorCQkJ CQkJCQkJCWlvX3N0YXJ0LCAxLCByKTsKKworCQkJWExvZ0ZpbGVOYW1lKGZuYW1lLCBjdXJG aWxlVExJLCByZWFkU2VnTm8sIHdhbF9zZWdtZW50X3NpemUpOworCQkJaWYgKHIgPCAwKQor CQkJeworCQkJCWVycm5vID0gc2F2ZV9lcnJubzsKKwkJCQllcmVwb3J0KGVtb2RlX2Zvcl9j b3JydXB0X3JlY29yZChlbW9kZSwgdGFyZ2V0UGFnZVB0ciArIHJlcUxlbiksCisJCQkJCQko ZXJyY29kZV9mb3JfZmlsZV9hY2Nlc3MoKSwKKwkJCQkJCSBlcnJtc2coImNvdWxkIG5vdCBy ZWFkIGZyb20gV0FMIHNlZ21lbnQgJXMsIExTTiAlWC8lMDhYLCBvZmZzZXQgJXU6ICVtIiwK KwkJCQkJCQkJZm5hbWUsIExTTl9GT1JNQVRfQVJHUyh0YXJnZXRQYWdlUHRyKSwKKwkJCQkJ CQkJcmVhZE9mZikpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQllcmVwb3J0KGVtb2RlX2Zvcl9j b3JydXB0X3JlY29yZChlbW9kZSwgdGFyZ2V0UGFnZVB0ciArIHJlcUxlbiksCisJCQkJCQko ZXJyY29kZShFUlJDT0RFX0RBVEFfQ09SUlVQVEVEKSwKKwkJCQkJCSBlcnJtc2coImNvdWxk IG5vdCByZWFkIGZyb20gV0FMIHNlZ21lbnQgJXMsIExTTiAlWC8lMDhYLCBvZmZzZXQgJXU6 IHJlYWQgJXpkIG9mICV6dSIsCisJCQkJCQkJCWZuYW1lLCBMU05fRk9STUFUX0FSR1ModGFy Z2V0UGFnZVB0ciksCisJCQkJCQkJCXJlYWRPZmYsIHIsIChTaXplKSB3YW50ZWQpKSk7CisK KwkJCS8qCisJCQkgKiBOZWVkIHRvIGludmFsaWRhdGUgdGhlIGNhY2hlIHNvIHRoYXQgbmV4 dCByZWFkIHdpbGwgcmVhZCBpbiBhCisJCQkgKiBjb21wbGV0ZSBwYWdlLiBUaGUgY3VycmVu dCBwYWdlIGlzIG5vdCBjb21wbGV0ZSwgc28gdHJ5aW5nIHRvCisJCQkgKiB1c2UgaXQgaW4g YSBsYXRlciBjYWxsIG1pZ2h0IGNhdXNlIGEgY29ycnVwdGVkIHBhZ2UgdG8gYmUgdXNlZC4K KwkJCSAqLworCQkJWExvZ1JlYWRBaGVhZEludmFsaWRhdGUoKTsKKwkJCWdvdG8gbmV4dF9y ZWNvcmRfaXNfaW52YWxpZDsKIAkJfQotCQllbHNlCi0JCQllcmVwb3J0KGVtb2RlX2Zvcl9j b3JydXB0X3JlY29yZChlbW9kZSwgdGFyZ2V0UGFnZVB0ciArIHJlcUxlbiksCi0JCQkJCShl cnJjb2RlKEVSUkNPREVfREFUQV9DT1JSVVBURUQpLAotCQkJCQkgZXJybXNnKCJjb3VsZCBu b3QgcmVhZCBmcm9tIFdBTCBzZWdtZW50ICVzLCBMU04gJVgvJTA4WCwgb2Zmc2V0ICV1OiBy ZWFkICV6ZCBvZiAlenUiLAotCQkJCQkJCWZuYW1lLCBMU05fRk9STUFUX0FSR1ModGFyZ2V0 UGFnZVB0ciksCi0JCQkJCQkJcmVhZE9mZiwgciwgKFNpemUpIFhMT0dfQkxDS1NaKSkpOwot CQlnb3RvIG5leHRfcmVjb3JkX2lzX2ludmFsaWQ7CisKKwkJcGdzdGF0X2NvdW50X2lvX29w X3RpbWUoSU9PQkpFQ1RfV0FMLCBJT0NPTlRFWFRfTk9STUFMLCBJT09QX1JFQUQsCisJCQkJ CQkJCWlvX3N0YXJ0LCAxLCByKTsKKworCQlyZWFkQWhlYWRTZWdObyA9IHJlYWRTZWdObzsK KwkJcmVhZEFoZWFkT2ZmID0gcmVhZE9mZjsKKwkJcmVhZEFoZWFkTGVuID0gcjsKIAl9Ci0J cGdzdGF0X3JlcG9ydF93YWl0X2VuZCgpOwogCi0JcGdzdGF0X2NvdW50X2lvX29wX3RpbWUo SU9PQkpFQ1RfV0FMLCBJT0NPTlRFWFRfTk9STUFMLCBJT09QX1JFQUQsCi0JCQkJCQkJaW9f c3RhcnQsIDEsIHIpOworCS8qCisJICogV2UgY29weSBvdXQgdGhlIHBhZ2UgZnJvbSB0aGUg Y2FjaGUgc2luY2UgcmVhZEJ1ZiBpcyBhbGxvY2F0ZWQKKwkgKiBlbHNld2hlcmUuIEl0IHdh cyBjb25zaWRlcmVkIHBvaW50aW5nIGludG8gdGhlIGNhY2hlLCBidXQgdGhhdCBzZWVtcwor CSAqIGxpa2UgYW4gdW5uZWNlc3NhcnkgcmlzayBhbmQgbW9yZSB3b3JrIHRoYW4gaXQncyB3 b3J0aC4KKwkgKi8KKwltZW1jcHkocmVhZEJ1ZiwgcmVhZEFoZWFkQnVmICsgKHJlYWRPZmYg LSByZWFkQWhlYWRPZmYpLCBYTE9HX0JMQ0tTWik7CiAKIAlBc3NlcnQodGFyZ2V0U2VnTm8g PT0gcmVhZFNlZ05vKTsKIAlBc3NlcnQodGFyZ2V0UGFnZU9mZiA9PSByZWFkT2ZmKTsKQEAg LTM0OTEsMTEgKzM1OTAsNyBAQCBuZXh0X3JlY29yZF9pc19pbnZhbGlkOgogCiAJbGFzdFNv dXJjZUZhaWxlZCA9IHRydWU7CiAKLQlpZiAocmVhZEZpbGUgPj0gMCkKLQkJY2xvc2UocmVh ZEZpbGUpOwotCXJlYWRGaWxlID0gLTE7Ci0JcmVhZExlbiA9IDA7Ci0JcmVhZFNvdXJjZSA9 IFhMT0dfRlJPTV9BTlk7CisJWExvZ0ZpbGVDbG9zZSgpOwogCiAJLyogSW4gc3RhbmRieS1t b2RlLCBrZWVwIHRyeWluZyAqLwogCWlmIChTdGFuZGJ5TW9kZSkKQEAgLTM3NzMsMTEgKzM4 NjgsOCBAQCBXYWl0Rm9yV0FMVG9CZWNvbWVBdmFpbGFibGUoWExvZ1JlY1B0ciBSZWNQdHIs IGJvb2wgcmFuZEFjY2VzcywKIAkJCQlBc3NlcnQoIVdhbFJjdlN0cmVhbWluZygpKTsKIAog CQkJCS8qIENsb3NlIGFueSBvbGQgZmlsZSB3ZSBtaWdodCBoYXZlIG9wZW4uICovCi0JCQkJ aWYgKHJlYWRGaWxlID49IDApCi0JCQkJewotCQkJCQljbG9zZShyZWFkRmlsZSk7Ci0JCQkJ CXJlYWRGaWxlID0gLTE7Ci0JCQkJfQorCQkJCVhMb2dGaWxlQ2xvc2UoKTsKKwogCQkJCS8q IFJlc2V0IGN1ckZpbGVUTEkgaWYgcmFuZG9tIGZldGNoLiAqLwogCQkJCWlmIChyYW5kQWNj ZXNzKQogCQkJCQljdXJGaWxlVExJID0gMDsKLS0gCjIuNDMuMAoK --------------wSmNkAHoSH9h7H50epPuMRzQ--