java-topology/defects/pgbouncer-0002/patch/pgbouncer-0002.patch

73 lines
2.3 KiB
Diff

# UNDF: UNDF-2026-000001188
--- a/src/objects.c
+++ b/src/objects.c
@@ -28,6 +28,12 @@
STATLIST(database_list);
STATLIST(pool_list);
STATLIST(peer_list);
STATLIST(peer_pool_list);
+/* AA-tree index for O(log D) database lookup by name.
+ * Mirrors the pattern used by user_tree for global user lookup. */
+static struct AATree db_name_tree;
+
+static int db_name_node_cmp(uintptr_t nameptr, struct AANode *node)
+{
+ PgDatabase *db = container_of(node, PgDatabase, name_tree_node);
+ return strcmp((const char *)nameptr, db->name);
+}
/* find an existing database */
PgDatabase *find_database(const char *name)
{
- struct List *item, *tmp;
- PgDatabase *db;
- statlist_for_each(item, &database_list) {
- db = container_of(item, PgDatabase, head);
- if (strcmp(db->name, name) == 0)
- return db;
- }
- /* also trying to find in idle autodatabases list */
- statlist_for_each_safe(item, &autodatabase_idle_list, tmp) {
- db = container_of(item, PgDatabase, head);
- if (strcmp(db->name, name) == 0) {
- db->inactive_time = 0;
- statlist_remove(&autodatabase_idle_list, &db->head);
- put_in_order(&db->head, &database_list, cmp_database);
- return db;
- }
- }
- return NULL;
+ struct List *item, *tmp;
+ PgDatabase *db;
+ struct AANode *node;
+
+ /* O(log D) lookup in the AA-tree index */
+ node = aatree_search(&db_name_tree, (uintptr_t)name);
+ if (node) {
+ db = container_of(node, PgDatabase, name_tree_node);
+ return db;
+ }
+
+ /* also trying to find in idle autodatabases list (linear, but rare) */
+ statlist_for_each_safe(item, &autodatabase_idle_list, tmp) {
+ db = container_of(item, PgDatabase, head);
+ if (strcmp(db->name, name) == 0) {
+ db->inactive_time = 0;
+ statlist_remove(&autodatabase_idle_list, &db->head);
+ put_in_order(&db->head, &database_list, cmp_database);
+ aatree_insert(&db_name_tree, (uintptr_t)db->name, &db->name_tree_node);
+ return db;
+ }
+ }
+ return NULL;
}
/* create new object if new, then return it */
PgDatabase *add_database(const char *name)
@@ -480,6 +506,7 @@ PgDatabase *add_database(const char *name)
aatree_init(&db->user_tree, credentials_node_cmp, credentials_node_release);
put_in_order(&db->head, &database_list, cmp_database);
+ aatree_insert(&db_name_tree, (uintptr_t)db->name, &db->name_tree_node);
}
return db;