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  }