| // Copyright 2022 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package remote |
| |
| import ( |
| "context" |
| "sync" |
| "time" |
| |
| "golang.org/x/build/buildlet" |
| ) |
| |
| // Buildlets is a store for the legacy remote buildlets. |
| type Buildlets struct { |
| sync.Mutex |
| M map[string]*Buildlet // keyed by buildletName |
| } |
| |
| // Buildlet is the representation of the legacy remote buildlet. |
| type Buildlet struct { |
| User string // "user-foo" build key |
| Name string // dup of key |
| HostType string |
| BuilderType string // default builder config to use if not overwritten |
| Created time.Time |
| Expires time.Time |
| |
| buildlet buildlet.Client |
| } |
| |
| // Renew renews rb's idle timeout if ctx hasn't expired. |
| // Renew should run in its own goroutine. |
| func (rb *Buildlet) Renew(ctx context.Context, rbs *Buildlets) { |
| rbs.Lock() |
| defer rbs.Unlock() |
| select { |
| case <-ctx.Done(): |
| return |
| default: |
| } |
| if got := rbs.M[rb.Name]; got == rb { |
| rb.Expires = time.Now().Add(remoteBuildletIdleTimeout) |
| time.AfterFunc(time.Minute, func() { rb.Renew(ctx, rbs) }) |
| } |
| } |
| |
| // Buildlet returns the buildlet client for the associated legacy buildlet. |
| func (rb *Buildlet) Buildlet() buildlet.Client { |
| return rb.buildlet |
| } |
| |
| // SetBuildlet sets the buildlet client for a legacy buildlet. |
| func (rb *Buildlet) SetBuildlet(b buildlet.Client) { |
| rb.buildlet = b |
| } |