Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1e8AiW-0002u9-7g for pgsql-hackers@arkaria.postgresql.org; Fri, 27 Oct 2017 19:54:56 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84_2) (envelope-from ) id 1e8AiV-00073z-KY for pgsql-hackers@arkaria.postgresql.org; Fri, 27 Oct 2017 19:54:55 +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_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1e8Agr-0004Ie-J8 for pgsql-hackers@postgresql.org; Fri, 27 Oct 2017 19:53:13 +0000 Received: from mail.postgrespro.ru ([93.174.131.138]) by magus.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1e8Agn-0005Oi-N6 for pgsql-hackers@postgresql.org; Fri, 27 Oct 2017 19:53:13 +0000 Received: from localhost (localhost [127.0.0.1]) by mail.postgrespro.ru (Postfix) with ESMTP id 1D48521C2046; Fri, 27 Oct 2017 22:53:09 +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 3643221C08FD; Fri, 27 Oct 2017 22:53:08 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1509133988; bh=U62kYTyZOHxKe2aZUfzUMqAchQyHAt4kwOV2x/yaUmo=; h=Date:From:To:Cc:Subject:In-Reply-To:References; b=bCaXiQ8CiGyW4nxk1eWBPcXe/hcLXvRHvXMXCei6yaVB6VE9xouA8OI8kKbacyIXO VB9WTgy/dyQyWlELAH6Zt6++uiyazdO42rVf2KWYwQgcYQ2mhQYIfsXBOVX/EHO8Bd yrz/IAdIHN9B4xmPVuLD3o4cNiH2bMQ4mbM4jC14= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_b93df514b6ed4035628a2a0cf5f63613" Date: Fri, 27 Oct 2017 22:53:08 +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: <0e46521cbbca66c3298d1a9d672c9af0@postgrespro.ru> 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 --=_b93df514b6ed4035628a2a0cf5f63613 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed On 2017-10-26 22:01, Sokolov Yura wrote: > 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`. Small improvement compared to v7: - twophase_gid is written with alignment padding in the XactLogCommitRecord and XactLogAbortRecord. -- Sokolov Yura Postgres Professional: https://postgrespro.ru The Russian Postgres Company --=_b93df514b6ed4035628a2a0cf5f63613 Content-Transfer-Encoding: base64 Content-Type: application/x-gzip; name=logical_twophase_v8.diff.gz Content-Disposition: attachment; filename=logical_twophase_v8.diff.gz; size=15033 H4sICGyK81kAA2xvZ2ljYWxfdHdvcGhhc2VfdjguZGlmZgDsPWlzGse2n8Wv 6DgVA2IRAwgkq5xcLMk29WRJheRr10tS3GGmgbkaZsgsksjy3985p7tnAQaN Fsd2nlUVCaa7T/fZtx7HtMZjVqtNrIDpO4brBJ412gm4HwxNbrim5Ux2+O2c GwE3d+Yen+seN+tuGLDRfWYXLMfkt6zd4fvartkej+v18X6n2xk1eUNjWqPR abcLtVrtfmcoVCqVe57jX/9itU5V22cV+N1sMfh+cXxyfHjJipZjBUX2enD2 js0nQ8PjesCHtjuxDN0eAgwbPgSW6wx92w1KRY9PPO776kGxyoriAAXGEFSB lTTmuTflAivUDgfHvctjdtl7dXLMaJo6lVayTJgflA82zWrGsypPc95hc27E Z5ZEKyJ89pPh2uHM+YkVKrXoB54TVhWFVeUpTzJ03LFlB9x77JHuJjSfcI/N PWumewt2xRcI/27Cr1sF4jrgoc9N9lvIPYv7hcovPg/YhAeAD2DFipJCph7o EX0UYQh3nGtMdWfC/VJxRaaAGqfvT07U7yJQ2rBDk9duLdPH0WKxIf74V9a8 xmfzYFG71Y1ADmpFIF8xcawbK5g+wcFIeJ7gcPgnuHHnU93ntYjjG48eScpT 4BCL3SdHZnWU1xClGqiGDqeuyYOmsAfDTOLIfGs2tznzQ8MAFMahzUDumDtm OlOSyvA0Bfbq+E3/9KDA+qcXx4NL+HN5tqQH7N+9k/fHF2CeQIjZ+eD4vDcA 2R/0Ti96h5f9s1OpgWrB91oRhP1FJNWgdkRypYqgfw3UP58U8EWCVzAz44cA ZPwkVTz/D+xFqMPfQB8BrebhCOxOPY37C0mXF8wyf5Zq/esLDRblogOg2lqP aiRJ/2yc2eHZu3f9S7Xy6G5R+WqIITDL5vAKLutQyHX0aLMNZEw5tXyC9red J49taaJtUdZLH7le8Fhr1cpprZpfpwg2HyKCXwEuD4fSymehmiibnX+IVf6c lGODs5OTV73D/8k0A6uq9dBAYA3V8xAb4PRenQ2yDVXziQznJzhMHhvXTlrN lKlkmOTqkO44E2aadmQ5MZ9tdqrtXVbRWo1qs9nBlDbHVru4Ve/k8niwNlli vaMjkMST9+9OBX0CfhvkM9QdCGDHnn410r1iTpvdAsGqKbyDqR6wG85EkAyI ex4k8vaC3Uwt0APdYaFjuLOZFUB2v+RQEAjyG2nE+K3lB36dHvo4C9JSqUwj bugygg6mnNmuccXGnjujb0QVcZ6p5QM824ZTzHDV2PU4zSnuFpGx6NqueZXp vpgrzuWrmVYAu2eSrBmRrEvZ/2YfrGg0068wEQDofhCOx/Abz3fjelf+hr1i 9uzhXjnOtF8W+xk2151wXqgdDc7O18rKQfZYU8Dwp0AqSL5CO4BD3i9vW62z pBK1VJ4G3xv4ayVHg2daMVk8SZ1yqBVZ7wIOaFOZokryECzmwNgZiGChEp/S ACpXPrw9BnlWk9hLVlRLi2hceqdHESwcTFOr+OIFoGTYuu8fCFMUzcWfP2O4 fyprhIfYZJoqaz+mTdUSwgA82vZPNnBvjm+Bjr51zU9g+7vm9ygNXVpSai4Z /68q/mr/g+KvPLjE7jDr3DnRS2LKHoLpevSZRL/2sGzuATRjimaP2Lr5kK13 H7KoQ0z5Gd3yry8if5sv8GthYNKN5QIs9OVjPW9ljedlZ6HHsNwoK3Zg4O2R Dq6WXCoaaabqZOiJyVTHgGRhjElPwOBsCrfAmoFt9l06LFjdQB3ZCpjj3tQR CAF6Dz5eX3b+4JrJh0NIZYSAogOYe7rjw/Zo3lRskAoMCFoUHEgEAnfOQp9Z js+9AJEA7rg0y4VfHnMdHh/lA0c3GNomHAfih25RBQkYSlgOc4FW0kUyH7wa IaPiibHl+YGElTOe+JJtcHO9THdjHfwybPAjLEH7UxHg8+S0ihLs6ZDKEe/m kuF8eD+aBOvp8ggv/bRmP6Jw+75681npl0euMun3gEUZ9GN30u+z1F1b6XLG HdlftmdIZ395PMh+Xg9yH9l5GsF5jM7tJdnvhLZ9v3pbhoXbT+pfRinyGwUf S8Ecju8zkPIRBmyVlCspyAPc7X4MpVZqRjl5kqpgRw6nHCLb/xyevL+AePY/ rKT7zJ1zT2T4lAhMXYhVucrxKRQuQ7TNfYy3Rzbl/ABJVm6iSB6iVFmbzGOP tEaVFSlaNlybKjTySMsL3l/0T98sPRzOr/gi5z5aYp8mbXR3okT1HgxDFEIi 0pdhftpwXut2CElKSWveAzYV1Df7gHieKl3hFRusHn3SmlW0SbpalagBJcpU VJ8qrK9Cre0NgNhcUC6EooTpkO4sgilmUJT5YcqYSAzHj89lHqrtj7FpWlZL L4U9prJ4nQ5omkS7jvy+BPcOaesMMtShmge80fwoNH5UUvTZiJJbO+6MkKJ5 9w/b7k+ux1PuMQTNKnY1UhFtZEofBEtbC6uZr6wkrOUXKRx7sXAMjtfqVT47 XBS3/l4BZUQJCANv5rjeTLftBdPHWOW64bJsc9/09Zv4ZYvfU6S33+j7cPpu sqNrqZqXhPm0eCUPVl3JyoauZOZYU6hxqitZ+Zxdycx7FKygrqfDaUzPnee4 iI4998zpjG4MdJvVFqu0drvV/cQN+HtukbzgXrkvCLpBTKhnn3SDBMG6pESY d7/E4P9mx28CwJfM9waWJ8pXF3i32WntdztdXq9rreao1eD73VGeVxdWAG56 a2FlMrJLq0IeV9GqbQ24RRdEYIppGWABLNsKFigk4NMWjjH1XMcN/aFwQBAs us5BJEJP9oZD8mr+p34b4e96x+CJX9L4O99D+PYmwrc3ET75mwhf6rsI6SAw 44bDfW+t5wKa9xb0l3IPOhdS978Dmgts/tuP4kZjt6rtsUq7U+22MUD5ku4p sk94U/GLu572EFbXPut1y2+XWb6myyzZerrhMktOi3Pf+wU5wd7RhM1jebAJ mwfzlSZsniN+6+/cv7/zhXR4vogezyO7M5+mvZEh6tnF3Nzl3IcXdPPbC1Ws YhuKVRj2tPewLKM1W1WKejaUr9hnrFY9sCb14BJRjuJO6lvdyKyuLM2TpR2t tTtqjbqd1l693uo0O3utMefjPKWdZXibKjvLcynObVc7rAK/96iw871kBHuW IM7ODGiiT3h9+ixrhutZE8uhCYVKPAVcugcLd+aea+iepy9wRiUJJATH5e+M QhBWMHxLO4hB21/4hm5Ml/cXozM+ow84SBLcQYRAjhEhhlbI5OgfvRCznK2R 69pbWyhZQ5KsIUnWQTSCX4c3nhtwJbvxmOvYC9Ra3QZZks9UGhvRNWuIk2oO ZRSWAP4XBYtHcvkRjJOAo0mxDHbtWiYJrIABT70gnJdOhKKpVYfAb8g62LYR 3FYhTAzmYXBuh8CSsznyx2fb7jyoin97ZA8J1G1ifgPf1+8jOb5xH6AL/DA2 4K5ncu8VxCHcu/x4yraDW/AUH2HtgBvngccktKHtO9EqpFEyTtTtKkaQEDYD aTy2DaZmbMWbXFi/Q6zze3qOhIuqLdEgqICGMH7KXm1Go7IJDTUqNpxYZmKz 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 GwEA --=_b93df514b6ed4035628a2a0cf5f63613 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 --=_b93df514b6ed4035628a2a0cf5f63613--