# Increasing Database Command Timeout ## Problem Slow queries may timeout after 30 seconds (the default PostgreSQL command timeout), causing errors like: ``` Failed executing DbCommand ("30,024"ms) ... CommandTimeout='30' ``` ## Solution The command timeout is configured in the PostgreSQL connection string, which is built from the database configuration file. ### Step 1: Locate Database Configuration The database configuration is stored in: ``` /database.json ``` For example: - Linux: `/etc/jellyfin/database.json` - Windows: `C:/ProgramData/jellyfin/config/database.json` ### Step 2: Add Command Timeout Option Edit `database.json` and add the `command-timeout` option: ```json { "DatabaseType": "Jellyfin-PostgreSQL", "LockingBehavior": "NoLock", "CustomProviderOptions": { "Options": [ { "Key": "host", "Value": "localhost" }, { "Key": "port", "Value": "5432" }, { "Key": "database", "Value": "jellyfin" }, { "Key": "username", "Value": "jellyfin" }, { "Key": "password", "Value": "your_password_here" }, { "Key": "command-timeout", "Value": "120" } ] } } ``` ### Available Timeout Options | Option | Default | Unit | Description | |--------|---------|------|-------------| | `command-timeout` | 30 | seconds | Maximum time for a query to execute | | `connection-timeout` | 15 | seconds | Maximum time to establish connection | ### Recommended Values **For Development/Testing:** ```json { "Key": "command-timeout", "Value": "120" } ``` - Allows up to 2 minutes for complex queries - Good for debugging slow queries **For Production:** ```json { "Key": "command-timeout", "Value": "60" } ``` - Balances between allowing reasonable query time and failing fast on problems - Prevents hanging connections ### Step 3: Restart Jellyfin ```bash # Linux (systemd) sudo systemctl restart jellyfin # Or if running manually # Stop Jellyfin and restart ``` ### Step 4: Verify Configuration Check the logs on startup to see the applied timeout: ``` [INF] PostgreSQL connection: Host=localhost, Port=5432, ... ``` The command timeout is applied to all database commands. You can verify it's working by checking slow query logs: ``` [ERR] Failed executing DbCommand ("45,123"ms) ... CommandTimeout='120' ``` ## Alternative: Set via Connection String Directly If you're configuring PostgreSQL via connection string (advanced), you can set it there: ``` Host=localhost;Database=jellyfin;Username=jellyfin;Password=***;Command Timeout=120; ``` ## When to Increase Timeout ✅ **Increase timeout if:** - Queries are legitimately slow due to large datasets - You're running complex analytics or reporting queries - Temporary workaround while optimizing queries ❌ **Don't increase timeout if:** - Queries should be fast but aren't (fix the query instead) - Most queries complete quickly (one slow query affects all) - Timeout masks underlying performance issues ## Better Solutions Instead of just increasing timeout, consider: 1. **Add Database Indexes** (see `sql/add-performance-indexes.sql`) 2. **Optimize Query Logic** (see `docs/query-grouping-current-status.md`) 3. **Use Application-Level Filtering** (avoid grouping in database) 4. **Upgrade EF Core** (when using stable .NET version) ## Monitoring After changing timeout, monitor query performance: ```sql -- Run on PostgreSQL to see slow queries SELECT pid, now() - query_start AS duration, LEFT(query, 100) AS query_preview FROM pg_stat_activity WHERE state != 'idle' AND query NOT LIKE '%pg_stat_activity%' AND (now() - query_start) > interval '5 seconds' ORDER BY duration DESC; ``` See `sql/monitor-query-performance.sql` for comprehensive monitoring queries. ## Current Query Performance Issue The grouping queries in `BaseItemRepository.ApplyGroupingFilter` currently generate correlated subqueries that can be slow. Until EF Core translation improves, the options are: 1. **Increase timeout** (this guide) 2. **Add indexes** (`sql/add-performance-indexes.sql`) 3. **Disable grouping** (application-level fix) See `docs/query-grouping-current-status.md` for full details and all workaround options.