Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gPn7S-0003VY-M9 for pgsql-hackers@arkaria.postgresql.org; Thu, 22 Nov 2018 11:26:02 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1gPn7R-00073D-C3 for pgsql-hackers@arkaria.postgresql.org; Thu, 22 Nov 2018 11:26:01 +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_SHA1:256) (Exim 4.89) (envelope-from ) id 1gPn7R-00072b-34 for pgsql-hackers@lists.postgresql.org; Thu, 22 Nov 2018 11:26:01 +0000 Received: from mx0a-00296801.pphosted.com ([148.163.150.38]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gPn7M-0006z7-RU for pgsql-hackers@postgresql.org; Thu, 22 Nov 2018 11:26:00 +0000 Received: from pps.filterd (m0114582.ppops.net [127.0.0.1]) by mx0a-00296801.pphosted.com (8.16.0.27/8.16.0.27) with SMTP id wAMBM64v006578 for ; Thu, 22 Nov 2018 11:25:51 GMT Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by mx0a-00296801.pphosted.com with ESMTP id 2nt9r54qts-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Thu, 22 Nov 2018 11:25:51 +0000 Received: by mail-wr1-f69.google.com with SMTP id u15-v6so8281653wrr.5 for ; Thu, 22 Nov 2018 03:25:50 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=rRe8n0dKLNF7p+mNm/1o+TMePOnuzYBZdO2NuWQUnhQ=; b=nbK29x/gRWzLKawP6ArNz6AmgnyISWu6jv8qaG78wCO5OY3x8rpmXzD1cMBTQ5p+gC Y3s8ebwyZpgJOVwmmu5d6a6kL++uHrhfCFz6ejnKJEy+mhyGr/y6cpr9bocVZueytKsX 9OfdC7HXJgvWAhWQsFzVOIQrB6q2gGwavjR+Sdpv5BXwD+baubigx89Qu617osacCTAf 0otGeqIsFCQMbNCULMT00NEvO211foDeurd7SMlGDJjFR/IEM0/S+i2tcCwP2SHw4iq1 paJ7mQP/BcCbPjKzrKJ7dSKPAGENmArL3S7ouwIfpVaO4bUENYnwp5NrDOMak2q8hvd+ xtmQ== X-Gm-Message-State: AA+aEWaRBaZZkSDnFYDPYXRd2NdWgno5niAZVyebDPdR45ppetghBGv2 5cEu3d/vlmCsiq12jZRMYe1tRZ7VDKi/BhzUVPciGrJpylNYs0Z3C/vwKmfuEFsrxGyJBwY3f6/ eXe+2e706RyeuqUwYoxpfjYxl/xW3Jp+pXPP0aHQZ6jMpX0mvTuKUSQZkMlgtP/tKeA== X-Received: by 2002:adf:fc09:: with SMTP id i9mr8950178wrr.299.1542885949068; Thu, 22 Nov 2018 03:25:49 -0800 (PST) X-Google-Smtp-Source: AFSGD/U3cgBKmXAoYYwN5sBPJ2KmKHj9LYFx5Dhq4aDiYF7agxXAh/QuRDFSodTkhSPivZU0VJutFynaccPiW09jCcc= X-Received: by 2002:adf:fc09:: with SMTP id i9mr8950165wrr.299.1542885948802; Thu, 22 Nov 2018 03:25:48 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Haozhou Wang Date: Thu, 22 Nov 2018 19:25:37 +0800 Message-ID: Subject: Re: Control your disk usage in PG: Introduction to Disk Quota Extension To: robertmhaas@gmail.com Cc: pgsql-hackers@postgresql.org, tomas.vondra@2ndquadrant.com Content-Type: multipart/mixed; boundary="000000000000e886be057b3f20fa" X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-11-22_07:,, signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=3 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1811220105 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --000000000000e886be057b3f20fa Content-Type: multipart/alternative; boundary="000000000000e886bb057b3f20f8" --000000000000e886bb057b3f20f8 Content-Type: text/plain; charset="UTF-8" Thank you very much for your review. We refactored our patch with new names and comments. For ReadBufferExtended hook, yes, Readbuffer with P_NEW will then call smgrextend. But in smgrextend, we cannot get the oid of a relation, and it will take some time to get the oid via smgrrelation. We would like to add a hook just before the smgrextend to get the oid and avoid use RelidByRelfilenode(). New patch is attached in the attachment. Thank a lot! Regards, Haozhou On Wed, Nov 21, 2018 at 10:48 PM Robert Haas wrote: > On Tue, Nov 20, 2018 at 2:20 AM Haozhou Wang wrote: > > We prepared a patch that includes the hook points. And such hook points > are needed for disk quota extension. > > There are two hooks. > > One is SmgrStat_hook. It's used to perform ad-hoc logic in storage when > doing smgr create/extend/truncate in general. As for disk quota extension, > this hook is used to detect active tables(new created tables, tables > extending new blocks, or tables being truncated) > > The other is BufferExtendCheckPerms_hook. It's used to perform ad-hoc > logic when buffer extend a new block. Since ReadBufferExtended is a hot > function, we call this hook only when blockNum == P_NEW. As for disk quota > extension, this hook is used to do query enforcement during the query is > loading data. > > > > Any comments are appreciated. > > +1 for adding some hooks to support this kind of thing, but I think > the names you've chosen are not very good. The hook name should > describe the place from which it is called, not the purpose for which > one imagines that it will be used, because somebody else might imagine > another use. Both BufferExtendCheckPerms_hook_type and > SmgrStat_hook_type are imagining that they know what the hook does - > CheckPerms in the first case and Stat in the second case. > > For this particular purpose, I don't immediately see why you need a > hook in both places. If ReadBuffer is called with P_NEW, aren't we > guaranteed to end up in smgrextend()? > > -- > Robert Haas > EnterpriseDB: http://www.enterprisedb.com > The Enterprise PostgreSQL Company > --000000000000e886bb057b3f20f8 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Thank you very much for your review.
We refactore= d our patch with new names and comments.

For ReadBufferExtended hook, yes, Readbuffer wi= th P_NEW will then call smgrextend.

But in smgrext= end, we cannot get the oid of a relation, and it will take some time to get= the oid via smgrrelation.
We would like to add a hook just befor= e the smgrextend to get the oid and avoid use=C2=A0RelidByRelfilenode().

New patch is attached in the attachment.
Thank a= lot!

Regards,
Haozhou


On Wed, Nov 21, 20= 18 at 10:48 PM Robert Haas <rob= ertmhaas@gmail.com> wrote:
O= n Tue, Nov 20, 2018 at 2:20 AM Haozhou Wang <hawang@pivotal.io> wrote:
> We prepared a patch that includes the hook points. And such hook point= s are needed for disk quota extension.
> There are two hooks.
> One is SmgrStat_hook. It's used to perform ad-hoc logic in storage= when doing smgr create/extend/truncate in general. As for disk quota exten= sion, this hook is used to detect active tables(new created tables, tables = extending new blocks, or tables being truncated)
> The other is BufferExtendCheckPerms_hook. It's used to perform ad-= hoc logic when buffer extend a new block. Since ReadBufferExtended is a hot= function, we call this hook only when blockNum =3D=3D P_NEW. As=C2=A0 for = disk quota extension, this hook is used to do query enforcement during the = query is loading data.
>
> Any comments are appreciated.

+1 for adding some hooks to support this kind of thing, but I think
the names you've chosen are not very good.=C2=A0 The hook name should describe the place from which it is called, not the purpose for which
one imagines that it will be used, because somebody else might imagine
another use.=C2=A0 Both BufferExtendCheckPerms_hook_type and
SmgrStat_hook_type are imagining that they know what the hook does -
CheckPerms in the first case and Stat in the second case.

For this particular purpose, I don't immediately see why you need a
hook in both places.=C2=A0 If ReadBuffer is called with P_NEW, aren't w= e
guaranteed to end up in smgrextend()?

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


--000000000000e886bb057b3f20f8-- --000000000000e886be057b3f20fa Content-Type: application/octet-stream; name="disk_quota_hooks_v2.patch" Content-Disposition: attachment; filename="disk_quota_hooks_v2.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_josidiru0 RnJvbSAzZDI3NWM3OGIzMDRiMzA4ZDI4OGJkMjI3ZjZkY2FiNDVkYzVmNTk1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIdWJlcnQgWmhhbmcgPGh1YmVydHpoYW5nQGFwYWNoZS5vcmc+ CkRhdGU6IFR1ZSwgNiBOb3YgMjAxOCAwNjo1MToyMiArMDAwMApTdWJqZWN0OiBbUEFUQ0hdIEFk ZCBob29rcyBmb3IgZGlza3F1b3RhIGV4dGVuc2lvbi4KCkFkZCBSZWFkQnVmZmVyRXh0ZW5kX2hv b2soKSBhbmQgc21ncipfaG9vaygpCmhvb2sgcG9pbnRzIHRvIGV4dGVuZCBsb2dpYyBvZiBzdG9y YWdlCm1hbmFnZW1lbnQuCgpDby1hdXRob3JlZC1ieTogSGFvemhvdSBXYW5nIDxoYXdhbmdAcGl2 b3RhbC5pbz4KQ28tYXV0aG9yZWQtYnk6IEh1YmVydCBaaGFuZyA8aHpoYW5nQHBpdm90YWwuaW8+ CkNvLWF1dGhvcmVkLWJ5OiBIYW8gV3UgPGdmcGhvZW5peDc4QGdtYWlsLmNvbT4KLS0tCiBzcmMv YmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYyB8IDE0ICsrKysrKysrKysrKysrCiBzcmMv YmFja2VuZC9zdG9yYWdlL3NtZ3Ivc21nci5jICAgICB8IDMzICsrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKwogc3JjL2luY2x1ZGUvc3RvcmFnZS9idWZtZ3IuaCAgICAgICAgfCAxMCAr KysrKysrKysrCiBzcmMvaW5jbHVkZS9zdG9yYWdlL3NtZ3IuaCAgICAgICAgICB8IDE4ICsrKysr KysrKysrKysrKysrKwogNCBmaWxlcyBjaGFuZ2VkLCA3NSBpbnNlcnRpb25zKCspCgpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvYnVmbWdyLmMgYi9zcmMvYmFja2VuZC9z dG9yYWdlL2J1ZmZlci9idWZtZ3IuYwppbmRleCAwMWVhYmU1NzA2Li41NDk5NDk1NTA2IDEwMDY0 NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYworKysgYi9zcmMvYmFj a2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYwpAQCAtMTA0LDYgKzEwNCwxMyBAQCB0eXBlZGVm IHN0cnVjdCBDa3B0VHNTdGF0dXMKIAlpbnQJCQlpbmRleDsKIH0gQ2twdFRzU3RhdHVzOwogCisv KgorICogSG9vayBmb3IgcGx1Z2lucyB0byBjaGVjayBwZXJtaXNzaW9ucyB3aGVuIGRvaW5nIGEg YnVmZmVyIGV4dGVuZC4KKyAqIE9uZSBleGFtcGxlIGlzIHRvIGNoZWNrIHdoZXRoZXIgdGhlcmUg aXMgYWRkaXRpb25hbCBkaXNrIHF1b3RhIGZvcgorICogdGhlIHRhYmxlIHRvIGJlIGluc2VydGVk LgorICovCitSZWFkQnVmZmVyRXh0ZW5kZWRfaG9va190eXBlIFJlYWRCdWZmZXJFeHRlbmRlZF9o b29rID0gTlVMTDsKKwogLyogR1VDIHZhcmlhYmxlcyAqLwogYm9vbAkJemVyb19kYW1hZ2VkX3Bh Z2VzID0gZmFsc2U7CiBpbnQJCQliZ3dyaXRlcl9scnVfbWF4cGFnZXMgPSAxMDA7CkBAIC02NjEs NiArNjY4LDEzIEBAIFJlYWRCdWZmZXJFeHRlbmRlZChSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVy IGZvcmtOdW0sIEJsb2NrTnVtYmVyIGJsb2NrTnVtLAogCSAqIG1pc3MuCiAJICovCiAJcGdzdGF0 X2NvdW50X2J1ZmZlcl9yZWFkKHJlbG4pOworCisJLyogaG9vayBmdW5jdGlvbiBmb3IgZG9pbmcg YSBidWZmZXIgZXh0ZW5kICovCisJaWYgKGJsb2NrTnVtID09IFBfTkVXICYmIFJlYWRCdWZmZXJF eHRlbmRlZF9ob29rKQorCXsKKwkJKCpSZWFkQnVmZmVyRXh0ZW5kZWRfaG9vaykocmVsbiwgZm9y a051bSwgYmxvY2tOdW0sIG1vZGUsIHN0cmF0ZWd5KTsKKwl9CisKIAlidWYgPSBSZWFkQnVmZmVy X2NvbW1vbihyZWxuLT5yZF9zbWdyLCByZWxuLT5yZF9yZWwtPnJlbHBlcnNpc3RlbmNlLAogCQkJ CQkJCWZvcmtOdW0sIGJsb2NrTnVtLCBtb2RlLCBzdHJhdGVneSwgJmhpdCk7CiAJaWYgKGhpdCkK ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9zbWdyLmMgYi9zcmMvYmFja2Vu ZC9zdG9yYWdlL3NtZ3Ivc21nci5jCmluZGV4IDE4OTM0MmVmODYuLmZhMzZhMThlMTUgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9zbWdyLmMKKysrIGIvc3JjL2JhY2tlbmQv c3RvcmFnZS9zbWdyL3NtZ3IuYwpAQCAtOTAsNiArOTAsMTYgQEAgc3RhdGljIGNvbnN0IGZfc21n ciBzbWdyc3dbXSA9IHsKIAogc3RhdGljIGNvbnN0IGludCBOU21nciA9IGxlbmd0aG9mKHNtZ3Jz dyk7CiAKKy8qCisgKiBIb29rIGZvciBwbHVnaW5zIHRvIGV4dGVuZCBzbWdyIGZ1bmN0aW9ucy4K KyAqIGZvciBleGFtcGxlLCBjb2xsZWN0IHN0YXRpc3RpY3MgZnJvbSBzbWdyIGZ1bmN0aW9ucwor ICogdmlhIHJlY29yZGluZyB0aGUgYWN0aXZlIHJlbGZpbGVub2RlIGluZm9ybWF0aW9uLgorICov CitzbWdyY3JlYXRlX2hvb2tfdHlwZSBzbWdyY3JlYXRlX2hvb2sgPSBOVUxMOworc21ncmV4dGVu ZF9ob29rX3R5cGUgc21ncmV4dGVuZF9ob29rID0gTlVMTDsKK3NtZ3J0cnVuY2F0ZV9ob29rX3R5 cGUgc21ncnRydW5jYXRlX2hvb2sgPSBOVUxMOworc21ncmRvdW5saW5rYWxsX2hvb2tfdHlwZSBz bWdyZG91bmxpbmthbGxfaG9vayA9IE5VTEw7CisKIAogLyoKICAqIEVhY2ggYmFja2VuZCBoYXMg YSBoYXNodGFibGUgdGhhdCBzdG9yZXMgYWxsIGV4dGFudCBTTWdyUmVsYXRpb24gb2JqZWN0cy4K QEAgLTM5Nyw2ICs0MDcsMTEgQEAgc21ncmNyZWF0ZShTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051 bWJlciBmb3JrbnVtLCBib29sIGlzUmVkbykKIAlpZiAoaXNSZWRvICYmIHJlbG4tPm1kX251bV9v cGVuX3NlZ3NbZm9ya251bV0gPiAwKQogCQlyZXR1cm47CiAKKwlpZiAoc21ncmNyZWF0ZV9ob29r KQorCXsKKwkJKCpzbWdyY3JlYXRlX2hvb2spKHJlbG4sIGZvcmtudW0sIGlzUmVkbyk7CisJfQor CiAJLyoKIAkgKiBXZSBtYXkgYmUgdXNpbmcgdGhlIHRhcmdldCB0YWJsZSBzcGFjZSBmb3IgdGhl IGZpcnN0IHRpbWUgaW4gdGhpcwogCSAqIGRhdGFiYXNlLCBzbyBjcmVhdGUgYSBwZXItZGF0YWJh c2Ugc3ViZGlyZWN0b3J5IGlmIG5lZWRlZC4KQEAgLTQxMSw2ICs0MjYsNyBAQCBzbWdyY3JlYXRl KFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sIGJvb2wgaXNSZWRvKQogCQkJ CQkJCWlzUmVkbyk7CiAKIAlzbWdyc3dbcmVsbi0+c21ncl93aGljaF0uc21ncl9jcmVhdGUocmVs biwgZm9ya251bSwgaXNSZWRvKTsKKwogfQogCiAvKgpAQCAtNDkyLDYgKzUwOCwxMSBAQCBzbWdy ZG91bmxpbmthbGwoU01nclJlbGF0aW9uICpyZWxzLCBpbnQgbnJlbHMsIGJvb2wgaXNSZWRvKQog CWlmIChucmVscyA9PSAwKQogCQlyZXR1cm47CiAKKwlpZiAoc21ncmRvdW5saW5rYWxsX2hvb2sp CisJeworCQkoKnNtZ3Jkb3VubGlua2FsbF9ob29rKShyZWxzLCBucmVscywgaXNSZWRvKTsKKwl9 CisKIAkvKgogCSAqIGNyZWF0ZSBhbiBhcnJheSB3aGljaCBjb250YWlucyBhbGwgcmVsYXRpb25z IHRvIGJlIGRyb3BwZWQsIGFuZCBjbG9zZQogCSAqIGVhY2ggcmVsYXRpb24ncyBmb3JrcyBhdCB0 aGUgc21nciBsZXZlbCB3aGlsZSBhdCBpdApAQCAtNjE1LDggKzYzNiwxNCBAQCB2b2lkCiBzbWdy ZXh0ZW5kKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sIEJsb2NrTnVtYmVy IGJsb2NrbnVtLAogCQkgICBjaGFyICpidWZmZXIsIGJvb2wgc2tpcEZzeW5jKQogeworCWlmIChz bWdyZXh0ZW5kX2hvb2spCisJeworCQkoKnNtZ3JleHRlbmRfaG9vaykocmVsbiwgZm9ya251bSwg YmxvY2tudW0sIGJ1ZmZlciwgc2tpcEZzeW5jKTsKKwl9CisKIAlzbWdyc3dbcmVsbi0+c21ncl93 aGljaF0uc21ncl9leHRlbmQocmVsbiwgZm9ya251bSwgYmxvY2tudW0sCiAJCQkJCQkJCQkJIGJ1 ZmZlciwgc2tpcEZzeW5jKTsKKwogfQogCiAvKgpAQCAtNjk4LDYgKzcyNSwxMSBAQCBzbWdybmJs b2NrcyhTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtKQogdm9pZAogc21ncnRy dW5jYXRlKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sIEJsb2NrTnVtYmVy IG5ibG9ja3MpCiB7CisJaWYgKHNtZ3J0cnVuY2F0ZV9ob29rKQorCXsKKwkJKCpzbWdydHJ1bmNh dGVfaG9vaykocmVsbiwgZm9ya251bSwgbmJsb2Nrcyk7CisJfQorCiAJLyoKIAkgKiBHZXQgcmlk IG9mIGFueSBidWZmZXJzIGZvciB0aGUgYWJvdXQtdG8tYmUtZGVsZXRlZCBibG9ja3MuIGJ1Zm1n ciB3aWxsCiAJICoganVzdCBkcm9wIHRoZW0gd2l0aG91dCBib3RoZXJpbmcgdG8gd3JpdGUgdGhl IGNvbnRlbnRzLgpAQCAtNzIwLDYgKzc1Miw3IEBAIHNtZ3J0cnVuY2F0ZShTTWdyUmVsYXRpb24g cmVsbiwgRm9ya051bWJlciBmb3JrbnVtLCBCbG9ja051bWJlciBuYmxvY2tzKQogCSAqIERvIHRo ZSB0cnVuY2F0aW9uLgogCSAqLwogCXNtZ3Jzd1tyZWxuLT5zbWdyX3doaWNoXS5zbWdyX3RydW5j YXRlKHJlbG4sIGZvcmtudW0sIG5ibG9ja3MpOworCiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zcmMv aW5jbHVkZS9zdG9yYWdlL2J1Zm1nci5oIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9idWZtZ3IuaApp bmRleCAzY2NlMzkwNmEwLi5mMWRjYzc3YmY3IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9zdG9y YWdlL2J1Zm1nci5oCisrKyBiL3NyYy9pbmNsdWRlL3N0b3JhZ2UvYnVmbWdyLmgKQEAgLTE1OSw2 ICsxNTksMTYgQEAgZXh0ZXJuIFBHRExMSU1QT1JUIGludDMyICpMb2NhbFJlZkNvdW50OwogICov CiAjZGVmaW5lIEJ1ZmZlckdldFBhZ2UoYnVmZmVyKSAoKFBhZ2UpQnVmZmVyR2V0QmxvY2soYnVm ZmVyKSkKIAorLyoKKyAqIEhvb2sgZm9yIHBsdWdpbnMgdG8gYWRkIGV4dGVybmFsIGxvZ2ljIHdo ZW4gZG9pbmcgYSBidWZmZXIgZXh0ZW5kLgorICogT25lIGV4YW1wbGUgaXMgdG8gY2hlY2sgd2hl dGhlciB0aGVyZSBpcyBhZGRpdGlvbmFsIGRpc2sgcXVvdGEgZm9yCisgKiB0aGUgdGFibGUgdG8g YmUgaW5zZXJ0ZWQuCisgKi8KK3R5cGVkZWYgYm9vbCAoKlJlYWRCdWZmZXJFeHRlbmRlZF9ob29r X3R5cGUpIChSZWxhdGlvbiByZWxuLAorCQkJCQlGb3JrTnVtYmVyIGZvcmtOdW0sIEJsb2NrTnVt YmVyIGJsb2NrTnVtLAorCQkJCQlSZWFkQnVmZmVyTW9kZSBtb2RlLCBCdWZmZXJBY2Nlc3NTdHJh dGVneSBzdHJhdGVneSk7CitleHRlcm4gUEdETExJTVBPUlQgUmVhZEJ1ZmZlckV4dGVuZGVkX2hv b2tfdHlwZSBSZWFkQnVmZmVyRXh0ZW5kZWRfaG9vazsKKwogLyoKICAqIHByb3RvdHlwZXMgZm9y IGZ1bmN0aW9ucyBpbiBidWZtZ3IuYwogICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9zdG9y YWdlL3NtZ3IuaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc21nci5oCmluZGV4IGM4NDNiYmM5Njku LmQwNzBiM2Q1NzMgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc21nci5oCisrKyBi L3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc21nci5oCkBAIC0xNDQsNSArMTQ0LDIzIEBAIGV4dGVybiB2 b2lkIFJlbWVtYmVyRnN5bmNSZXF1ZXN0KFJlbEZpbGVOb2RlIHJub2RlLCBGb3JrTnVtYmVyIGZv cmtudW0sCiBleHRlcm4gdm9pZCBGb3JnZXRSZWxhdGlvbkZzeW5jUmVxdWVzdHMoUmVsRmlsZU5v ZGUgcm5vZGUsIEZvcmtOdW1iZXIgZm9ya251bSk7CiBleHRlcm4gdm9pZCBGb3JnZXREYXRhYmFz ZUZzeW5jUmVxdWVzdHMoT2lkIGRiaWQpOwogZXh0ZXJuIHZvaWQgRHJvcFJlbGF0aW9uRmlsZXMo UmVsRmlsZU5vZGUgKmRlbHJlbHMsIGludCBuZGVscmVscywgYm9vbCBpc1JlZG8pOworLyoKKyAq IEhvb2sgZm9yIHBsdWdpbnMgdG8gZXh0ZW5kIHNtZ3IgZnVuY3Rpb25zLgorICogZm9yIGV4YW1w bGUsIGNvbGxlY3Qgc3RhdGlzdGljcyBmcm9tIHNtZ3IgZnVuY3Rpb25zCisgKiB2aWEgcmVjb3Jk aW5nIHRoZSBhY3RpdmUgcmVsZmlsZW5vZGUgaW5mb3JtYXRpb24uCisgKi8KK3R5cGVkZWYgdm9p ZCAoKnNtZ3JjcmVhdGVfaG9va190eXBlKShTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBm b3JrbnVtLAorCQkJCQkJCQkJIGJvb2wgaXNSZWRvKTsKK2V4dGVybiBQR0RMTElNUE9SVCBzbWdy Y3JlYXRlX2hvb2tfdHlwZSBzbWdyY3JlYXRlX2hvb2s7Cit0eXBlZGVmIHZvaWQgKCpzbWdyZXh0 ZW5kX2hvb2tfdHlwZSkoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwKKwkJ CQkJCQkJCSBCbG9ja051bWJlciBibG9ja251bSwKKwkJCQkJCQkJCSBjaGFyICpidWZmZXIsIGJv b2wgc2tpcEZzeW5jKTsKK2V4dGVybiBQR0RMTElNUE9SVCBzbWdyZXh0ZW5kX2hvb2tfdHlwZSBz bWdyZXh0ZW5kX2hvb2s7Cit0eXBlZGVmIHZvaWQgKCpzbWdydHJ1bmNhdGVfaG9va190eXBlKShT TWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtLAorCQkJCQkJCQkJICAgQmxvY2tO dW1iZXIgbmJsb2Nrcyk7CitleHRlcm4gUEdETExJTVBPUlQgc21ncnRydW5jYXRlX2hvb2tfdHlw ZSBzbWdydHJ1bmNhdGVfaG9vazsKK3R5cGVkZWYgdm9pZCAoKnNtZ3Jkb3VubGlua2FsbF9ob29r X3R5cGUpKFNNZ3JSZWxhdGlvbiAqcmVscywgaW50IG5yZWxzLAorCQkJCQkJCQkJCSAgYm9vbCBp c1JlZG8pOworZXh0ZXJuIFBHRExMSU1QT1JUIHNtZ3Jkb3VubGlua2FsbF9ob29rX3R5cGUgc21n cmRvdW5saW5rYWxsX2hvb2s7CiAKICNlbmRpZgkJCQkJCQkvKiBTTUdSX0ggKi8KLS0gCjIuMTYu MgoK --000000000000e886be057b3f20fa--