ragflow/api
Andrea Bugeja 8a41057236
Fix: Add RetryingPooledPostgresqlDatabase to handle max_retries param (#10524)
## What problem does this PR solve?

Fixes the PostgreSQL connection error that prevents RAGFlow from
starting:

peewee.ProgrammingError: invalid dsn: invalid connection option
"max_retries"


## Problem Analysis

The `BaseDataBase` class in `api/db/db_models.py` adds `max_retries` and
`retry_delay` to the database configuration dict before passing it to
the database connection constructor.

- **MySQL**: Has `RetryingPooledMySQLDatabase` class that properly
extracts these custom parameters using `kwargs.pop()` before calling the
parent constructor
- **PostgreSQL**: Was using the base `PooledPostgresqlDatabase` class
which passes all parameters directly to `psycopg2.connect()`, which
doesn't recognize `max_retries` as a valid connection option

## Solution

Created `RetryingPooledPostgresqlDatabase` class that:
- Extracts `max_retries` and `retry_delay` parameters before
initialization
- Implements retry logic with exponential backoff for connection
failures
- Handles PostgreSQL-specific connection errors (connection refused,
server closed, etc.)
- Mirrors the existing `RetryingPooledMySQLDatabase` implementation

Updated the `PooledDatabase` enum to use the new retrying class for
PostgreSQL.

## Benefits

 Prevents invalid connection parameters from being passed to psycopg2  
 Adds automatic retry logic for PostgreSQL connection failures  
 Provides better error logging for PostgreSQL-specific issues  
 Maintains consistency between MySQL and PostgreSQL database handling  

## Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)

## Testing

Tested with PostgreSQL database configuration and verified:
- Server starts without the "invalid dsn" error
- Database connections are established successfully
- Retry logic works correctly on connection failures

Co-authored-by: Andrea Bugeja <andrea.bugeja@gig.com>
2025-10-16 15:08:41 +08:00
..
apps Feat: add forgot password reset, solve #8547 (#10586) 2025-10-16 15:07:49 +08:00
common Fix typos: retrievaler -> retriever (#10372) 2025-10-10 09:17:36 +08:00
db Fix: Add RetryingPooledPostgresqlDatabase to handle max_retries param (#10524) 2025-10-16 15:08:41 +08:00
utils Feat: add forgot password reset, solve #8547 (#10586) 2025-10-16 15:07:49 +08:00
__init__.py Update comments (#4569) 2025-01-21 20:52:28 +08:00
constants.py Refa: Implement centralized file name length limit using FILE_NAME_LEN_LIMIT constant (#8318) 2025-06-17 18:01:30 +08:00
ragflow_server.py Refactor: move some functions out of api/utils/__init__.py (#10216) 2025-09-25 18:04:49 +08:00
settings.py Fix typos: retrievaler -> retriever (#10372) 2025-10-10 09:17:36 +08:00
validation.py Fix errors detected by Ruff (#3918) 2024-12-08 14:21:12 +08:00
versions.py Fix VERSION 2024-12-07 16:56:34 +08:00