aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2019-06-04 21:52:37 -0700
committerChris Lu <chris.lu@gmail.com>2019-06-04 21:52:37 -0700
commit2215e81be70e4687b8ef775911e30943cc743a13 (patch)
tree2776d712f811d3f5168eb0f2113b79b08f326879
parent0e5286258672efeeb8e3f62eb15be3542627d5da (diff)
downloadseaweedfs-2215e81be70e4687b8ef775911e30943cc743a13.tar.xz
seaweedfs-2215e81be70e4687b8ef775911e30943cc743a13.zip
ui add ec shard statuses
-rw-r--r--weed/server/master_ui/templates.go2
-rw-r--r--weed/server/volume_server_handlers_ui.go2
-rw-r--r--weed/server/volume_server_ui/templates.go26
-rw-r--r--weed/storage/erasure_coding/ec_shard.go4
-rw-r--r--weed/storage/erasure_coding/ec_volume.go20
-rw-r--r--weed/storage/store_ec.go15
-rw-r--r--weed/topology/data_node.go1
-rw-r--r--weed/topology/data_node_ec.go11
8 files changed, 81 insertions, 0 deletions
diff --git a/weed/server/master_ui/templates.go b/weed/server/master_ui/templates.go
index ceb0528cf..b674e3f82 100644
--- a/weed/server/master_ui/templates.go
+++ b/weed/server/master_ui/templates.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>#ErasureCodingShards</th>
<th>Max</th>
</tr>
</thead>
@@ -88,6 +89,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.EcShards }}</td>
<td>{{ $dn.Max }}</td>
</tr>
{{ end }}
diff --git a/weed/server/volume_server_handlers_ui.go b/weed/server/volume_server_handlers_ui.go
index 17d20a36e..852f0b751 100644
--- a/weed/server/volume_server_handlers_ui.go
+++ b/weed/server/volume_server_handlers_ui.go
@@ -24,6 +24,7 @@ func (vs *VolumeServer) uiStatusHandler(w http.ResponseWriter, r *http.Request)
Version string
Masters []string
Volumes interface{}
+ EcVolumes interface{}
DiskStatuses interface{}
Stats interface{}
Counters *stats.ServerStats
@@ -31,6 +32,7 @@ func (vs *VolumeServer) uiStatusHandler(w http.ResponseWriter, r *http.Request)
util.VERSION,
vs.SeedMasterNodes,
vs.store.Status(),
+ vs.store.EcVolumes(),
ds,
infos,
serverStats,
diff --git a/weed/server/volume_server_ui/templates.go b/weed/server/volume_server_ui/templates.go
index b9740510f..eafc0aaeb 100644
--- a/weed/server/volume_server_ui/templates.go
+++ b/weed/server/volume_server_ui/templates.go
@@ -128,6 +128,32 @@ var StatusTpl = template.Must(template.New("status").Funcs(funcMap).Parse(`<!DOC
</table>
</div>
+ <div class="row">
+ <h2>Erasure Coding Shards</h2>
+ <table class="table table-striped">
+ <thead>
+ <tr>
+ <th>Id</th>
+ <th>Collection</th>
+ <th>Shard Size</th>
+ <th>Shards</th>
+ <th>CreatedAt</th>
+ </tr>
+ </thead>
+ <tbody>
+ {{ range .EcVolumes }}
+ <tr>
+ <td><code>{{ .VolumeId }}</code></td>
+ <td>{{ .Collection }}</td>
+ <td>{{ .ShardSize }} Bytes</td>
+ <td>{{ .ShardIdList }}</td>
+ <td>{{ .CreatedAt.Format "02 Jan 06 15:04 -0700" }}</td>
+ </tr>
+ {{ end }}
+ </tbody>
+ </table>
+ </div>
+
</div>
</body>
</html>
diff --git a/weed/storage/erasure_coding/ec_shard.go b/weed/storage/erasure_coding/ec_shard.go
index 9eeb35725..7b9f2dc07 100644
--- a/weed/storage/erasure_coding/ec_shard.go
+++ b/weed/storage/erasure_coding/ec_shard.go
@@ -39,6 +39,10 @@ func NewEcVolumeShard(dirname string, collection string, id needle.VolumeId, sha
return
}
+func (shard *EcVolumeShard) Size() int64 {
+ return shard.ecdFileSize
+}
+
func (shard *EcVolumeShard) String() string {
return fmt.Sprintf("ec shard %v:%v, dir:%s, Collection:%s", shard.VolumeId, shard.ShardId, shard.dir, shard.Collection)
}
diff --git a/weed/storage/erasure_coding/ec_volume.go b/weed/storage/erasure_coding/ec_volume.go
index 44d8ca80f..17e7f2935 100644
--- a/weed/storage/erasure_coding/ec_volume.go
+++ b/weed/storage/erasure_coding/ec_volume.go
@@ -20,6 +20,7 @@ type EcVolume struct {
dir string
ecxFile *os.File
ecxFileSize int64
+ ecxCreatedAt time.Time
Shards []*EcVolumeShard
ShardLocations map[ShardId][]string
ShardLocationsRefreshTime time.Time
@@ -41,6 +42,7 @@ func NewEcVolume(dir string, collection string, vid needle.VolumeId) (ev *EcVolu
return nil, fmt.Errorf("can not stat ec volume index %s.ecx: %v", baseFileName, statErr)
}
ev.ecxFileSize = ecxFi.Size()
+ ev.ecxCreatedAt = ecxFi.ModTime()
ev.ShardLocations = make(map[ShardId][]string)
@@ -113,6 +115,24 @@ func (ev *EcVolume) FileName() string {
}
+func (ev *EcVolume) ShardSize() int64 {
+ if len(ev.Shards) > 0 {
+ return ev.Shards[0].Size()
+ }
+ return 0
+}
+
+func (ev *EcVolume) CreatedAt() time.Time {
+ return ev.ecxCreatedAt
+}
+
+func (ev *EcVolume) ShardIdList() (shardIds []ShardId) {
+ for _, s := range ev.Shards {
+ shardIds = append(shardIds, s.ShardId)
+ }
+ return
+}
+
func (ev *EcVolume) ToVolumeEcShardInformationMessage() (messages []*master_pb.VolumeEcShardInformationMessage) {
prevVolumeId := needle.VolumeId(math.MaxUint32)
var m *master_pb.VolumeEcShardInformationMessage
diff --git a/weed/storage/store_ec.go b/weed/storage/store_ec.go
index 1fddb8285..4ac01c4a9 100644
--- a/weed/storage/store_ec.go
+++ b/weed/storage/store_ec.go
@@ -4,6 +4,7 @@ import (
"context"
"fmt"
"io"
+ "sort"
"sync"
"time"
@@ -365,3 +366,17 @@ func (s *Store) recoverOneRemoteEcShardInterval(ctx context.Context, ecVolume *e
return len(buf), nil
}
+
+func (s *Store) EcVolumes() (ecVolumes []*erasure_coding.EcVolume) {
+ for _, location := range s.Locations {
+ location.ecVolumesLock.RLock()
+ for _, v := range location.ecVolumes {
+ ecVolumes = append(ecVolumes, v)
+ }
+ location.ecVolumesLock.RUnlock()
+ }
+ sort.Slice(ecVolumes, func(i, j int) bool {
+ return ecVolumes[i].VolumeId > ecVolumes[j].VolumeId
+ })
+ return ecVolumes
+}
diff --git a/weed/topology/data_node.go b/weed/topology/data_node.go
index 5edc9c580..bb9970446 100644
--- a/weed/topology/data_node.go
+++ b/weed/topology/data_node.go
@@ -146,6 +146,7 @@ func (dn *DataNode) ToMap() interface{} {
ret := make(map[string]interface{})
ret["Url"] = dn.Url()
ret["Volumes"] = dn.GetVolumeCount()
+ ret["EcShards"] = dn.GetEcShardsCount()
ret["Max"] = dn.GetMaxVolumeCount()
ret["Free"] = dn.FreeSpace()
ret["PublicUrl"] = dn.PublicUrl
diff --git a/weed/topology/data_node_ec.go b/weed/topology/data_node_ec.go
index 2ea7fc6ad..a0e3a699f 100644
--- a/weed/topology/data_node_ec.go
+++ b/weed/topology/data_node_ec.go
@@ -14,6 +14,17 @@ func (dn *DataNode) GetEcShards() (ret []*erasure_coding.EcVolumeInfo) {
return ret
}
+func (dn *DataNode) GetEcShardsCount() (count int) {
+ dn.RLock()
+ defer dn.RUnlock()
+
+ for _, ecVolumeInfo := range dn.ecShards {
+ count += ecVolumeInfo.ShardBits.ShardIdCount()
+ }
+
+ return count
+}
+
func (dn *DataNode) UpdateEcShards(actualShards []*erasure_coding.EcVolumeInfo) (newShards, deletedShards []*erasure_coding.EcVolumeInfo) {
// prepare the new ec shard map
actualEcShardMap := make(map[needle.VolumeId]*erasure_coding.EcVolumeInfo)