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 1pHJB8-0004QS-Pp for pgsql-hackers@arkaria.postgresql.org; Mon, 16 Jan 2023 06:41:10 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1pHJB7-0004DT-IX for pgsql-hackers@arkaria.postgresql.org; Mon, 16 Jan 2023 06:41:09 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pHJB7-00044s-2o for pgsql-hackers@lists.postgresql.org; Mon, 16 Jan 2023 06:41:09 +0000 Received: from mail-oi1-x22d.google.com ([2607:f8b0:4864:20::22d]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1pHJB1-0004MF-BU for pgsql-hackers@lists.postgresql.org; Mon, 16 Jan 2023 06:41:08 +0000 Received: by mail-oi1-x22d.google.com with SMTP id s66so21942910oib.7 for ; Sun, 15 Jan 2023 22:41:03 -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=d8i875JO+q1nbtx8od3GemCS5RR1Z7wLMq30iKB7U5g=; b=K4vNbMSVs8rREXhDDG1A3nhB8DFhKYO6DlVtFNP0hu1Kor1h7WcSN9esPoWG7CuQzf utj0BAkavTbrJjCJa/XladXQGAH0E+h/CYa57z7eUdU4k86zOQwVVnW+2hkyNifyFHMW YZhQ56Y/1XiUwENod1PGnHGCYphrU5rub5IXJ/Rs/Oe97UWBOC66Vv9+sOQMvM/BPFYM RST/icr6Zf6YwfVqO0HnatKNV6j3HtADxx+rf2jtYWU3iXbdksKdk2IbdibVysCNz8ZP 0THSBgg9LD5tNvSpaeKi6C5wCxobtSz9ouMWENC9Rvn2Sol6uAjVR/ARspGX6rAmKONk xWYg== 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=d8i875JO+q1nbtx8od3GemCS5RR1Z7wLMq30iKB7U5g=; b=hEbf+1c0byiTVLkKfA9R/5yia4VwpdRzJQPMCr5N3ccFvsJb1rsH5St1jBgisciOeF vl3g21Ob9U7hSWbRx5PHf8AGf0kh5Fn6zioQkWnH+f2WnLafq8XwysHPhOCy2X+wiZ7a dZFLu8jsCSLfFjsJ8DvBhXrt48ZmTkMKksaU0RfQdI3cMAcuYEQQcXa56hOUi5kGf9v0 ZwtMUxzXdpU0lOZ0KD4YQIzNvj+ET+vegmhVr1O1OPGg4KEULFYntZ2dHyj+pxd8K54Y wLL4olzPqu3pjZadZIWQUwnh0ln57SlcH1FgGH0aDcUei6n/i1gbaZMWakQOicKggm/D MM3A== X-Gm-Message-State: AFqh2krsjEVeYQcb+Yv4bH3SipvU98m3Xcu/sWcT7Nafzjn4v42oc3sD tNm8EqgpPGWLEVVQ/IUOIUubRfMxndKTguVYDHY= X-Google-Smtp-Source: AMrXdXsIxD1qtqIOPuDcEmfoQfa7TaosnePePbAvBzdEVMzag/sBI9ridbeUPzBylj5ib6G7mWiC5cm2a5Z8APirGto= X-Received: by 2002:a05:6808:1a81:b0:364:8ca8:7102 with SMTP id bm1-20020a0568081a8100b003648ca87102mr1021933oib.261.1673851262523; Sun, 15 Jan 2023 22:41:02 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Amit Kapila Date: Mon, 16 Jan 2023 12:10:50 +0530 Message-ID: Subject: Re: Perform streaming logical transactions by background workers and parallel apply To: Peter Smith Cc: "houzj.fnst@fujitsu.com" , Masahiko Sawada , shveta malik , "wangw.fnst@fujitsu.com" , "shiy.fnst@fujitsu.com" , PostgreSQL Hackers , Dilip Kumar Content-Type: text/plain; charset="UTF-8" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On Mon, Jan 16, 2023 at 10:24 AM Peter Smith wrote: > > 2. > > /* > + * Return the pid of the leader apply worker if the given pid is the pid of a > + * parallel apply worker, otherwise return InvalidPid. > + */ > +pid_t > +GetLeaderApplyWorkerPid(pid_t pid) > +{ > + int leader_pid = InvalidPid; > + int i; > + > + LWLockAcquire(LogicalRepWorkerLock, LW_SHARED); > + > + for (i = 0; i < max_logical_replication_workers; i++) > + { > + LogicalRepWorker *w = &LogicalRepCtx->workers[i]; > + > + if (isParallelApplyWorker(w) && w->proc && pid == w->proc->pid) > + { > + leader_pid = w->leader_pid; > + break; > + } > + } > + > + LWLockRelease(LogicalRepWorkerLock); > + > + return leader_pid; > +} > > 2a. > IIUC the IsParallelApplyWorker macro does nothing except check that > the leader_pid is not InvalidPid anyway, so AFAIK this algorithm does > not benefit from using this macro because we will want to return > InvalidPid anyway if the given pid matches. > > So the inner condition can just say: > > if (w->proc && w->proc->pid == pid) > { > leader_pid = w->leader_pid; > break; > } > Yeah, this should also work but I feel the current one is explicit and more clear. > ~ > > 2b. > A possible alternative comment. > > BEFORE > Return the pid of the leader apply worker if the given pid is the pid > of a parallel apply worker, otherwise return InvalidPid. > > > AFTER > If the given pid has a leader apply worker then return the leader pid, > otherwise, return InvalidPid. > I don't think that is an improvement. > ====== > > src/backend/utils/adt/pgstatfuncs.c > > 3. > > @@ -434,6 +435,16 @@ pg_stat_get_activity(PG_FUNCTION_ARGS) > values[28] = Int32GetDatum(leader->pid); > nulls[28] = false; > } > + else > + { > + int leader_pid = GetLeaderApplyWorkerPid(beentry->st_procpid); > + > + if (leader_pid != InvalidPid) > + { > + values[28] = Int32GetDatum(leader_pid); > + nulls[28] = false; > + } > + > > 3a. > There is an existing comment preceding this if/else but it refers only > to leaders of parallel groups. Should that comment be updated to > mention the leader apply worker too? > Yeah, we can slightly adjust the comments. How about something like the below: index 415e711729..7eb668634a 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -410,9 +410,9 @@ pg_stat_get_activity(PG_FUNCTION_ARGS) /* * If a PGPROC entry was retrieved, display wait events and lock - * group leader information if any. To avoid extra overhead, no - * extra lock is being held, so there is no guarantee of - * consistency across multiple rows. + * group leader or apply leader information if any. To avoid extra + * overhead, no extra lock is being held, so there is no guarantee + * of consistency across multiple rows. */ if (proc != NULL) { @@ -428,7 +428,7 @@ pg_stat_get_activity(PG_FUNCTION_ARGS) /* * Show the leader only for active parallel workers. This * leaves the field as NULL for the leader of a parallel - * group. + * group or the leader of a parallel apply. */ if (leader && leader->pid != beentry->st_procpid) > ~ > > 3b. > It may be unrelated to this patch, but it seems strange to me that the > nulls[28]/values[28] assignments are done where they are. Every other > nulls/values assignment of this function here is pretty much in the > correct numerical order except this one, so IMO this code ought to be > relocated to later in this same function. > This is not related to the current patch but I see there is merit in the current coding as it is better to retrieve all the fields of proc together. -- With Regards, Amit Kapila.