Re: BUG #18624: Memory Leak Issue with PostgreSQL Connection During COPY Command Execution.

Поиск
Список
Период
Сортировка
От Junwang Zhao
Тема Re: BUG #18624: Memory Leak Issue with PostgreSQL Connection During COPY Command Execution.
Дата
Msg-id CAEG8a3Kb+SNKKW_q6qV+ah3FRyW4omujjzXDo3rJ-xB2w=+z7Q@mail.gmail.com
обсуждение исходный текст
Ответ на BUG #18624: Memory Leak Issue with PostgreSQL Connection During COPY Command Execution.  (PG Bug reporting form <noreply@postgresql.org>)
Список pgsql-bugs
On Thu, Sep 19, 2024 at 4:28 PM PG Bug reporting form
<noreply@postgresql.org> wrote:
>
> The following bug has been logged on the website:
>
> Bug reference:      18624
> Logged by:          Abhishek Mittal
> Email address:      abhmittal@gmail.com
> PostgreSQL version: 12.16
> Operating system:   ubuntu0.20.04.1
> Description:
>
> We are currently experiencing a memory leak issue with the PostgreSQL
> connection process while executing the COPY command multiple times on the
> same connection.
>
> Issue Details:
> 1. We establish a connection using the following command:
> psql <DB_NAME> <USER_NAME>
>
> 2. We retrieve the process ID associated with this connection from the
> pg_stat_activity table using the query:
> SELECT pid, query FROM pg_stat_activity;
>
> 3. We then monitor this process ID using the top command:
> top -p <PID>
>
> 4. We observe that the RES (resident) memory reported by the top command
> continuously increases. This memory increase only occurs when we run queries
> on this connection. If no queries are executed, the RES memory remains
> stable.
>
> 5. We attempted to clear the cache by executing the DISCARD ALL command
> after each query, but the issue persists.
>
> Additionally, we tested the process using a C program with libpg, and the
> issue remains the same.
>
> Additional Information:
> We are executing only the COPY command to copy a CSV file into a database
> table.
> In our scenario, the RES memory usage has reached approximately 10 GB.
>
> Could you please provide guidance or recommend a solution to address this
> memory leak issue?
>
>
> Please find the sample C program below.
> int db_copy_into_db(PGconn *conn, char *buf, int read_bytes)
> {
>   PGresult *res;
>   char copy_cmd[1024];
>   int ret;
>
>   /*If read_bytes are 0 then no need for further processing */
>   if(!read_bytes)
>     return 0;
>
>   sprintf(copy_cmd, "COPY %s FROM STDIN WITH DELIMITER ',' NULL AS '' CSV",
> "my_table");
>   res = PQexec(conn, copy_cmd);
>   if (PQresultStatus(res) != PGRES_COPY_IN)
>   {
>     fprintf(stderr,"COPY command for %s table failed: %s\n",
> "urltable_1114", PQerrorMessage(conn));
>     conn = NULL;
>     return -1;
>   }
>   //fprintf(stdout ,"COPY command is started\n");
>
>   ret = PQputCopyData(conn, buf, read_bytes);
>   //fprintf(stdout, "ret = %d\n", ret);
>   if(ret == -1)
>   {
>     fprintf(stderr, "PQputCopyData command failed: %s\n",
> PQerrorMessage(conn));
>     conn = NULL;
>     return -1;
>   }
>
>   /* Ends the COPY_IN operation successfully if errormsg is NULL.
>    * If errormsg is not NULL then the COPY is forced to fail,
>    * with the string pointed to by errormsg used as the error message. */
>   if(PQputCopyEnd(conn, NULL) != 1)
>   {
>     fprintf(stderr,"PQputCopyEnd() command for %s table failed: %s\n",
> "urltable_1114", PQerrorMessage(conn));
>     conn = NULL;
>   }
>   PQclear(res);
>   res = PQexec(conn, "DISCARD ALL");
>
>   if (PQresultStatus(res) != PGRES_COMMAND_OK)
>   {
>     fprintf(stderr, "DISCARD ALL command failed: %s",
> PQerrorMessage(conn));
>   }
>   PQclear(res);
>   return 0;
> }
>
> void read_csv_and_copy_inio_db( char *csv_file, PGconn *conn)
> {
>  char* read_buf = malloc(sizeof(char) * 1024 * 1024 * 20);
>  int read_bytes;
>
>  /* 1. open file
>   * read bufer
>   */
>   int fd;
>   int status;
>   fd = open(csv_file, O_RDONLY);
>   while (1)
>   {
>     //seek to byke 0
>     status = lseek(fd, 0, SEEK_SET);
>     if(status == -1)
>       fprintf(stderr, "Failed to seek offset file\n");
>     else
>       printf("Seeking to 0\n");
>     read_bytes = read(fd, read_buf, 1024 * 1024 * 20);
>     db_copy_into_db(conn, read_buf, read_bytes);
>
>     getc(stdin);
>   }
> }
>
> int main()
> {
>   char csv_file[1024 * 10];
>   char *conn_info = "dbname=my_db user=abhi";
>   PGconn *conn = PQconnectdb(conn_info);
>   if(PQstatus(conn) != CONNECTION_OK)
>   {
>     fprintf(stderr, "Connection to database failed: %s\n",
> PQerrorMessage(conn));
>     if(conn)
>     {
>       PQfinish(conn);
>       conn = NULL;
>     }
>     return -1;
>   }
>   sprintf(csv_file,"/tmp/my_table.csv");
>   read_csv_and_copy_inio_db(csv_file, conn);
> }
>

Can you please provide the table schema and my_table.csv file?

--
Regards
Junwang Zhao



В списке pgsql-bugs по дате отправления: