Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1e7nPa-0003iC-TH for pgsql-hackers@arkaria.postgresql.org; Thu, 26 Oct 2017 19:01:51 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84_2) (envelope-from ) id 1e7nPZ-0005xX-Lz for pgsql-hackers@arkaria.postgresql.org; Thu, 26 Oct 2017 19:01:49 +0000 Received: from makus.postgresql.org ([2001:4800:1501:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1e7nPY-0005xM-Q6 for pgsql-hackers@postgresql.org; Thu, 26 Oct 2017 19:01:49 +0000 Received: from mail.postgrespro.ru ([93.174.131.138]) by makus.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1e7nPU-0001ZP-Fa for pgsql-hackers@postgresql.org; Thu, 26 Oct 2017 19:01:47 +0000 Received: from localhost (localhost [127.0.0.1]) by mail.postgrespro.ru (Postfix) with ESMTP id ADEE521C1664; Thu, 26 Oct 2017 22:01:41 +0300 (MSK) X-Virus-Scanned: Debian amavisd-new at postgrespro.ru Received: from mail.postgrespro.ru (unknown [192.168.27.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id 2DA5221C08FD; Thu, 26 Oct 2017 22:01:41 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1509044501; bh=hoKH9DOBG/mnXx++9pkffbuNi5Tot/F87xDmutUgEXg=; h=Date:From:To:Cc:Subject:In-Reply-To:References; b=SKpe+LinUH3ArXvF9U6dkH4sZShExLd8KQ7K3Fr5nK3rNikOrG6YrFxcW/XCn/Rgh uqqDj7dbheevcYo3zFowpGbmp+gU+373nlQsgrmcdMbJAfQIO+2M+FFWB8nrhjkYEW R8bHhU4FhXbIyOqhX/k40BX/5SeX+W572SyLSVWg= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_f42f4ed51c6dca32e955ca34276e2e01" Date: Thu, 26 Oct 2017 22:01:40 +0300 From: Sokolov Yura To: Stas Kelvich Cc: Nikhil Sontakke , Andres Freund , Dmitry Dolgov <9erthalion6@gmail.com>, Tom Lane , Masahiko Sawada , Simon Riggs , Craig Ringer , Petr Jelinek , PostgreSQL Hackers , Robert Haas Subject: Re: logical decoding of two-phase transactions Organization: Postgres Professional In-Reply-To: References: <20170328012546.473psm6546bgsi2c@alap3.anarazel.de> <20170328143840.b7qdvqh3uh74f2oa@alap3.anarazel.de> <20170328150823.u4he7rbd72mzeydl@alap3.anarazel.de> <9CD693AF-51BE-4A19-9D26-16031CDAD9C9@postgrespro.ru> <20170404173133.olo7keeh3dzhriay@alap3.anarazel.de> <19307.1494706954@sss.pgh.pa.us> Message-ID: X-Sender: y.sokolov@postgrespro.ru User-Agent: Roundcube Webmail/1.2.4 List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-hackers Precedence: bulk Sender: pgsql-hackers-owner@postgresql.org --=_f42f4ed51c6dca32e955ca34276e2e01 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed On 2017-09-27 14:46, Stas Kelvich wrote: >> On 7 Sep 2017, at 18:58, Nikhil Sontakke >> wrote: >> >> Hi, >> >> FYI all, wanted to mention that I am working on an updated version of >> the latest patch that I plan to submit to a later CF. >> > > Cool! > > So what kind of architecture do you have in mind? Same way as is it > was implemented before? > As far as I remember there were two main issues: > > * Decodong of aborted prepared transaction. > > If such transaction modified catalog then we can’t read reliable info > with our historic snapshot, > since clog already have aborted bit for our tx it will brake > visibility logic. There are some way to > deal with that — by doing catalog seq scan two times and counting > number of tuples (details > upthread) or by hijacking clog values in historic visibility function. > But ISTM it is better not solve this > issue at all =) In most cases intended usage of decoding of 2PC > transaction is to do some form > of distributed commit, so naturally decoding will happens only with > in-progress transactions and > we commit/abort will happen only after it is decoded, sent and > response is received. So we can > just have atomic flag that prevents commit/abort of tx currently being > decoded. And we can filter > interesting prepared transactions based on GID, to prevent holding > this lock for ordinary 2pc. > > * Possible deadlocks that Andres was talking about. > > I spend some time trying to find that, but didn’t find any. If locking > pg_class in prepared tx is the only > example then (imho) it is better to just forbid to prepare such > transactions. Otherwise if some realistic > examples that can block decoding are actually exist, then we probably > need to reconsider the way > tx being decoded. Anyway this part probably need Andres blessing. Just rebased patch logical_twophase_v6 to master. Fixed small issues: - XactLogAbortRecord wrote DBINFO twice, but it was decoded in ParseAbortRecord only once. Second DBINFO were parsed as ORIGIN. Fixed by removing second write of DBINFO. - SnapBuildPrepareTxnFinish tried to remove xid from `running` instead of `committed`. And it removed only xid, without subxids. - test_decoding skipped returning "COMMIT PREPARED" and "ABORT PREPARED", Big issue were with decoding ddl-including two-phase transactions: - prepared.out were misleading. We could not reproduce decoding body of "test_prepared#3" with logical_twophase_v6.diff. It was skipped if `pg_logical_slot_get_changes` were called without `twophase-decode-with-catalog-changes` set, and only "COMMIT PREPARED test_prepared#3" were decoded. The reason is "PREPARE TRANSACTION" is passed to `pg_filter_prepare` twice: - first on "PREPARE" itself, - second - on "COMMIT PREPARED". In v6, `pg_filter_prepare` without `with-catalog-changes` first time answered "true" (ie it should not be decoded), and second time (when transaction became committed) it answered "false" (ie it should be decoded). But second time in DecodePrepare `ctx->snapshot_builder->start_decoding_at` is already in a future compared to `buf->origptr` (because it is on "COMMIT PREPARED" lsn). Therefore DecodePrepare just called ReorderBufferForget. If `pg_filter_prepare` is called with `with-catalog-changes`, then it returns "false" both times, thus DeocdePrepare decodes transaction in first time, and calls `ReorderBufferForget` in second time. I didn't found a way to fix it gracefully. I just change `pg_filter_prepare` to return same answer both times: "false" if called `with-catalog-changes` (ie need to call DecodePrepare), and "true" otherwise. With this change, catalog changing two-phase transaction is decoded as simple one-phase transaction, if `pg_logical_slot_get_changes` is called without `with-catalog-changes`. -- With regards, Sokolov Yura Postgres Professional: https://postgrespro.ru The Russian Postgres Company --=_f42f4ed51c6dca32e955ca34276e2e01 Content-Transfer-Encoding: base64 Content-Type: application/x-gzip; name=logical_twophase_v7.diff.gz Content-Disposition: attachment; filename=logical_twophase_v7.diff.gz; size=14741 H4sICAEo8lkAA2xvZ2ljYWxfdHdvcGhhc2VfdjcuZGlmZgDsPftz2sbWP8Nf sU2nAczLAgx2PGmvYzsp8zm2Bzs3mWk7XCEtoM9ConrYJm3/93vO2V09AGH5 kSbpjX+wQbt7ds/7tUpMazxm9frECpjeNFwn8KxRM+B+MDS54ZqWM2ny2zk3 Am425x6f6x43G24YsNF9Zhctx+S3rNPle9qO2RmPG43xXrfXHbX4tsa07e1u p1Os1+v3O0OxWq3e8xz/+herd2vaHqvC71abwfeL45Pjw0tWshwrKLHXg7O3 bD4ZGh7XAz603Yll6PYQYNjwIbBcZ+jbblAueXzicd9XD0o1VhIHKDKGoIqs rDHPvakUWbF+ODg+uDxmlwevTo4ZTVOn0sqWCfODyv6mWa14VvVpzjtszY34 zJJoJYTPfjJcO5w5P7FitR79wHPCqqqwqj7lSYaOO7bsgHuPPdLdhOYT7rG5 Z810b8Gu+ALh3034datAXAc89LnJfg+5Z3G/WP3V5wGb8ADwAaxYSVLI1AM9 oo8iDOGOc42p7ky4Xy6tyBRQ4/TdyYn6XQJKG3Zo8vqtZfo4Wiptiz/+lTWv 89k8WNRvdSOQg1oJyFdKHOvGCqZPcDASnic4HP4Jbtz5VPd5PeL4xqNHkvIU OMRi98mRWR3ldUSpDqqhw6nr8qAp7MEwkzgy35rNbc780DAAhXFoM5A75o6Z zpSkMjxNkb06ftM/3S+y/unF8eAS/lyeLekB+/fBybvjCzBPIMTsfHB8fjAA 2R8cnF4cHF72z06lBqoF32slEPYXkVSD2hHJlSqC/m2j/vmkgC8SvIKZGT8E IOMnqeL5f2AvQh3+BvoIaDUPR2B3GmncX0i6vGCW+YtU699eaLAoFx0A1fZ6 VCNJ+mfjzA7P3r7tX6qVR3eLyldDDIFZNodXcFmHQq6jR5ttIGPKqeUTtL/t PHlsSwtti7Je+sj1gsdaq3ZOa9X6OkWw9RAR/ApweTiUdj4L1ULZ7P5DrPLn pBwbnJ2cvDo4/L9MM7CqWg8NBNZQPQ+xAc7Bq7NBtqFqPZHh/ASHyWPjOkmr mTKVDJNcHdIdZ8JM044sJ+azrW6ts8OqWnu71mp1MaXNsdUObnVwcnk8WJss sYOjI5DEk3dvTwV9An4b5DPUXQhgx55+NdK9Uk6b3QbBqiu8g6kesBvORJAM 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 HmQt5O2ZCCFoWBUSFlY1Wi1XBNRA6FrxcEioOoI0kuureaoddlRnTOgT6QdG EYuEfYEQHzBT5EHMmENqNgy4nsbrsyo/P8K/FiWxa/U7wZkX9FxRw7NkiY9L FQshQSpvgdTRiw2VqxSZGVFkZjSIr9AXDhxg5dVLrS1J7XT4fYNhhepMGMfD qQy8VNR0Wx2WlIw/vjAIHwxj/rHCaGeoqafnAY8k3QxGRGIb5OBWMs3Oe7oc Hp9WuehbxS50B9B32Z5Bhl8C9b/4QPCK1VRwBYMs/m7NI06jcmyv+gic0m/U nUws8DJJhhcfJ1d6RqmT1ZBaVP7nlfkgD/QtVm5zO8VX0mbzA8K2GVkz7nyL /MxgcIxQ9IAg6cRxy3h00b3VTGxUcYUX+0lLG9ItEhzfH1CULYsfKJ6263iv 79ZYg3oL5zE40tEshl3kKxEA9wCYDFkdCe0EEEfSJbrBAyOhesL8TRotgd98 iheABUIu+anCR4rJxtnnekD1A6KiDdR2CohWiNgT2zk1AF0NGa+oSZ4LKv4c EZn68+WYKkHqV+fo54SLim4w7tCVRDSJmLmZIWbkVPYDYTsGX8hN8U1YUg05 1ql7r03ab69n56myWuNmVCSOcq664lifnQ4ti0jqf2lzMtutxhpPRf2EX0yC nVoXPZc6TUGKx7dEg7J9q2P0SwistEvpcnUIvI2dT+VZBgmcHNzBciQudu6B h1NAi2pNGXd900SZ/VE2XlNNrqPC1T/ZAzf76pJPENsTxb6L5/QLAQNe0RYH CnfFFpB9NNoTVweDhRVSUE0IflCNLjAtDiBwIYAPpLJJx0J0HohjBsSGwXwu 5gOa6UOzaKff1xBNNqKQ5fG25fyXC06/JmL7RiuxATy3/1ugL3egOxGYJICC FPbF9o2mTalkXTpVxPLFlwllkAEIJdFnIgZCbIPbLbBRYIgp1iIY6gWjVD0i kCr4zAC2u4wXH4mnOqif1OsEPbLBZr2E8AUxkRIuDlk1JMDRqJSAFvkLcGsH rA+qpGpShf8kuoBNY0BEJJG0oGHZQPwhngAMlA9AcjdXN3IZDwZzAVK457wN a2jolcxl98tbztp+G6h/1xIjqWItmVHbFybYsHvdNZp09fh22fl0+P76Mr4+ saBab0GgKN+SQFEOCRRHWce34p83PFNNh9H8M9VtS4iyF8nyjCDJzjhhzIb2 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 FM1HXsYcYCMvk89nk2HRRv4P/pBDzpMXAQA= --=_f42f4ed51c6dca32e955ca34276e2e01 Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers --=_f42f4ed51c6dca32e955ca34276e2e01--