Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pDfgr-0005Ek-4f for pgsql-hackers@arkaria.postgresql.org; Fri, 06 Jan 2023 05:54:53 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1pDfgp-0007PC-Lp for pgsql-hackers@arkaria.postgresql.org; Fri, 06 Jan 2023 05:54:51 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pDfgp-0007P2-9C for pgsql-hackers@lists.postgresql.org; Fri, 06 Jan 2023 05:54:51 +0000 Received: from mail-yb1-xb2c.google.com ([2607:f8b0:4864:20::b2c]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1pDfgi-0000Ph-Gq for pgsql-hackers@lists.postgresql.org; Fri, 06 Jan 2023 05:54:50 +0000 Received: by mail-yb1-xb2c.google.com with SMTP id 188so843078ybi.9 for ; Thu, 05 Jan 2023 21:54:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=FrLN9198kP1xA1K6YY+09309ObdO06kLuVDij/MK2c8=; b=eoYJBl+/QXoRRvZZiIEAt5e/g28NJwJmFazwuBhkR8xS6+eblrtkSWmiHas46z3eEk bz9kRIwkupBWXOKEvz24JIEQbOEeOAqOgQJLRq7VJaCb84osnZIySbKTy3AQwP0Phb3R +Eg5mGWdd9yjq/t+X8pDzCJUFoPpwN9eisPVjKgNKxcX4L3B/dKQqWCb8sVRBL1bWiex ffm4fPDEeu/zj5ahvTHqx6+z+pU97V3eivl4caulySGmzLjn1JcUVe9niUtpzyI6NfKx aUwhsbbGT9IvYfV49WmZAYctMrJkEgRz71cS/VAowamO60RQuw5l0k5LogSiidsRtgLj scTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=FrLN9198kP1xA1K6YY+09309ObdO06kLuVDij/MK2c8=; b=yizDEvfKb0WBoBjkfhcU7PXQxcFdkPi7ZA1HEfrHbvnNQ0b374b4LE5WocHzh6ZhgL 9BBEB3bqN8iTqxhD2D/0/5ujgrgORyKAyTm3MMJqU7FZVBs3nnqvRcP482Qg3wdXOh+/ m+hUeEuwEswIWRZ0+PkORh/XSr324yXAuki8ZkZWtNuotPHQtD39U2jHPe6kfT8Kq2c/ JusvRU19PnqiUXOUCsbs5I52+HGoZRjHYwH+g7pP+SRZTPuEtkGQeSK+Y9xHRxc5JBcL 0sGCrjdQpztdrWaHV2MNM8eqoz2AcyvyTaXuHmiRr/aXPudA7g9wALYGggmxT/GCIwne JSmA== X-Gm-Message-State: AFqh2kqeVVdu3j5/9+Eg9nNT4CLZkkfaPj1HEwoGyQgDH2o86ZcCebxu llWM4JrZpo3/YpVy5fUdG12FvUZFXSCeadHm80M= X-Google-Smtp-Source: AMrXdXsLeDzWefCp3uPFMBea2Cfs2/970KekvjN2pnBrrMK+xHhMyxTGsI5AB6tRcdNsN1zfucY6+WCPUZOl1DIHD7M= X-Received: by 2002:a05:6902:4ad:b0:740:4e48:24e3 with SMTP id r13-20020a05690204ad00b007404e4824e3mr5862738ybs.235.1672984482476; Thu, 05 Jan 2023 21:54:42 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Dilip Kumar Date: Fri, 6 Jan 2023 11:24:25 +0530 Message-ID: Subject: Re: Perform streaming logical transactions by background workers and parallel apply To: "houzj.fnst@fujitsu.com" Cc: Amit Kapila , Masahiko Sawada , "wangw.fnst@fujitsu.com" , Peter Smith , "shiy.fnst@fujitsu.com" , PostgreSQL Hackers Content-Type: text/plain; charset="UTF-8" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On Fri, Jan 6, 2023 at 9:37 AM houzj.fnst@fujitsu.com wrote: > > On Thursday, January 5, 2023 7:54 PM Dilip Kumar wrote: > Thanks, I have started another thread[1] > > Attach the parallel apply patch set here again. I didn't change the patch set, > attach it here just to let the CFbot keep testing it. I have completed the review and some basic testing and it mostly looks fine to me. Here is my last set of comments/suggestions. 1. /* * Don't start a new parallel worker if user has set skiplsn as it's * possible that they want to skip the streaming transaction. For * streaming transactions, we need to serialize the transaction to a file * so that we can get the last LSN of the transaction to judge whether to * skip before starting to apply the change. */ if (!XLogRecPtrIsInvalid(MySubscription->skiplsn)) return false; I think this is fine to block parallelism in this case, but it is also possible to make it less restrictive, basically, only if the first lsn of the transaction is <= skiplsn, then only it is possible that the final_lsn might match with skiplsn otherwise that is not possible. And if we want then we can allow parallelism in that case. I understand that currently we do not have first_lsn of the transaction in stream start message but I think that should be easy to do? Although I am not sure if it is worth it, it's good to make a note at least. 2. + * XXX Additionally, we also stop the worker if the leader apply worker + * serialize part of the transaction data due to a send timeout. This is + * because the message could be partially written to the queue and there + * is no way to clean the queue other than resending the message until it + * succeeds. Instead of trying to send the data which anyway would have + * been serialized and then letting the parallel apply worker deal with + * the spurious message, we stop the worker. + */ + if (winfo->serialize_changes || + list_length(ParallelApplyWorkerPool) > + (max_parallel_apply_workers_per_subscription / 2)) IMHO this reason (XXX Additionally, we also stop the worker if the leader apply worker serialize part of the transaction data due to a send timeout) for stopping the worker looks a bit hackish to me. It may be a rare case so I am not talking about the performance but the reasoning behind stopping is not good. Ideally we should be able to clean up the message queue and reuse the worker. 3. + else if (shmq_res == SHM_MQ_WOULD_BLOCK) + { + /* Replay the changes from the file, if any. */ + if (pa_has_spooled_message_pending()) + { + pa_spooled_messages(); + } I think we do not need this pa_has_spooled_message_pending() function. Because this function is just calling pa_get_fileset_state() which is acquiring mutex and getting filestate then if the filestate is not FS_EMPTY then we call pa_spooled_messages() that will again call pa_get_fileset_state() which will again acquire mutex. I think when the state is FS_SERIALIZE_IN_PROGRESS it will frequently call pa_get_fileset_state() consecutively 2 times, and I think we can easily achieve the same behavior with just one call. 4. + * leader, or when there there is an error. None of these cases will allow + * the code to reach here. /when there there is an error/when there is an error -- Regards, Dilip Kumar EnterpriseDB: http://www.enterprisedb.com