Skip to content

Commit 7c04128

Browse files
committed
Merge branch 'fix/retrieval-activity-timeout' into 'master'
fix: add timeout to retrieval activity endpoint to prevent hanging Closes #686 See merge request postgres-ai/database-lab!1109
2 parents 1173209 + 52dbf0b commit 7c04128

2 files changed

Lines changed: 19 additions & 2 deletions

File tree

engine/internal/retrieval/engine/postgres/logical/activity.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"context"
66
"fmt"
77
"strconv"
8+
"time"
89

910
"github.com/docker/docker/api/types"
1011
"github.com/docker/docker/api/types/container"
@@ -21,6 +22,9 @@ import (
2122
const (
2223
dleRetrieval = "dle_retrieval"
2324

25+
// connectTimeout defines the timeout for connecting to the database.
26+
connectTimeout = 10 * time.Second
27+
2428
// queryFieldsNum defines the expected number of fields in the query result.
2529
queryFieldsNum = 5
2630

@@ -39,7 +43,14 @@ const (
3943
func dbSourceActivity(ctx context.Context, dbCfg Connection) ([]activity.PGEvent, error) {
4044
connStr := db.ConnectionString(dbCfg.Host, strconv.Itoa(dbCfg.Port), dbCfg.Username, dbCfg.DBName, dbCfg.Password)
4145

42-
querier, err := pgx.Connect(ctx, connStr)
46+
pgxCfg, err := pgx.ParseConfig(connStr)
47+
if err != nil {
48+
return nil, fmt.Errorf("failed to parse connection config: %w", err)
49+
}
50+
51+
pgxCfg.ConnectTimeout = connectTimeout
52+
53+
querier, err := pgx.ConnectConfig(ctx, pgxCfg)
4354
if err != nil {
4455
return nil, fmt.Errorf("failed to connect to DB: %w", err)
4556
}

engine/internal/srv/routes.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ import (
3535

3636
const (
3737
logsSinceInterval = "5m"
38+
39+
// activityTimeout defines the timeout for retrieving activity data.
40+
activityTimeout = 15 * time.Second
3841
)
3942

4043
func (s *Server) getInstanceStatus(w http.ResponseWriter, r *http.Request) {
@@ -56,7 +59,10 @@ func (s *Server) retrievalState(w http.ResponseWriter, r *http.Request) {
5659
retrieving.NextRefresh = models.NewLocalTime(spec.Next(time.Now()))
5760
}
5861

59-
retrieving.Activity = s.jobActivity(context.Background())
62+
activityCtx, cancel := context.WithTimeout(context.Background(), activityTimeout)
63+
defer cancel()
64+
65+
retrieving.Activity = s.jobActivity(activityCtx)
6066

6167
if err := api.WriteJSON(w, http.StatusOK, retrieving); err != nil {
6268
api.SendError(w, r, err)

0 commit comments

Comments
 (0)