From 8bc0281150fdcc6d0221f66e3c1d71df09f06df1 Mon Sep 17 00:00:00 2001 From: liuxiaoyu Date: Thu, 17 Aug 2023 14:32:17 +0800 Subject: [PATCH 1/2] Adjust the method of loading the external preloaded shared libraries External lib is preloaded. Need to write to theprocess_shared_preload_libraries.h header file. This loads the external lib through the header file. --- src/backend/utils/init/miscinit.c | 117 +++++++++++++++++- .../utils/process_shared_preload_libraries.h | 0 2 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 src/include/utils/process_shared_preload_libraries.h diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index f2344d0c370..9ec6ae977b3 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -1715,6 +1715,121 @@ char *local_preload_libraries_string = NULL; /* Flag telling that we are loading shared_preload_libraries */ bool process_shared_preload_libraries_in_progress = false; +/* + * process shared preload libraries array. + */ +static const char *process_shared_preload_libraries_array[] = +{ + #include "utils/process_shared_preload_libraries.h" +}; + +/* + * remove duplicates list. + */ +static List* +removeDuplicates(List* elemlist) +{ + List* unique_arr = NIL; + int i, j; + ListCell *l; + ListCell *l2; + for (i = 0; i < list_length(elemlist); i++) + { + bool found = false; + l = &elemlist->elements[i]; + char* a = (char*)lfirst(l); + for (j = 0; j < list_length(unique_arr); j++) + { + l2 = &unique_arr->elements[j]; + char* b = (char*)lfirst(l2); + if (strcmp(a, b) == 0) + { + found = true; + break; + } + } + + if (!found) + { + unique_arr = lappend(unique_arr, pstrdup(a)); + } + } + return unique_arr; +} + +/* + * expand preload load libraries string. + */ +static char* +expand_shared_preload_libraries_string() +{ + List *elemlist = NIL; + List *deduplicate_elemlist = NIL; + ListCell *l; + char *rawstring; + char *libraries = shared_preload_libraries_string; + + /* Need a modifiable copy of string */ + rawstring = pstrdup(libraries); + if (libraries != NULL && libraries[0] != '\0') + { + /* Parse string into list of filename paths */ + if (!SplitDirectoriesString(rawstring, ',', &elemlist)) + { + /* syntax error in list */ + list_free_deep(elemlist); + pfree(rawstring); + ereport(LOG, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid list syntax in parameter \"%s\"", + libraries))); + return NULL; + } + + } + + /* load expand libraries */ + int shared_preload_libraries_num = sizeof(process_shared_preload_libraries_array) / sizeof(char *); + if (shared_preload_libraries_num > 0) + { + for (int i = 0; i < shared_preload_libraries_num; i++) + { + elemlist = lappend(elemlist, pstrdup((char*)process_shared_preload_libraries_array[i])); + } + + } + + if (list_length(elemlist) == 0) + { + list_free_deep(elemlist); + pfree(rawstring); + return NULL; + } + + + /* deduplicate list string */ + if (list_length(elemlist) > 1) + { + deduplicate_elemlist = removeDuplicates(elemlist); + } + + /* format string delimiter with ',' */ + StringInfoData expand_string; + initStringInfo(&expand_string); + for (int i = 0; i < list_length(deduplicate_elemlist); i++) + { + l = &deduplicate_elemlist->elements[i]; + if (i == 0) + appendStringInfo(&expand_string, "%s", (char*)lfirst(l)); + else + appendStringInfo(&expand_string, ",%s", (char*)lfirst(l)); + } + list_free_deep(elemlist); + list_free_deep(deduplicate_elemlist); + pfree(rawstring); + return expand_string.data; +} + /* * load the shared libraries listed in 'libraries' * @@ -1778,7 +1893,7 @@ process_shared_preload_libraries(void) { process_shared_preload_libraries_in_progress = true; - load_libraries(shared_preload_libraries_string, + load_libraries(expand_shared_preload_libraries_string(), "shared_preload_libraries", false); diff --git a/src/include/utils/process_shared_preload_libraries.h b/src/include/utils/process_shared_preload_libraries.h new file mode 100644 index 00000000000..e69de29bb2d From a619c915bc7e90e70515399c3be02aa807c31d49 Mon Sep 17 00:00:00 2001 From: liuxiaoyu Date: Thu, 19 Oct 2023 14:01:04 +0800 Subject: [PATCH 2/2] pfree shared preload libraries return result --- src/backend/utils/init/miscinit.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index 9ec6ae977b3..2e147a7a300 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -1893,9 +1893,14 @@ process_shared_preload_libraries(void) { process_shared_preload_libraries_in_progress = true; - load_libraries(expand_shared_preload_libraries_string(), + char* libraries = expand_shared_preload_libraries_string(); + load_libraries(libraries, "shared_preload_libraries", false); + if (libraries != NULL) + { + pfree(libraries); + } #ifdef ENABLE_PRELOAD_IC_MODULE load_libraries("interconnect",