github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/db/worker_task_cache.go (about) 1 package db 2 3 import ( 4 "database/sql" 5 6 sq "github.com/Masterminds/squirrel" 7 "github.com/pf-qiu/concourse/v6/atc" 8 ) 9 10 type WorkerTaskCache struct { 11 WorkerName string 12 TaskCache UsedTaskCache 13 } 14 15 type UsedWorkerTaskCache struct { 16 ID int 17 WorkerName string 18 } 19 20 func (wtc WorkerTaskCache) findOrCreate( 21 tx Tx, 22 ) (*UsedWorkerTaskCache, error) { 23 uwtc, found, err := wtc.find(tx) 24 if err != nil { 25 return nil, err 26 } 27 28 if !found { 29 var id int 30 err = psql.Insert("worker_task_caches"). 31 Columns( 32 "worker_name", 33 "task_cache_id", 34 ). 35 Values(wtc.WorkerName, wtc.TaskCache.ID()). 36 Suffix(` 37 ON CONFLICT (worker_name, task_cache_id) DO UPDATE SET 38 task_cache_id = EXCLUDED.task_cache_id 39 RETURNING id 40 `). 41 RunWith(tx). 42 QueryRow(). 43 Scan(&id) 44 if err != nil { 45 return nil, err 46 } 47 48 return &UsedWorkerTaskCache{ 49 ID: id, 50 WorkerName: wtc.WorkerName, 51 }, nil 52 } 53 54 return uwtc, err 55 } 56 57 func (workerTaskCache WorkerTaskCache) find(runner sq.Runner) (*UsedWorkerTaskCache, bool, error) { 58 var id int 59 err := psql.Select("id"). 60 From("worker_task_caches"). 61 Where(sq.Eq{ 62 "worker_name": workerTaskCache.WorkerName, 63 "task_cache_id": workerTaskCache.TaskCache.ID(), 64 }). 65 RunWith(runner). 66 QueryRow(). 67 Scan(&id) 68 if err != nil { 69 if err == sql.ErrNoRows { 70 return nil, false, nil 71 } 72 73 return nil, false, err 74 } 75 76 return &UsedWorkerTaskCache{ 77 ID: id, 78 WorkerName: workerTaskCache.WorkerName, 79 }, true, nil 80 } 81 82 func removeUnusedWorkerTaskCaches(tx Tx, pipelineID int, jobConfigs []atc.JobConfig) error { 83 steps := make(map[string][]string) 84 for _, jobConfig := range jobConfigs { 85 _ = jobConfig.StepConfig().Visit(atc.StepRecursor{ 86 OnTask: func(step *atc.TaskStep) error { 87 steps[jobConfig.Name] = append(steps[jobConfig.Name], step.Name) 88 return nil 89 }, 90 }) 91 } 92 93 query := sq.Or{} 94 for jobName, stepNames := range steps { 95 query = append(query, sq.And{sq.Eq{"j.name": jobName}, sq.NotEq{"tc.step_name": stepNames}}) 96 } 97 98 _, err := psql.Delete("task_caches tc USING jobs j"). 99 Where( 100 sq.Or{ 101 query, 102 sq.Eq{ 103 "j.active": false, 104 }, 105 }). 106 Where(sq.Expr("j.id = tc.job_id")). 107 Where(sq.Eq{"j.pipeline_id": pipelineID}). 108 RunWith(tx). 109 Exec() 110 111 return err 112 }