X-Original-To: pgsql-hackers-postgresql.org@localhost.postgresql.org Received: from localhost (av.hub.org [200.46.204.144]) by postgresql.org (Postfix) with ESMTP id 652659DCC6B for ; Mon, 28 Nov 2005 23:53:51 -0400 (AST) Received: from postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 03267-09 for ; Mon, 28 Nov 2005 23:53:54 -0400 (AST) X-Greylist: from auto-whitelisted by SQLgrey- Received: from linuxworld.com.au (unknown [203.34.46.50]) by postgresql.org (Postfix) with ESMTP id F0F869DCC62 for ; Mon, 28 Nov 2005 23:53:45 -0400 (AST) Received: from linuxworld.com.au (IDENT:swm@localhost.localdomain [127.0.0.1]) by linuxworld.com.au (8.13.2/8.13.2) with ESMTP id jAT3rbr2018261; Tue, 29 Nov 2005 14:53:37 +1100 Received: from localhost (swm@localhost) by linuxworld.com.au (8.13.2/8.13.2/Submit) with ESMTP id jAT3rapU018258; Tue, 29 Nov 2005 14:53:36 +1100 Date: Tue, 29 Nov 2005 14:53:36 +1100 (EST) From: Gavin Sherry To: Qingqing Zhou cc: pgsql-hackers@postgresql.org Subject: Re: ice-broker scan thread In-Reply-To: Message-ID: References: MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="583741998-61783486-1133236274=:18112" Content-ID: X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, score=0 required=5 tests=[none] X-Spam-Score: 0 X-Spam-Level: X-Archive-Number: 200511/1449 X-Sequence-Number: 76731 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. --583741998-61783486-1133236274=:18112 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII Content-ID: On Mon, 28 Nov 2005, Qingqing Zhou wrote: > > I am considering add an "ice-broker scan thread" to accelerate PostgreSQL > sequential scan IO speed. The basic idea of this thread is just like the > "read-ahead" method, but the difference is this one does not read the data > into shared buffer pool directly, instead, it reads the data into file > system cache, which makes the integration easy and this is unique to > PostgreSQL. > MySQL, Oracle and others implement read-ahead threads to simulate async IO 'pre-fetching'. I've been experimenting with two ideas. The first is to increase the readahead when we're doing sequential scans (see prototype patch using posix fadvise attached). I've not got any hardware at the moment which I can test this patch on but I am waiting on some dbt-3 results which should indicate whether fadvise is a good idea or a bad one. The second idea is using posix async IO at key points within the system to better parallelise CPU and IO work. There areas I think we could use async IO are: during sequential scans, use async IO to do pre-fetching of blocks; inside WAL, begin flushing WAL buffers to disk before we commit; and, inside the background writer/check point process, asynchronously write out pages and, potentially, asynchronously build new checkpoint segments. The motivation for using async IO is two fold: first, the results of this paper[1] are compelling; second, modern OSs support async IO. I know that Linux[2], Solaris[3], AIX and Windows all have async IO and I presume that all their rivals have it as well. The fundamental premise of the paper mentioned above is that if the database is busy, IO should be busy. With our current block-at-a-time processing, this isn't always the case. This is why Qingqing's read-ahead thread makes sense. My reason for mailing is, however, that the async IO results are more compelling than the read ahead thread. I haven't had time to prototype whether we can easily implement async IO but I am planning to work on it in December. The two main goals will be to a) integrate and utilise async IO, at least within the executor context, and b) build a primitive kind of scheduler so that we stop prefetching when we know that there are a certain number of outstanding IOs for a given device. Thanks, Gavin [1] http://www.vldb2005.org/program/paper/wed/p1116-hall.pdf [2] http://lse.sourceforge.net/io/aionotes.txt [3] http://developers.sun.com/solaris/articles/event_completion.html - I'm fairly sure they have a posix AIO wrapper around these routines, but I cannot see it documented anywhere :-( --583741998-61783486-1133236274=:18112 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; NAME="fadvise.diff" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: ATTACHMENT; FILENAME="fadvise.diff" SW5kZXg6IHNyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL2hlYXBhbS5jDQo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL3Vzci9sb2NhbC9jdnNy b290L3Bnc3FsL3NyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL2hlYXBhbS5jLHYN CnJldHJpZXZpbmcgcmV2aXNpb24gMS4yMDANCmRpZmYgLWMgLXAgLXIxLjIw MCBoZWFwYW0uYw0KKioqIHNyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL2hlYXBh bS5jCTE1IE9jdCAyMDA1IDAyOjQ5OjA4IC0wMDAwCTEuMjAwDQotLS0gc3Jj L2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtLmMJMTggTm92IDIwMDUgMDQ6 MTA6MjEgLTAwMDANCioqKioqKioqKioqKioqKg0KKioqIDM2LDQxICoqKioN Ci0tLSAzNiw0NCAtLS0tDQogICAqDQogICAqLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQ0KICAgKi8NCisgDQorICNpbmNsdWRlIDxmY250bC5oPg0K KyANCiAgI2luY2x1ZGUgInBvc3RncmVzLmgiDQogIA0KICAjaW5jbHVkZSAi YWNjZXNzL2hlYXBhbS5oIg0KKioqKioqKioqKioqKioqDQoqKiogNDksNTQg KioqKg0KLS0tIDUyLDU4IC0tLS0NCiAgI2luY2x1ZGUgIm1pc2NhZG1pbi5o Ig0KICAjaW5jbHVkZSAicGdzdGF0LmgiDQogICNpbmNsdWRlICJzdG9yYWdl L3Byb2NhcnJheS5oIg0KKyAjaW5jbHVkZSAic3RvcmFnZS9zbWdyLmgiDQog ICNpbmNsdWRlICJ1dGlscy9pbnZhbC5oIg0KICAjaW5jbHVkZSAidXRpbHMv cmVsY2FjaGUuaCINCiAgDQoqKioqKioqKioqKioqKiogaGVhcF9iZWdpbnNj YW4oUmVsYXRpb24gcmVsYXRpb24sIFNuYXBzaA0KKioqIDY1OSw2NjUgKioq Kg0KICAJcGdzdGF0X2luaXRzdGF0cygmc2Nhbi0+cnNfcGdzdGF0X2luZm8s IHJlbGF0aW9uKTsNCiAgDQogIAlpbml0c2NhbihzY2FuLCBrZXkpOw0KISAN CiAgCXJldHVybiBzY2FuOw0KICB9DQogIA0KLS0tIDY2Myw2NzMgLS0tLQ0K ICAJcGdzdGF0X2luaXRzdGF0cygmc2Nhbi0+cnNfcGdzdGF0X2luZm8sIHJl bGF0aW9uKTsNCiAgDQogIAlpbml0c2NhbihzY2FuLCBrZXkpOw0KISAJaWYo IUlzQm9vdHN0cmFwUHJvY2Vzc2luZ01vZGUoKSkNCiEgCXsNCiEgCQlSZWxh dGlvbk9wZW5TbWdyKHJlbGF0aW9uKTsNCiEgCQlSZWxhdGlvblNldFNtZ3JB ZHZpY2UocmVsYXRpb24sIFBPU0lYX0ZBRFZfU0VRVUVOVElBTCk7DQohIAl9 DQogIAlyZXR1cm4gc2NhbjsNCiAgfQ0KICANCioqKioqKioqKioqKioqKiBo ZWFwX3Jlc2NhbihIZWFwU2NhbkRlc2Mgc2NhbiwNCioqKiA2OTMsNjk4ICoq KioNCi0tLSA3MDEsNzEwIC0tLS0NCiAgdm9pZA0KICBoZWFwX2VuZHNjYW4o SGVhcFNjYW5EZXNjIHNjYW4pDQogIHsNCisgLyoJaWYoIUlzQm9vdHN0cmFw UHJvY2Vzc2luZ01vZGUoKSkNCisgCQlzbWdyYWR2aXNlKHNjYW4tPnJzX3Jk LT5yZF9zbWdyLCBQT1NJWF9GQURWX05PUk1BTCk7DQorICovDQorIA0KICAJ LyogTm90ZTogbm8gbG9ja2luZyBtYW5pcHVsYXRpb25zIG5lZWRlZCAqLw0K ICANCiAgCS8qDQpJbmRleDogc3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4L2lu ZGV4YW0uYw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC91 c3IvbG9jYWwvY3Zzcm9vdC9wZ3NxbC9zcmMvYmFja2VuZC9hY2Nlc3MvaW5k ZXgvaW5kZXhhbS5jLHYNCnJldHJpZXZpbmcgcmV2aXNpb24gMS44Ng0KZGlm ZiAtYyAtcCAtcjEuODYgaW5kZXhhbS5jDQoqKiogc3JjL2JhY2tlbmQvYWNj ZXNzL2luZGV4L2luZGV4YW0uYwkxNSBPY3QgMjAwNSAwMjo0OTowOSAtMDAw MAkxLjg2DQotLS0gc3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4L2luZGV4YW0u YwkxOCBOb3YgMjAwNSAwMzoxMzowMSAtMDAwMA0KKioqKioqKioqKioqKioq DQoqKiogNjEsNzMgKioqKg0KICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0NCiAgICovDQogIA0KICAjaW5jbHVkZSAicG9zdGdyZXMuaCINCiAg DQogICNpbmNsdWRlICJhY2Nlc3MvZ2VuYW0uaCINCiAgI2luY2x1ZGUgImFj Y2Vzcy9oZWFwYW0uaCINCiEgI2luY2x1ZGUgInBnc3RhdC5oIg0KICAjaW5j bHVkZSAidXRpbHMvcmVsY2FjaGUuaCINCiAgDQogIA0KICAvKiAtLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQogICAqCQkJCQltYWNyb3MgdXNlZCBpbiBpbmRleF8g cm91dGluZXMNCi0tLSA2MSw3NyAtLS0tDQogICAqLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQ0KICAgKi8NCiAgDQorICNpbmNsdWRlIDxmY250bC5o Pg0KKyANCiAgI2luY2x1ZGUgInBvc3RncmVzLmgiDQogIA0KICAjaW5jbHVk ZSAiYWNjZXNzL2dlbmFtLmgiDQogICNpbmNsdWRlICJhY2Nlc3MvaGVhcGFt LmgiDQohICNpbmNsdWRlICJtaXNjYWRtaW4uaCINCiEgI2luY2x1ZGUgInN0 b3JhZ2Uvc21nci5oIg0KICAjaW5jbHVkZSAidXRpbHMvcmVsY2FjaGUuaCIN CiAgDQorICNpbmNsdWRlICJwZ3N0YXQuaCINCiAgDQogIC8qIC0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0NCiAgICoJCQkJCW1hY3JvcyB1c2VkIGluIGluZGV4XyBy b3V0aW5lcw0KKioqKioqKioqKioqKioqIGluZGV4X2JlZ2luc2NhbihSZWxh dGlvbiBoZWFwUmVsYXRpb24sDQoqKiogMjQ3LDI1MyAqKioqDQogIAlzY2Fu LT5pc19tdWx0aXNjYW4gPSBmYWxzZTsNCiAgCXNjYW4tPmhlYXBSZWxhdGlv biA9IGhlYXBSZWxhdGlvbjsNCiAgCXNjYW4tPnhzX3NuYXBzaG90ID0gc25h cHNob3Q7DQohIA0KICAJcmV0dXJuIHNjYW47DQogIH0NCiAgDQotLS0gMjUx LDI2MyAtLS0tDQogIAlzY2FuLT5pc19tdWx0aXNjYW4gPSBmYWxzZTsNCiAg CXNjYW4tPmhlYXBSZWxhdGlvbiA9IGhlYXBSZWxhdGlvbjsNCiAgCXNjYW4t PnhzX3NuYXBzaG90ID0gc25hcHNob3Q7DQohIAlpZighSXNCb290c3RyYXBQ cm9jZXNzaW5nTW9kZSgpKQ0KISAJew0KISAvLwkJUmVsYXRpb25PcGVuU21n cihoZWFwUmVsYXRpb24pOw0KISAvLwkJc21ncmFkdmlzZShoZWFwUmVsYXRp b24tPnJkX3NtZ3IsIFBPU0lYX0ZBRFZfUkFORE9NKTsNCiEgCQlSZWxhdGlv bk9wZW5TbWdyKGluZGV4UmVsYXRpb24pOw0KISAgICAgICAgIFJlbGF0aW9u U2V0U21nckFkdmljZShpbmRleFJlbGF0aW9uLCBQT1NJWF9GQURWX1JBTkRP TSk7DQohIAl9DQogIAlyZXR1cm4gc2NhbjsNCiAgfQ0KICANCioqKioqKioq KioqKioqKiBpbmRleF9lbmRzY2FuKEluZGV4U2NhbkRlc2Mgc2NhbikNCioq KiAzNjUsMzcwICoqKioNCi0tLSAzNzUsMzg2IC0tLS0NCiAgew0KICAJRm1n ckluZm8gICAqcHJvY2VkdXJlOw0KICANCisgCWlmKCFJc0Jvb3RzdHJhcFBy b2Nlc3NpbmdNb2RlKCkpDQorIAl7DQorIAkvLyAgICBzbWdyYWR2aXNlKHNj YW4tPmhlYXBSZWxhdGlvbi0+cmRfc21nciwgUE9TSVhfRkFEVl9OT1JNQUwp Ow0KKyAvLyAgICAJc21ncmFkdmlzZShzY2FuLT5pbmRleFJlbGF0aW9uLT5y ZF9zbWdyLCBQT1NJWF9GQURWX05PUk1BTCk7DQorIAl9DQorIA0KICAJU0NB Tl9DSEVDS1M7DQogIAlHRVRfU0NBTl9QUk9DRURVUkUoYW1lbmRzY2FuKTsN CiAgDQpJbmRleDogc3JjL2JhY2tlbmQvc3RvcmFnZS9maWxlL2ZkLmMNCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0NClJDUyBmaWxlOiAvdXNyL2xvY2FsL2N2 c3Jvb3QvcGdzcWwvc3JjL2JhY2tlbmQvc3RvcmFnZS9maWxlL2ZkLmMsdg0K cmV0cmlldmluZyByZXZpc2lvbiAxLjEyMQ0KZGlmZiAtYyAtcCAtcjEuMTIx IGZkLmMNCioqKiBzcmMvYmFja2VuZC9zdG9yYWdlL2ZpbGUvZmQuYwkxNSBP Y3QgMjAwNSAwMjo0OToyNSAtMDAwMAkxLjEyMQ0KLS0tIHNyYy9iYWNrZW5k L3N0b3JhZ2UvZmlsZS9mZC5jCTE2IE5vdiAyMDA1IDAzOjEyOjMxIC0wMDAw DQoqKioqKioqKioqKioqKiogRmlsZVRydW5jYXRlKEZpbGUgZmlsZSwgbG9u ZyBvZmZzZXQpDQoqKiogMTE2MCwxMTY1ICoqKioNCi0tLSAxMTYwLDExNzAg LS0tLQ0KICAJcmV0dXJuIHJldHVybkNvZGU7DQogIH0NCiAgDQorIGludA0K KyBGaWxlQWR2aXNlKEZpbGUgZmlsZSwgaW50IGFkdmljZSkNCisgew0KKyAJ cmV0dXJuIHBvc2l4X2ZhZHZpc2UoVmZkQ2FjaGVbZmlsZV0uZmQsIDAsIDAs IGFkdmljZSk7DQorIH0NCiAgDQogIC8qDQogICAqIFJvdXRpbmVzIHRoYXQg d2FudCB0byB1c2Ugc3RkaW8gKGllLCBGSUxFKikgc2hvdWxkIHVzZSBBbGxv Y2F0ZUZpbGUNCkluZGV4OiBzcmMvYmFja2VuZC9zdG9yYWdlL3NtZ3IvbWQu Yw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC91c3IvbG9j YWwvY3Zzcm9vdC9wZ3NxbC9zcmMvYmFja2VuZC9zdG9yYWdlL3NtZ3IvbWQu Yyx2DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTE4DQpkaWZmIC1jIC1wIC1y MS4xMTggbWQuYw0KKioqIHNyYy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9tZC5j CTE1IE9jdCAyMDA1IDAyOjQ5OjI2IC0wMDAwCTEuMTE4DQotLS0gc3JjL2Jh Y2tlbmQvc3RvcmFnZS9zbWdyL21kLmMJMTggTm92IDIwMDUgMDI6NTg6MTcg LTAwMDANCioqKioqKioqKioqKioqKiBtZG9wZW4oU01nclJlbGF0aW9uIHJl bG4sIGJvb2wgYWxsb3dOb3RGDQoqKiogMzY1LDM3MCAqKioqDQotLS0gMzY1 LDM3MiAtLS0tDQogIAkJfQ0KICAJfQ0KICANCisgCUZpbGVBZHZpc2UoZmQs IHJlbG4tPmFkdmljZSk7DQorIA0KICAJcGZyZWUocGF0aCk7DQogIA0KICAJ cmVsbi0+bWRfZmQgPSBtZGZkID0gX2ZkdmVjX2FsbG9jKCk7DQoqKioqKioq KioqKioqKiogbWR3cml0ZShTTWdyUmVsYXRpb24gcmVsbiwgQmxvY2tOdW1i ZXIgYg0KKioqIDQ5Myw0OTggKioqKg0KLS0tIDQ5NSw1MDcgLS0tLQ0KICAJ cmV0dXJuIHRydWU7DQogIH0NCiAgDQorIGludA0KKyBtZGFkdmlzZShTTWdy UmVsYXRpb24gcmVsbiwgaW50IGFkdmljZSkNCisgew0KKyAJTWRmZFZlYyAq diA9IF9tZGZkX2dldHNlZyhyZWxuLCAwLCBmYWxzZSk7DQorIAlyZXR1cm4g RmlsZUFkdmlzZSh2LT5tZGZkX3ZmZCwgYWR2aWNlKTsNCisgfQ0KKyANCiAg LyoNCiAgICoJbWRuYmxvY2tzKCkgLS0gR2V0IHRoZSBudW1iZXIgb2YgYmxv Y2tzIHN0b3JlZCBpbiBhIHJlbGF0aW9uLg0KICAgKg0KKioqKioqKioqKioq KioqIF9tZGZkX29wZW5zZWcoU01nclJlbGF0aW9uIHJlbG4sIEJsb2NrTnUN CioqKiA4ODIsODg3ICoqKioNCi0tLSA4OTEsODk4IC0tLS0NCiAgCWlmIChm ZCA8IDApDQogIAkJcmV0dXJuIE5VTEw7DQogIA0KKyAJDQorIA0KICAJLyog YWxsb2NhdGUgYW4gbWRmZHZlYyBlbnRyeSBmb3IgaXQgKi8NCiAgCXYgPSBf ZmR2ZWNfYWxsb2MoKTsNCiAgDQpJbmRleDogc3JjL2JhY2tlbmQvc3RvcmFn ZS9zbWdyL3NtZ3IuYw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZp bGU6IC91c3IvbG9jYWwvY3Zzcm9vdC9wZ3NxbC9zcmMvYmFja2VuZC9zdG9y YWdlL3NtZ3Ivc21nci5jLHYNCnJldHJpZXZpbmcgcmV2aXNpb24gMS45Mw0K ZGlmZiAtYyAtcCAtcjEuOTMgc21nci5jDQoqKiogc3JjL2JhY2tlbmQvc3Rv cmFnZS9zbWdyL3NtZ3IuYwkxNSBPY3QgMjAwNSAwMjo0OToyNiAtMDAwMAkx LjkzDQotLS0gc3JjL2JhY2tlbmQvc3RvcmFnZS9zbWdyL3NtZ3IuYwkxOCBO b3YgMjAwNSAwMzowMTo0NSAtMDAwMA0KKioqKioqKioqKioqKioqDQoqKiog MTUsMjAgKioqKg0KLS0tIDE1LDIzIC0tLS0NCiAgICoNCiAgICotLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAqLw0KKyANCisgI2luY2x1ZGUg PGZjbnRsLmg+DQorIA0KICAjaW5jbHVkZSAicG9zdGdyZXMuaCINCiAgDQog ICNpbmNsdWRlICJhY2Nlc3MveGFjdC5oIg0KKioqKioqKioqKioqKioqIHR5 cGVkZWYgc3RydWN0IGZfc21ncg0KKioqIDU0LDU5ICoqKioNCi0tLSA1Nyw2 MyAtLS0tDQogIAlib29sCQkoKnNtZ3JfY29tbWl0KSAodm9pZCk7CS8qIG1h eSBiZSBOVUxMICovDQogIAlib29sCQkoKnNtZ3JfYWJvcnQpICh2b2lkKTsJ LyogbWF5IGJlIE5VTEwgKi8NCiAgCWJvb2wJCSgqc21ncl9zeW5jKSAodm9p ZCk7CS8qIG1heSBiZSBOVUxMICovDQorIAlpbnQJCQkoKnNtZ3JfYWR2aXNl KSAoU01nclJlbGF0aW9uIHJlbG4sIGludCBhZHZpY2UpOw0KICB9IGZfc21n cjsNCiAgDQogIA0KKioqKioqKioqKioqKioqIHN0YXRpYyBjb25zdCBmX3Nt Z3Igc21ncnN3W10gPSB7DQoqKiogNjEsNjcgKioqKg0KICAJLyogbWFnbmV0 aWMgZGlzayAqLw0KICAJe21kaW5pdCwgTlVMTCwgbWRjbG9zZSwgbWRjcmVh dGUsIG1kdW5saW5rLCBtZGV4dGVuZCwNCiAgCQltZHJlYWQsIG1kd3JpdGUs IG1kbmJsb2NrcywgbWR0cnVuY2F0ZSwgbWRpbW1lZHN5bmMsDQohIAkJTlVM TCwgTlVMTCwgbWRzeW5jDQogIAl9DQogIH07DQogIA0KLS0tIDY1LDcxIC0t LS0NCiAgCS8qIG1hZ25ldGljIGRpc2sgKi8NCiAgCXttZGluaXQsIE5VTEws IG1kY2xvc2UsIG1kY3JlYXRlLCBtZHVubGluaywgbWRleHRlbmQsDQogIAkJ bWRyZWFkLCBtZHdyaXRlLCBtZG5ibG9ja3MsIG1kdHJ1bmNhdGUsIG1kaW1t ZWRzeW5jLA0KISAJCU5VTEwsIE5VTEwsIG1kc3luYywgbWRhZHZpc2UNCiAg CX0NCiAgfTsNCiAgDQoqKioqKioqKioqKioqKiogc21ncm9wZW4oUmVsRmls ZU5vZGUgcm5vZGUpDQoqKiogMjE5LDIyNCAqKioqDQotLS0gMjIzLDIyOSAt LS0tDQogIAkJcmVsbi0+c21ncl9vd25lciA9IE5VTEw7DQogIAkJcmVsbi0+ c21ncl93aGljaCA9IDA7CS8qIHdlIG9ubHkgaGF2ZSBtZC5jIGF0IHByZXNl bnQgKi8NCiAgCQlyZWxuLT5tZF9mZCA9IE5VTEw7CQkvKiBtYXJrIGl0IG5v dCBvcGVuICovDQorIAkJcmVsbi0+YWR2aWNlID0gUE9TSVhfRkFEVl9OT1JN QUw7DQogIAl9DQogIA0KICAJcmV0dXJuIHJlbG47DQoqKioqKioqKioqKioq Kiogc21ncmNyZWF0ZShTTWdyUmVsYXRpb24gcmVsbiwgYm9vbCBpc1RlbQ0K KioqIDM5MCwzOTUgKioqKg0KLS0tIDM5NSw0MDYgLS0tLQ0KICAJcGVuZGlu Z0RlbGV0ZXMgPSBwZW5kaW5nOw0KICB9DQogIA0KKyBpbnQNCisgc21ncmFk dmlzZShTTWdyUmVsYXRpb24gcmVsbiwgaW50IGFkdmljZSkNCisgew0KKyAJ cmV0dXJuICgqKHNtZ3Jzd1tyZWxuLT5zbWdyX3doaWNoXS5zbWdyX2Fkdmlz ZSkpIChyZWxuLCBhZHZpY2UpOw0KKyB9DQorIA0KICAvKg0KICAgKglzbWdy c2NoZWR1bGV1bmxpbmsoKSAtLSBTY2hlZHVsZSB1bmxpbmtpbmcgYSByZWxh dGlvbiBhdCB4YWN0IGNvbW1pdC4NCiAgICoNCkluZGV4OiBzcmMvaW5jbHVk ZS9zdG9yYWdlL2ZkLmgNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBm aWxlOiAvdXNyL2xvY2FsL2N2c3Jvb3QvcGdzcWwvc3JjL2luY2x1ZGUvc3Rv cmFnZS9mZC5oLHYNCnJldHJpZXZpbmcgcmV2aXNpb24gMS41NA0KZGlmZiAt YyAtcCAtcjEuNTQgZmQuaA0KKioqIHNyYy9pbmNsdWRlL3N0b3JhZ2UvZmQu aAkxNSBPY3QgMjAwNSAwMjo0OTo0NiAtMDAwMAkxLjU0DQotLS0gc3JjL2lu Y2x1ZGUvc3RvcmFnZS9mZC5oCTE2IE5vdiAyMDA1IDAxOjUzOjQ5IC0wMDAw DQoqKioqKioqKioqKioqKiogZXh0ZXJuIGludAlGaWxlV3JpdGUoRmlsZSBm aWxlLCBjaGFyICpidQ0KKioqIDY5LDc0ICoqKioNCi0tLSA2OSw3NSAtLS0t DQogIGV4dGVybiBpbnQJRmlsZVN5bmMoRmlsZSBmaWxlKTsNCiAgZXh0ZXJu IGxvbmcgRmlsZVNlZWsoRmlsZSBmaWxlLCBsb25nIG9mZnNldCwgaW50IHdo ZW5jZSk7DQogIGV4dGVybiBpbnQJRmlsZVRydW5jYXRlKEZpbGUgZmlsZSwg bG9uZyBvZmZzZXQpOw0KKyBleHRlcm4gaW50IEZpbGVBZHZpc2UoRmlsZSBm aWxlLCBpbnQgYWR2aWNlKTsNCiAgDQogIC8qIE9wZXJhdGlvbnMgdGhhdCBh bGxvdyB1c2Ugb2YgcmVndWxhciBzdGRpbyAtLS0gVVNFIFdJVEggQ0FVVElP TiAqLw0KICBleHRlcm4gRklMRSAqQWxsb2NhdGVGaWxlKGNoYXIgKm5hbWUs IGNoYXIgKm1vZGUpOw0KSW5kZXg6IHNyYy9pbmNsdWRlL3N0b3JhZ2Uvc21n ci5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL3Vzci9s b2NhbC9jdnNyb290L3Bnc3FsL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc21nci5o LHYNCnJldHJpZXZpbmcgcmV2aXNpb24gMS41Mw0KZGlmZiAtYyAtcCAtcjEu NTMgc21nci5oDQoqKiogc3JjL2luY2x1ZGUvc3RvcmFnZS9zbWdyLmgJMTUg T2N0IDIwMDUgMDI6NDk6NDYgLTAwMDAJMS41Mw0KLS0tIHNyYy9pbmNsdWRl L3N0b3JhZ2Uvc21nci5oCTE3IE5vdiAyMDA1IDIzOjI4OjM3IC0wMDAwDQoq KioqKioqKioqKioqKiogdHlwZWRlZiBzdHJ1Y3QgU01nclJlbGF0aW9uRGF0 YQ0KKioqIDUyLDU3ICoqKioNCi0tLSA1Miw1OCAtLS0tDQogIAlpbnQJCQlz bWdyX3doaWNoOwkJLyogc3RvcmFnZSBtYW5hZ2VyIHNlbGVjdG9yICovDQog IA0KICAJc3RydWN0IF9NZGZkVmVjICptZF9mZDsJCS8qIGZvciBtZC5jOyBO VUxMIGlmIG5vdCBvcGVuICovDQorIAlpbnQJYWR2aWNlOwkJCQkJLyoga2Vy bmVsIGFkdmlzZSBhYm91dCB0aGUgZmlsZSAqLw0KICB9IFNNZ3JSZWxhdGlv bkRhdGE7DQogIA0KICB0eXBlZGVmIFNNZ3JSZWxhdGlvbkRhdGEgKlNNZ3JS ZWxhdGlvbjsNCioqKioqKioqKioqKioqKiBleHRlcm4gdm9pZCBQb3N0UHJl cGFyZV9zbWdyKHZvaWQpOw0KKioqIDgzLDg4ICoqKioNCi0tLSA4NCw5MCAt LS0tDQogIGV4dGVybiB2b2lkIHNtZ3Jjb21taXQodm9pZCk7DQogIGV4dGVy biB2b2lkIHNtZ3JhYm9ydCh2b2lkKTsNCiAgZXh0ZXJuIHZvaWQgc21ncnN5 bmModm9pZCk7DQorIGV4dGVybiBpbnQgc21ncmFkdmlzZShTTWdyUmVsYXRp b24gcmVsbiwgaW50IGFkdmljZSk7DQogIA0KICBleHRlcm4gdm9pZCBzbWdy X3JlZG8oWExvZ1JlY1B0ciBsc24sIFhMb2dSZWNvcmQgKnJlY29yZCk7DQog IGV4dGVybiB2b2lkIHNtZ3JfZGVzYyhjaGFyICpidWYsIHVpbnQ4IHhsX2lu Zm8sIGNoYXIgKnJlYyk7DQoqKioqKioqKioqKioqKiogZXh0ZXJuIGJvb2wg bWRzeW5jKHZvaWQpOw0KKioqIDEwOCwxMTMgKioqKg0KLS0tIDExMCwxMTgg LS0tLQ0KICANCiAgZXh0ZXJuIHZvaWQgUmVtZW1iZXJGc3luY1JlcXVlc3Qo UmVsRmlsZU5vZGUgcm5vZGUsIEJsb2NrTnVtYmVyIHNlZ25vKTsNCiAgDQor IGV4dGVybiBpbnQgbWRhZHZpc2UoU01nclJlbGF0aW9uIHJlbG4sIGludCBh ZHZpY2UpOw0KKyANCisgDQogIC8qIHNtZ3J0eXBlLmMgKi8NCiAgZXh0ZXJu IERhdHVtIHNtZ3JvdXQoUEdfRlVOQ1RJT05fQVJHUyk7DQogIGV4dGVybiBE YXR1bSBzbWdyaW4oUEdfRlVOQ1RJT05fQVJHUyk7DQpJbmRleDogc3JjL2lu Y2x1ZGUvdXRpbHMvcmVsLmgNCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJD UyBmaWxlOiAvdXNyL2xvY2FsL2N2c3Jvb3QvcGdzcWwvc3JjL2luY2x1ZGUv dXRpbHMvcmVsLmgsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjg3DQpkaWZm IC1jIC1wIC1yMS44NyByZWwuaA0KKioqIHNyYy9pbmNsdWRlL3V0aWxzL3Jl bC5oCTE1IE9jdCAyMDA1IDAyOjQ5OjQ2IC0wMDAwCTEuODcNCi0tLSBzcmMv aW5jbHVkZS91dGlscy9yZWwuaAkxOCBOb3YgMjAwNSAwNDoxMDoxOCAtMDAw MA0KKioqKioqKioqKioqKioqIHR5cGVkZWYgUmVsYXRpb24gKlJlbGF0aW9u UHRyOw0KKioqIDI3OCwyODMgKioqKg0KLS0tIDI3OCwyODkgLS0tLQ0KICAJ CX0gXA0KICAJfSB3aGlsZSAoMCkNCiAgDQorICNkZWZpbmUgUmVsYXRpb25T ZXRTbWdyQWR2aWNlKHJlbGF0aW9uLCBfYWR2aWNlKSBcDQorIAlkbyB7IFwN CisgCQlpZiAoKHJlbGF0aW9uKS0+cmRfc21nciAhPSBOVUxMKSBcDQorIAkJ CShyZWxhdGlvbiktPnJkX3NtZ3ItPmFkdmljZSA9IF9hZHZpY2U7IFwNCisg CX0gd2hpbGUoMCkNCisgDQogIC8qDQogICAqIFJFTEFUSU9OX0lTX0xPQ0FM DQogICAqCQlJZiBhIHJlbCBpcyBlaXRoZXIgdGVtcCBvciBuZXdseSBjcmVh dGVkIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLA0K --583741998-61783486-1133236274=:18112--