From 5ff1821411690cb1922af3d6131ab330f4bcd967 Mon Sep 17 00:00:00 2001 From: Marco Slot Date: Mon, 4 Mar 2019 13:38:15 +0100 Subject: [PATCH] Cache the current database name Purely for performance reasons. --- .../connection/connection_management.c | 2 +- .../executor/multi_task_tracker_executor.c | 2 +- .../distributed/planner/multi_explain.c | 2 +- .../distributed/utils/metadata_cache.c | 30 +++++++++++++++++++ .../worker/task_tracker_protocol.c | 2 +- .../worker/worker_data_fetch_protocol.c | 2 +- src/include/distributed/metadata_cache.h | 3 ++ 7 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/backend/distributed/connection/connection_management.c b/src/backend/distributed/connection/connection_management.c index c8c509a70..f95f5f8ab 100644 --- a/src/backend/distributed/connection/connection_management.c +++ b/src/backend/distributed/connection/connection_management.c @@ -251,7 +251,7 @@ StartNodeUserDatabaseConnection(uint32 flags, const char *hostname, int32 port, } else { - strlcpy(key.database, get_database_name(MyDatabaseId), NAMEDATALEN); + strlcpy(key.database, CurrentDatabaseName(), NAMEDATALEN); } if (CurrentCoordinatedTransactionState == COORD_TRANS_NONE) diff --git a/src/backend/distributed/executor/multi_task_tracker_executor.c b/src/backend/distributed/executor/multi_task_tracker_executor.c index ae4dcd682..ae175f510 100644 --- a/src/backend/distributed/executor/multi_task_tracker_executor.c +++ b/src/backend/distributed/executor/multi_task_tracker_executor.c @@ -871,7 +871,7 @@ TrackerConnectPoll(TaskTracker *taskTracker) { char *nodeName = taskTracker->workerName; uint32 nodePort = taskTracker->workerPort; - char *nodeDatabase = get_database_name(MyDatabaseId); + char *nodeDatabase = CurrentDatabaseName(); char *nodeUser = taskTracker->userName; int32 connectionId = MultiClientConnectStart(nodeName, nodePort, diff --git a/src/backend/distributed/planner/multi_explain.c b/src/backend/distributed/planner/multi_explain.c index 8b92b8578..5d4036eb0 100644 --- a/src/backend/distributed/planner/multi_explain.c +++ b/src/backend/distributed/planner/multi_explain.c @@ -507,7 +507,7 @@ ExplainTaskPlacement(ShardPlacement *taskPlacement, List *explainOutputList, StringInfo nodeAddress = makeStringInfo(); char *nodeName = taskPlacement->nodeName; uint32 nodePort = taskPlacement->nodePort; - char *nodeDatabase = get_database_name(MyDatabaseId); + char *nodeDatabase = CurrentDatabaseName(); ListCell *explainOutputCell = NULL; int rowIndex = 0; diff --git a/src/backend/distributed/utils/metadata_cache.c b/src/backend/distributed/utils/metadata_cache.c index 1c397daab..14159a3ae 100644 --- a/src/backend/distributed/utils/metadata_cache.c +++ b/src/backend/distributed/utils/metadata_cache.c @@ -24,6 +24,7 @@ #include "catalog/pg_namespace.h" #include "catalog/pg_type.h" #include "citus_version.h" +#include "commands/dbcommands.h" #include "commands/extension.h" #include "commands/trigger.h" #include "distributed/colocation_utils.h" @@ -137,6 +138,8 @@ typedef struct MetadataCacheData Oid unavailableNodeRoleId; Oid pgTableIsVisibleFuncId; Oid citusTableIsVisibleFuncId; + bool databaseNameValid; + char databaseName[NAMEDATALEN]; } MetadataCacheData; @@ -2102,6 +2105,33 @@ CitusTableVisibleFuncId(void) } +/* + * CurrentDatabaseName gets the name of the current database and caches + * the result. + * + * Given that the database name cannot be changed when there is at least + * one session connected to it, we do not need to implement any invalidation + * mechanism. + */ +char * +CurrentDatabaseName(void) +{ + if (!MetadataCache.databaseNameValid) + { + char *databaseName = get_database_name(MyDatabaseId); + if (databaseName == NULL) + { + return NULL; + } + + strlcpy(MetadataCache.databaseName, databaseName, NAMEDATALEN); + MetadataCache.databaseNameValid = true; + } + + return MetadataCache.databaseName; +} + + /* * CitusExtensionOwner() returns the owner of the 'citus' extension. That user * is, amongst others, used to perform actions a normal user might not be diff --git a/src/backend/distributed/worker/task_tracker_protocol.c b/src/backend/distributed/worker/task_tracker_protocol.c index 380325a89..d448a2c6a 100644 --- a/src/backend/distributed/worker/task_tracker_protocol.c +++ b/src/backend/distributed/worker/task_tracker_protocol.c @@ -368,7 +368,7 @@ CreateTask(uint64 jobId, uint32 taskId, char *taskCallString) { WorkerTask *workerTask = NULL; uint32 assignmentTime = 0; - char *databaseName = get_database_name(MyDatabaseId); + char *databaseName = CurrentDatabaseName(); char *userName = CurrentUserName(); /* increase task priority for cleanup tasks */ diff --git a/src/backend/distributed/worker/worker_data_fetch_protocol.c b/src/backend/distributed/worker/worker_data_fetch_protocol.c index 82c50a27c..5d5719aa3 100644 --- a/src/backend/distributed/worker/worker_data_fetch_protocol.c +++ b/src/backend/distributed/worker/worker_data_fetch_protocol.c @@ -248,7 +248,7 @@ ReceiveRegularFile(const char *nodeName, uint32 nodePort, const char *nodeUser, } /* we use the same database name on the master and worker nodes */ - nodeDatabase = get_database_name(MyDatabaseId); + nodeDatabase = CurrentDatabaseName(); /* connect to remote node */ connectionId = MultiClientConnect(nodeName, nodePort, nodeDatabase, nodeUser); diff --git a/src/include/distributed/metadata_cache.h b/src/include/distributed/metadata_cache.h index 6ade86ed8..dfe2bed5e 100644 --- a/src/include/distributed/metadata_cache.h +++ b/src/include/distributed/metadata_cache.h @@ -167,4 +167,7 @@ extern Oid BinaryCopyFormatId(void); extern Oid CitusExtensionOwner(void); extern char * CitusExtensionOwnerName(void); extern char * CurrentUserName(void); +extern char * CurrentDatabaseName(void); + + #endif /* METADATA_CACHE_H */