Skip to content

Commit 8c47277

Browse files
committed
store: set nodegroup last activity
Signed-off-by: CrazyMax <[email protected]>
1 parent 36b5cd1 commit 8c47277

7 files changed

Lines changed: 67 additions & 4 deletions

File tree

commands/bake.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions) (err error
111111
if err != nil {
112112
return err
113113
}
114+
if err = updateLastActivity(dockerCli, b.NodeGroup); err != nil {
115+
return errors.Wrapf(err, "failed to update builder last activity time")
116+
}
114117
nodes, err = b.LoadNodes(ctx, false)
115118
if err != nil {
116119
return err

commands/build.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import (
1818
"github.com/docker/buildx/build"
1919
"github.com/docker/buildx/builder"
2020
"github.com/docker/buildx/monitor"
21+
"github.com/docker/buildx/store"
22+
"github.com/docker/buildx/store/storeutil"
2123
"github.com/docker/buildx/util/buildflags"
2224
"github.com/docker/buildx/util/confutil"
2325
"github.com/docker/buildx/util/dockerutil"
@@ -261,6 +263,9 @@ func runBuild(dockerCli command.Cli, in buildOptions) (err error) {
261263
if err != nil {
262264
return err
263265
}
266+
if err = updateLastActivity(dockerCli, b.NodeGroup); err != nil {
267+
return errors.Wrapf(err, "failed to update builder last activity time")
268+
}
264269
nodes, err := b.LoadNodes(ctx, false)
265270
if err != nil {
266271
return err
@@ -730,3 +735,12 @@ func isExperimental() bool {
730735
}
731736
return false
732737
}
738+
739+
func updateLastActivity(dockerCli command.Cli, ng *store.NodeGroup) error {
740+
txn, release, err := storeutil.GetStore(dockerCli)
741+
if err != nil {
742+
return err
743+
}
744+
defer release()
745+
return txn.UpdateLastActivity(ng)
746+
}

commands/inspect.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ func runInspect(dockerCli command.Cli, in inspectOptions) error {
5050
w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', 0)
5151
fmt.Fprintf(w, "Name:\t%s\n", b.Name)
5252
fmt.Fprintf(w, "Driver:\t%s\n", b.Driver)
53+
if !b.NodeGroup.LastActivity.IsZero() {
54+
fmt.Fprintf(w, "Last Activity:\t%v\n", b.NodeGroup.LastActivity)
55+
}
5356

5457
if err != nil {
5558
fmt.Fprintf(w, "Error:\t%s\n", err.Error())

store/nodegroup.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package store
22

33
import (
44
"fmt"
5+
"time"
56

67
"github.com/containerd/containerd/platforms"
78
"github.com/docker/buildx/util/confutil"
@@ -18,7 +19,8 @@ type NodeGroup struct {
1819
Dynamic bool
1920

2021
// skip the following fields from being saved in the store
21-
DockerContext bool `json:"-"`
22+
DockerContext bool `json:"-"`
23+
LastActivity time.Time `json:"-"`
2224
}
2325

2426
type Node struct {

store/store.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"os"
66
"path/filepath"
77
"sort"
8+
"time"
89

910
"github.com/docker/docker/pkg/ioutils"
1011
"github.com/gofrs/flock"
@@ -15,6 +16,7 @@ import (
1516
const (
1617
instanceDir = "instances"
1718
defaultsDir = "defaults"
19+
activityDir = "activity"
1820
)
1921

2022
func New(root string) (*Store, error) {
@@ -24,6 +26,9 @@ func New(root string) (*Store, error) {
2426
if err := os.MkdirAll(filepath.Join(root, defaultsDir), 0700); err != nil {
2527
return nil, err
2628
}
29+
if err := os.MkdirAll(filepath.Join(root, activityDir), 0700); err != nil {
30+
return nil, err
31+
}
2732
return &Store{root: root}, nil
2833
}
2934

@@ -86,6 +91,9 @@ func (t *Txn) NodeGroupByName(name string) (*NodeGroup, error) {
8691
if err := json.Unmarshal(dt, &ng); err != nil {
8792
return nil, err
8893
}
94+
if ng.LastActivity, err = t.GetLastActivity(&ng); err != nil {
95+
return nil, err
96+
}
8997
return &ng, nil
9098
}
9199

@@ -94,6 +102,9 @@ func (t *Txn) Save(ng *NodeGroup) error {
94102
if err != nil {
95103
return err
96104
}
105+
if err := t.UpdateLastActivity(ng); err != nil {
106+
return err
107+
}
97108
dt, err := json.Marshal(ng)
98109
if err != nil {
99110
return err
@@ -106,6 +117,9 @@ func (t *Txn) Remove(name string) error {
106117
if err != nil {
107118
return err
108119
}
120+
if err := t.RemoveLastActivity(name); err != nil {
121+
return err
122+
}
109123
return os.RemoveAll(filepath.Join(t.s.root, instanceDir, name))
110124
}
111125

@@ -135,6 +149,29 @@ func (t *Txn) SetCurrent(key, name string, global, def bool) error {
135149
return nil
136150
}
137151

152+
func (t *Txn) UpdateLastActivity(ng *NodeGroup) error {
153+
return ioutils.AtomicWriteFile(filepath.Join(t.s.root, activityDir, ng.Name), []byte(time.Now().UTC().Format(time.RFC3339)), 0600)
154+
}
155+
156+
func (t *Txn) GetLastActivity(ng *NodeGroup) (la time.Time, _ error) {
157+
dt, err := os.ReadFile(filepath.Join(t.s.root, activityDir, ng.Name))
158+
if err != nil {
159+
if os.IsNotExist(errors.Cause(err)) {
160+
return la, nil
161+
}
162+
return la, err
163+
}
164+
return time.Parse(time.RFC3339, string(dt))
165+
}
166+
167+
func (t *Txn) RemoveLastActivity(name string) error {
168+
name, err := ValidateName(name)
169+
if err != nil {
170+
return err
171+
}
172+
return os.RemoveAll(filepath.Join(t.s.root, activityDir, name))
173+
}
174+
138175
func (t *Txn) reset(key string) error {
139176
dt, err := json.Marshal(current{Key: key})
140177
if err != nil {

store/store_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ func TestNodeManagement(t *testing.T) {
9292
require.NoError(t, err)
9393
require.Equal(t, "mybuild", ng.Name)
9494
require.Equal(t, "mydriver", ng.Driver)
95+
require.True(t, !ng.LastActivity.IsZero())
9596

9697
_, err = txn.NodeGroupByName("mybuild2")
9798
require.Error(t, err)

store/storeutil/storeutil.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,19 @@ func GetNodeGroup(txn *store.Txn, dockerCli command.Cli, name string) (*store.No
8585
}
8686
for _, l := range list {
8787
if l.Name == name {
88-
return &store.NodeGroup{
88+
ng = &store.NodeGroup{
8989
Name: name,
9090
Nodes: []store.Node{
9191
{
9292
Name: name,
9393
Endpoint: name,
9494
},
9595
},
96-
DockerContext: true,
97-
}, nil
96+
}
97+
if ng.LastActivity, err = txn.GetLastActivity(ng); err != nil {
98+
return nil, err
99+
}
100+
return ng, nil
98101
}
99102
}
100103

0 commit comments

Comments
 (0)