Browse Source
Merge pull request #1337 from bingoohuang/master
add Volume Ids column only for max 100 volumes for convenience in the master ui.
pull/1341/head
Chris Lu
5 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with
86 additions and
0 deletions
-
weed/server/master_ui/templates.go
-
weed/topology/data_node.go
-
weed/util/inits.go
-
weed/util/inits_test.go
|
|
@ -76,6 +76,7 @@ var StatusTpl = template.Must(template.New("status").Parse(`<!DOCTYPE html> |
|
|
|
<th>Rack</th> |
|
|
|
<th>RemoteAddr</th> |
|
|
|
<th>#Volumes</th> |
|
|
|
<th>Volume Ids</th> |
|
|
|
<th>#ErasureCodingShards</th> |
|
|
|
<th>Max</th> |
|
|
|
</tr> |
|
|
@ -89,6 +90,7 @@ var StatusTpl = template.Must(template.New("status").Parse(`<!DOCTYPE html> |
|
|
|
<td>{{ $rack.Id }}</td> |
|
|
|
<td><a href="http://{{ $dn.Url }}/ui/index.html">{{ $dn.Url }}</a></td> |
|
|
|
<td>{{ $dn.Volumes }}</td> |
|
|
|
<td>{{ $dn.VolumeIds}}</td> |
|
|
|
<td>{{ $dn.EcShards }}</td> |
|
|
|
<td>{{ $dn.Max }}</td> |
|
|
|
</tr> |
|
|
|
|
|
@ -2,6 +2,7 @@ package topology |
|
|
|
|
|
|
|
import ( |
|
|
|
"fmt" |
|
|
|
"github.com/chrislusf/seaweedfs/weed/util" |
|
|
|
"strconv" |
|
|
|
"sync" |
|
|
|
|
|
|
@ -166,6 +167,7 @@ func (dn *DataNode) ToMap() interface{} { |
|
|
|
ret := make(map[string]interface{}) |
|
|
|
ret["Url"] = dn.Url() |
|
|
|
ret["Volumes"] = dn.GetVolumeCount() |
|
|
|
ret["VolumeIds"] = dn.GetVolumeIds() |
|
|
|
ret["EcShards"] = dn.GetEcShardCount() |
|
|
|
ret["Max"] = dn.GetMaxVolumeCount() |
|
|
|
ret["Free"] = dn.FreeSpace() |
|
|
@ -190,3 +192,14 @@ func (dn *DataNode) ToDataNodeInfo() *master_pb.DataNodeInfo { |
|
|
|
} |
|
|
|
return m |
|
|
|
} |
|
|
|
|
|
|
|
// GetVolumeIds returns the human readable volume ids limited to count of max 100.
|
|
|
|
func (dn *DataNode) GetVolumeIds() string { |
|
|
|
ids := make([]int, 0, len(dn.volumes)) |
|
|
|
|
|
|
|
for k := range dn.volumes { |
|
|
|
ids = append(ids, int(k)) |
|
|
|
} |
|
|
|
|
|
|
|
return util.HumanReadableIntsMax(100, ids...) |
|
|
|
} |
|
|
@ -0,0 +1,52 @@ |
|
|
|
package util |
|
|
|
|
|
|
|
import ( |
|
|
|
"fmt" |
|
|
|
"sort" |
|
|
|
) |
|
|
|
|
|
|
|
// HumanReadableIntsMax joins a serials of inits into a smart one like 1-3 5 ... for human readable.
|
|
|
|
func HumanReadableIntsMax(max int, ids ...int) string { |
|
|
|
if len(ids) <= max { |
|
|
|
return HumanReadableInts(ids...) |
|
|
|
} |
|
|
|
|
|
|
|
return HumanReadableInts(ids[:max]...) + " ..." |
|
|
|
} |
|
|
|
|
|
|
|
// HumanReadableInts joins a serials of inits into a smart one like 1-3 5 7-10 for human readable.
|
|
|
|
func HumanReadableInts(ids ...int) string { |
|
|
|
sort.Ints(ids) |
|
|
|
|
|
|
|
s := "" |
|
|
|
start := 0 |
|
|
|
last := 0 |
|
|
|
|
|
|
|
for i, v := range ids { |
|
|
|
if i == 0 { |
|
|
|
start = v |
|
|
|
last = v |
|
|
|
s = fmt.Sprintf("%d", v) |
|
|
|
continue |
|
|
|
} |
|
|
|
|
|
|
|
if last+1 == v { |
|
|
|
last = v |
|
|
|
continue |
|
|
|
} |
|
|
|
|
|
|
|
if last > start { |
|
|
|
s += fmt.Sprintf("-%d", last) |
|
|
|
} |
|
|
|
|
|
|
|
s += fmt.Sprintf(" %d", v) |
|
|
|
start = v |
|
|
|
last = v |
|
|
|
} |
|
|
|
|
|
|
|
if last != start { |
|
|
|
s += fmt.Sprintf("-%d", last) |
|
|
|
} |
|
|
|
|
|
|
|
return s |
|
|
|
} |
|
|
@ -0,0 +1,19 @@ |
|
|
|
package util |
|
|
|
|
|
|
|
import ( |
|
|
|
"github.com/stretchr/testify/assert" |
|
|
|
"testing" |
|
|
|
) |
|
|
|
|
|
|
|
func TestHumanReadableIntsMax(t *testing.T) { |
|
|
|
assert.Equal(t, "1-2 ...", HumanReadableIntsMax(2, 1, 2, 3)) |
|
|
|
assert.Equal(t, "1 3 ...", HumanReadableIntsMax(2, 1, 3, 5)) |
|
|
|
} |
|
|
|
|
|
|
|
func TestHumanReadableInts(t *testing.T) { |
|
|
|
assert.Equal(t, "1-3", HumanReadableInts(1, 2, 3)) |
|
|
|
assert.Equal(t, "1 3", HumanReadableInts(1, 3)) |
|
|
|
assert.Equal(t, "1 3 5", HumanReadableInts(5, 1, 3)) |
|
|
|
assert.Equal(t, "1-3 5", HumanReadableInts(1, 2, 3, 5)) |
|
|
|
assert.Equal(t, "1-3 5 7-9", HumanReadableInts(7, 9, 8, 1, 2, 3, 5)) |
|
|
|
} |