|
| 1 | +//go:build integration |
| 2 | + |
| 3 | +package agentexecution_test |
| 4 | + |
| 5 | +import ( |
| 6 | + "encoding/json" |
| 7 | + "os" |
| 8 | + "strings" |
| 9 | + "testing" |
| 10 | + |
| 11 | + "github.com/google/uuid" |
| 12 | + "github.com/stretchr/testify/require" |
| 13 | +) |
| 14 | + |
| 15 | +func TestClaimReadyIndexPlan(t *testing.T) { |
| 16 | + f := migratedExecutionFixture(t) |
| 17 | + ctx := t.Context() |
| 18 | + ids := make([]uuid.UUID, 10000) |
| 19 | + for i := range ids { |
| 20 | + ids[i] = uuid.New() |
| 21 | + } |
| 22 | + _, err := f.pool.Exec(ctx, ` |
| 23 | +INSERT INTO agents(id,root_agent_id,org_id,project_id,state,current_config_id,created_at,updated_at) |
| 24 | + SELECT id,id,$2,$3,'active',$4,statement_timestamp(),statement_timestamp() FROM unnest($1::uuid[]) id`, |
| 25 | + ids, f.org, f.project, f.config) |
| 26 | + require.NoError(t, err) |
| 27 | + _, err = f.pool.Exec(ctx, `INSERT INTO agent_wakeups(agent_id,ready_at,updated_at) |
| 28 | + SELECT id,statement_timestamp()-interval '1 minute',statement_timestamp() FROM unnest($1::uuid[]) id`, ids[:5000]) |
| 29 | + require.NoError(t, err) |
| 30 | + _, err = f.pool.Exec(ctx, ` |
| 31 | +INSERT INTO agent_runtime_locks(id,agent_id,worker_process_id,started_at,renewed_at,lease_expires_at) |
| 32 | + SELECT gen_random_uuid(),id,$2,statement_timestamp(),statement_timestamp(),statement_timestamp()+interval '90 seconds' |
| 33 | + FROM unnest($1::uuid[]) id`, ids[5000:], uuid.New()) |
| 34 | + require.NoError(t, err) |
| 35 | + _, err = f.pool.Exec(ctx, `ANALYZE agents; ANALYZE agent_wakeups; ANALYZE agent_runtime_locks`) |
| 36 | + require.NoError(t, err) |
| 37 | + sql, err := os.ReadFile("../../queries/agent_inputs.sql") |
| 38 | + require.NoError(t, err) |
| 39 | + query := strings.Split(string(sql), "-- name: LockClaimableAgentWakeup")[0] |
| 40 | + tx, err := f.pool.Begin(ctx) |
| 41 | + require.NoError(t, err) |
| 42 | + defer func() { _ = tx.Rollback(ctx) }() |
| 43 | + _, err = tx.Exec(ctx, `SET LOCAL plan_cache_mode=force_generic_plan`) |
| 44 | + require.NoError(t, err) |
| 45 | + var raw []byte |
| 46 | + require.NoError(t, tx.QueryRow(ctx, "EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) "+query).Scan(&raw)) |
| 47 | + t.Logf("claim EXPLAIN: %s", raw) |
| 48 | + var plan []struct { |
| 49 | + Plan struct { |
| 50 | + SharedHitBlocks int `json:"Shared Hit Blocks"` |
| 51 | + SharedReadBlocks int `json:"Shared Read Blocks"` |
| 52 | + } |
| 53 | + } |
| 54 | + require.NoError(t, json.Unmarshal(raw, &plan)) |
| 55 | + require.NotContains(t, string(raw), `"Node Type": "Sort"`) |
| 56 | + require.NotContains(t, string(raw), `"Node Type": "Hash"`) |
| 57 | + require.NotContains(t, string(raw), `"Node Type": "Hash Join"`) |
| 58 | + require.Contains(t, string(raw), "agent_wakeups_global_ready_idx") |
| 59 | + buffers := plan[0].Plan.SharedHitBlocks + plan[0].Plan.SharedReadBlocks |
| 60 | + require.LessOrEqual(t, buffers, 40) |
| 61 | +} |
0 commit comments