Skip to content

Commit 16b33e5

Browse files
committed
feat implement traefic/query timeout
1 parent 5800b92 commit 16b33e5

2 files changed

Lines changed: 20 additions & 2 deletions

File tree

app/modules/players/controllers/players_controller.rb

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ class PlayersController < Api::V1::BaseController
99

1010
# GET /api/v1/players
1111
def index
12+
# Optimized query to prevent timeout during bulk sync operations
13+
# PostgreSQL will allow concurrent reads even during updates (MVCC)
14+
# Set a reasonable timeout to prevent 504s
15+
ActiveRecord::Base.connection.execute("SET LOCAL statement_timeout = '5000'") # 5 seconds
16+
1217
players = organization_scoped(Player).includes(:champion_pools)
1318

1419
players = players.by_role(params[:role]) if params[:role].present?
@@ -25,6 +30,13 @@ def index
2530
players: PlayerSerializer.render_as_hash(result[:data]),
2631
pagination: result[:pagination]
2732
})
33+
rescue ActiveRecord::QueryCanceled => e
34+
Rails.logger.error "Players index query timeout: #{e.message}"
35+
render_error(
36+
message: 'Request timeout - please try again',
37+
code: 'QUERY_TIMEOUT',
38+
status: :request_timeout
39+
)
2840
end
2941

3042
# GET /api/v1/players/:id
@@ -165,8 +177,9 @@ def import
165177

166178
# POST /api/v1/players/:id/sync_from_riot
167179
def sync_from_riot
168-
service = Players::Services::RiotSyncService.new(@player, region: params[:region])
169-
result = service.sync
180+
region = params[:region] || @player.region || 'br1'
181+
service = Players::Services::RiotSyncService.new(current_organization, region)
182+
result = service.sync_player(@player, import_matches: true)
170183

171184
if result[:success]
172185
log_user_action(

docker-compose.production.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ services:
1414
- "traefik.http.services.prostaff-api.loadbalancer.server.port=3000"
1515
- "traefik.http.services.prostaff-api.loadbalancer.healthcheck.path=/up"
1616
- "traefik.http.services.prostaff-api.loadbalancer.healthcheck.interval=30s"
17+
- "traefik.http.services.prostaff-api.loadbalancer.healthcheck.timeout=5s"
18+
# Request Timeouts
19+
- "traefik.http.services.prostaff-api.loadbalancer.responseforwardingtimeouts.dialtimeout=30s"
20+
- "traefik.http.services.prostaff-api.loadbalancer.responseforwardingtimeouts.responseheadertimeout=60s"
21+
- "traefik.http.services.prostaff-api.loadbalancer.responseforwardingtimeouts.idletimeout=90s"
1722
# Rate Limiting (30 req/s per IP - same as nginx config)
1823
- "traefik.http.middlewares.prostaff-ratelimit.ratelimit.average=30"
1924
- "traefik.http.middlewares.prostaff-ratelimit.ratelimit.period=1s"

0 commit comments

Comments
 (0)