mirror of https://github.com/docker/buildx.git
store: set nodegroup last activity
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
This commit is contained in:
parent
36b5cd18e8
commit
8c47277141
|
@ -111,6 +111,9 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions) (err error
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err = updateLastActivity(dockerCli, b.NodeGroup); err != nil {
|
||||
return errors.Wrapf(err, "failed to update builder last activity time")
|
||||
}
|
||||
nodes, err = b.LoadNodes(ctx, false)
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
|
@ -18,6 +18,8 @@ import (
|
|||
"github.com/docker/buildx/build"
|
||||
"github.com/docker/buildx/builder"
|
||||
"github.com/docker/buildx/monitor"
|
||||
"github.com/docker/buildx/store"
|
||||
"github.com/docker/buildx/store/storeutil"
|
||||
"github.com/docker/buildx/util/buildflags"
|
||||
"github.com/docker/buildx/util/confutil"
|
||||
"github.com/docker/buildx/util/dockerutil"
|
||||
|
@ -261,6 +263,9 @@ func runBuild(dockerCli command.Cli, in buildOptions) (err error) {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err = updateLastActivity(dockerCli, b.NodeGroup); err != nil {
|
||||
return errors.Wrapf(err, "failed to update builder last activity time")
|
||||
}
|
||||
nodes, err := b.LoadNodes(ctx, false)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -730,3 +735,12 @@ func isExperimental() bool {
|
|||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func updateLastActivity(dockerCli command.Cli, ng *store.NodeGroup) error {
|
||||
txn, release, err := storeutil.GetStore(dockerCli)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer release()
|
||||
return txn.UpdateLastActivity(ng)
|
||||
}
|
||||
|
|
|
@ -50,6 +50,9 @@ func runInspect(dockerCli command.Cli, in inspectOptions) error {
|
|||
w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', 0)
|
||||
fmt.Fprintf(w, "Name:\t%s\n", b.Name)
|
||||
fmt.Fprintf(w, "Driver:\t%s\n", b.Driver)
|
||||
if !b.NodeGroup.LastActivity.IsZero() {
|
||||
fmt.Fprintf(w, "Last Activity:\t%v\n", b.NodeGroup.LastActivity)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
fmt.Fprintf(w, "Error:\t%s\n", err.Error())
|
||||
|
|
|
@ -2,6 +2,7 @@ package store
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/containerd/containerd/platforms"
|
||||
"github.com/docker/buildx/util/confutil"
|
||||
|
@ -19,6 +20,7 @@ type NodeGroup struct {
|
|||
|
||||
// skip the following fields from being saved in the store
|
||||
DockerContext bool `json:"-"`
|
||||
LastActivity time.Time `json:"-"`
|
||||
}
|
||||
|
||||
type Node struct {
|
||||
|
|
|
@ -5,6 +5,7 @@ import (
|
|||
"os"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"time"
|
||||
|
||||
"github.com/docker/docker/pkg/ioutils"
|
||||
"github.com/gofrs/flock"
|
||||
|
@ -15,6 +16,7 @@ import (
|
|||
const (
|
||||
instanceDir = "instances"
|
||||
defaultsDir = "defaults"
|
||||
activityDir = "activity"
|
||||
)
|
||||
|
||||
func New(root string) (*Store, error) {
|
||||
|
@ -24,6 +26,9 @@ func New(root string) (*Store, error) {
|
|||
if err := os.MkdirAll(filepath.Join(root, defaultsDir), 0700); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := os.MkdirAll(filepath.Join(root, activityDir), 0700); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &Store{root: root}, nil
|
||||
}
|
||||
|
||||
|
@ -86,6 +91,9 @@ func (t *Txn) NodeGroupByName(name string) (*NodeGroup, error) {
|
|||
if err := json.Unmarshal(dt, &ng); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if ng.LastActivity, err = t.GetLastActivity(&ng); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &ng, nil
|
||||
}
|
||||
|
||||
|
@ -94,6 +102,9 @@ func (t *Txn) Save(ng *NodeGroup) error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := t.UpdateLastActivity(ng); err != nil {
|
||||
return err
|
||||
}
|
||||
dt, err := json.Marshal(ng)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -106,6 +117,9 @@ func (t *Txn) Remove(name string) error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := t.RemoveLastActivity(name); err != nil {
|
||||
return err
|
||||
}
|
||||
return os.RemoveAll(filepath.Join(t.s.root, instanceDir, name))
|
||||
}
|
||||
|
||||
|
@ -135,6 +149,29 @@ func (t *Txn) SetCurrent(key, name string, global, def bool) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (t *Txn) UpdateLastActivity(ng *NodeGroup) error {
|
||||
return ioutils.AtomicWriteFile(filepath.Join(t.s.root, activityDir, ng.Name), []byte(time.Now().UTC().Format(time.RFC3339)), 0600)
|
||||
}
|
||||
|
||||
func (t *Txn) GetLastActivity(ng *NodeGroup) (la time.Time, _ error) {
|
||||
dt, err := os.ReadFile(filepath.Join(t.s.root, activityDir, ng.Name))
|
||||
if err != nil {
|
||||
if os.IsNotExist(errors.Cause(err)) {
|
||||
return la, nil
|
||||
}
|
||||
return la, err
|
||||
}
|
||||
return time.Parse(time.RFC3339, string(dt))
|
||||
}
|
||||
|
||||
func (t *Txn) RemoveLastActivity(name string) error {
|
||||
name, err := ValidateName(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return os.RemoveAll(filepath.Join(t.s.root, activityDir, name))
|
||||
}
|
||||
|
||||
func (t *Txn) reset(key string) error {
|
||||
dt, err := json.Marshal(current{Key: key})
|
||||
if err != nil {
|
||||
|
|
|
@ -92,6 +92,7 @@ func TestNodeManagement(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
require.Equal(t, "mybuild", ng.Name)
|
||||
require.Equal(t, "mydriver", ng.Driver)
|
||||
require.True(t, !ng.LastActivity.IsZero())
|
||||
|
||||
_, err = txn.NodeGroupByName("mybuild2")
|
||||
require.Error(t, err)
|
||||
|
|
|
@ -85,7 +85,7 @@ func GetNodeGroup(txn *store.Txn, dockerCli command.Cli, name string) (*store.No
|
|||
}
|
||||
for _, l := range list {
|
||||
if l.Name == name {
|
||||
return &store.NodeGroup{
|
||||
ng = &store.NodeGroup{
|
||||
Name: name,
|
||||
Nodes: []store.Node{
|
||||
{
|
||||
|
@ -93,8 +93,11 @@ func GetNodeGroup(txn *store.Txn, dockerCli command.Cli, name string) (*store.No
|
|||
Endpoint: name,
|
||||
},
|
||||
},
|
||||
DockerContext: true,
|
||||
}, nil
|
||||
}
|
||||
if ng.LastActivity, err = txn.GetLastActivity(ng); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return ng, nil
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue