/
advanced_hdlr.go
164 lines (156 loc) · 3.88 KB
/
advanced_hdlr.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
// Package cli provides easy-to-use commands to manage, monitor, and utilize AIS clusters.
// This file provides advanced commands that are useful for testing or development but not everyday use.
/*
* Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved.
*/
package cli
import (
"fmt"
"github.com/NVIDIA/aistore/api"
"github.com/NVIDIA/aistore/api/apc"
"github.com/NVIDIA/aistore/core/meta"
"github.com/NVIDIA/aistore/xact"
"github.com/urfave/cli"
)
var (
advancedCmd = cli.Command{
Name: commandAdvanced,
Usage: "special commands intended for development and advanced usage",
Subcommands: []cli.Command{
jobStartResilver,
{
Name: cmdPreload,
Usage: "preload object metadata into in-memory cache",
ArgsUsage: bucketArgument,
Action: loadLomCacheHandler,
BashComplete: bucketCompletions(bcmplop{}),
},
{
Name: cmdRmSmap,
Usage: "immediately remove node from cluster map (advanced usage - potential data loss!)",
ArgsUsage: nodeIDArgument,
Action: removeNodeFromSmap,
BashComplete: suggestAllNodes,
},
{
Name: cmdRandNode,
Usage: "print random node ID (by default, random target)",
Action: randNode,
BashComplete: func(c *cli.Context) {
if c.NArg() == 0 {
fmt.Println(apc.Proxy, apc.Target)
}
},
},
{
Name: cmdRandMountpath,
Usage: "print a random mountpath from a given target",
Action: randMountpath,
BashComplete: suggestTargets,
},
{
Name: cmdRotateLogs,
Usage: "rotate logs",
ArgsUsage: optionalNodeIDArgument,
Action: rotateLogs,
BashComplete: suggestAllNodes,
},
},
}
)
func loadLomCacheHandler(c *cli.Context) error {
if c.NArg() == 0 {
return missingArgumentsError(c, c.Command.ArgsUsage)
} else if c.NArg() > 1 {
return incorrectUsageMsg(c, "", c.Args()[1:])
}
bck, err := parseBckURI(c, c.Args().Get(0), false)
if err != nil {
return err
}
xargs := xact.ArgsMsg{Kind: apc.ActLoadLomCache, Bck: bck}
return startXaction(c, &xargs, "")
}
func removeNodeFromSmap(c *cli.Context) error {
if c.NArg() == 0 {
return incorrectUsageMsg(c, c.Command.ArgsUsage)
}
if c.NArg() > 1 {
return incorrectUsageMsg(c, "", c.Args()[1:])
}
node, sname, err := getNode(c, c.Args().Get(0))
if err != nil {
return err
}
if node.IsProxy() {
smap, err := getClusterMap(c)
if err != nil {
return err // cannot happen
}
if smap.IsPrimary(node) {
return fmt.Errorf("%s is primary (cannot remove the primary node)", sname)
}
}
return api.RemoveNodeUnsafe(apiBP, node.ID())
}
func randNode(c *cli.Context) error {
var (
si *meta.Snode
smap, err = getClusterMap(c)
)
if err != nil {
return err
}
if c.NArg() > 0 && c.Args().Get(0) == apc.Proxy {
si, err = smap.GetRandProxy(false) // _not_ excluding primary
} else {
si, err = smap.GetRandTarget()
}
if err != nil {
return err
}
fmt.Fprintln(c.App.Writer, si.ID())
return nil
}
func randMountpath(c *cli.Context) error {
if c.NArg() == 0 {
return incorrectUsageMsg(c, c.Command.ArgsUsage)
}
tsi, sname, err := getNode(c, c.Args().Get(0))
if err != nil {
return err
}
if tsi.IsProxy() {
return fmt.Errorf("%s is a 'proxy' (expecting 'target')", sname)
}
daeStatus, err := _status(tsi)
if err != nil {
return V(err)
}
cdf := daeStatus.Node.TargetCDF
for mpath := range cdf.Mountpaths {
fmt.Fprintln(c.App.Writer, mpath)
break
}
return nil
}
func rotateLogs(c *cli.Context) error {
node, sname, err := arg0Node(c)
if err != nil {
return err
}
// 1. node
if node != nil {
if err := api.RotateLogs(apiBP, node.ID()); err != nil {
return V(err)
}
actionDone(c, sname+": rotated logs")
return nil
}
// 2. or cluster
if err := api.RotateClusterLogs(apiBP); err != nil {
return V(err)
}
actionDone(c, "cluster: rotated all logs")
return nil
}