From 432f399a5d27ea91652157b9e520afe6a28a229a Mon Sep 17 00:00:00 2001 From: Marco Slot Date: Thu, 1 Sep 2022 14:26:43 +0200 Subject: [PATCH] Allow citus_internal application_name with additional suffix (#6282) Co-authored-by: Marco Slot --- .../distributed/transaction/backend_data.c | 16 ++++++++-------- .../regress/expected/metadata_sync_helpers.out | 16 ++++++++++++++++ src/test/regress/sql/metadata_sync_helpers.sql | 7 +++++++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/backend/distributed/transaction/backend_data.c b/src/backend/distributed/transaction/backend_data.c index 34d90969b..670469cd7 100644 --- a/src/backend/distributed/transaction/backend_data.c +++ b/src/backend/distributed/transaction/backend_data.c @@ -1064,16 +1064,16 @@ ExtractGlobalPID(char *applicationName) return INVALID_CITUS_INTERNAL_BACKEND_GPID; } - /* are the remaining characters of the application name numbers */ - uint64 numberOfRemainingChars = strlen(applicationNameCopy) - prefixLength; - if (numberOfRemainingChars <= 0 || - !strisdigit_s(applicationNameCopy + prefixLength, numberOfRemainingChars)) - { - return INVALID_CITUS_INTERNAL_BACKEND_GPID; - } - char *globalPIDString = &applicationNameCopy[prefixLength]; uint64 globalPID = strtoul(globalPIDString, NULL, 10); + if (globalPID == 0) + { + /* + * INVALID_CITUS_INTERNAL_BACKEND_GPID is 0, but just to be explicit + * about how we handle strtoul errors. + */ + return INVALID_CITUS_INTERNAL_BACKEND_GPID; + } return globalPID; } diff --git a/src/test/regress/expected/metadata_sync_helpers.out b/src/test/regress/expected/metadata_sync_helpers.out index 9800f5031..1939fcf1c 100644 --- a/src/test/regress/expected/metadata_sync_helpers.out +++ b/src/test/regress/expected/metadata_sync_helpers.out @@ -108,6 +108,22 @@ BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED; SET application_name to 'citus_internal gpid=not a correct gpid'; SELECT citus_internal_add_partition_metadata ('test_2'::regclass, 'h', 'col_1', 0, 's'); ERROR: This is an internal Citus function can only be used in a distributed transaction +ROLLBACK; +-- application_name with suffix is ok (e.g. pgbouncer might add this) +BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED; + SELECT assign_distributed_transaction_id(0, 8, '2021-07-09 15:41:55.542377+02'); + assign_distributed_transaction_id +--------------------------------------------------------------------- + +(1 row) + + SET application_name to 'citus_internal gpid=10000000001 - from 10.12.14.16:10370'; + SELECT citus_internal_add_partition_metadata ('test_2'::regclass, 'h', 'col_1', 0, 's'); + citus_internal_add_partition_metadata +--------------------------------------------------------------------- + +(1 row) + ROLLBACK; -- application_name with empty gpid BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED; diff --git a/src/test/regress/sql/metadata_sync_helpers.sql b/src/test/regress/sql/metadata_sync_helpers.sql index 1f0ad09d0..ca32c5f16 100644 --- a/src/test/regress/sql/metadata_sync_helpers.sql +++ b/src/test/regress/sql/metadata_sync_helpers.sql @@ -75,6 +75,13 @@ BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT citus_internal_add_partition_metadata ('test_2'::regclass, 'h', 'col_1', 0, 's'); ROLLBACK; +-- application_name with suffix is ok (e.g. pgbouncer might add this) +BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED; + SELECT assign_distributed_transaction_id(0, 8, '2021-07-09 15:41:55.542377+02'); + SET application_name to 'citus_internal gpid=10000000001 - from 10.12.14.16:10370'; + SELECT citus_internal_add_partition_metadata ('test_2'::regclass, 'h', 'col_1', 0, 's'); +ROLLBACK; + -- application_name with empty gpid BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT assign_distributed_transaction_id(0, 8, '2021-07-09 15:41:55.542377+02');