Lisandro Pin
16 hours ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with
915 additions and
527 deletions
-
weed/pb/volume_server.proto
-
weed/pb/volume_server_pb/volume_server.pb.go
-
weed/pb/volume_server_pb/volume_server_grpc.pb.go
-
weed/server/volume_grpc_erasure_coding.go
-
weed/storage/erasure_coding/ec_volume.go
|
|
@ -91,6 +91,9 @@ service VolumeServer { |
|
|
} |
|
|
} |
|
|
rpc VolumeEcShardsInfo (VolumeEcShardsInfoRequest) returns (VolumeEcShardsInfoResponse) { |
|
|
rpc VolumeEcShardsInfo (VolumeEcShardsInfoRequest) returns (VolumeEcShardsInfoResponse) { |
|
|
} |
|
|
} |
|
|
|
|
|
rpc VolumeEcStatus (VolumeEcStatusRequest) returns (VolumeEcStatusResponse) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// tiered storage |
|
|
// tiered storage |
|
|
rpc VolumeTierMoveDatToRemote (VolumeTierMoveDatToRemoteRequest) returns (stream VolumeTierMoveDatToRemoteResponse) { |
|
|
rpc VolumeTierMoveDatToRemote (VolumeTierMoveDatToRemoteRequest) returns (stream VolumeTierMoveDatToRemoteResponse) { |
|
|
@ -464,6 +467,16 @@ message VolumeEcShardsInfoResponse { |
|
|
repeated EcShardInfo ec_shard_infos = 1; |
|
|
repeated EcShardInfo ec_shard_infos = 1; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
message VolumeEcStatusRequest { |
|
|
|
|
|
uint32 volume_id = 1; |
|
|
|
|
|
} |
|
|
|
|
|
message VolumeEcStatusResponse { |
|
|
|
|
|
uint32 shard_count = 1; |
|
|
|
|
|
uint64 volume_size = 2; |
|
|
|
|
|
uint64 file_count = 3; |
|
|
|
|
|
uint64 file_deleted_count = 4; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
message EcShardInfo { |
|
|
message EcShardInfo { |
|
|
uint32 shard_id = 1; |
|
|
uint32 shard_id = 1; |
|
|
int64 size = 2; |
|
|
int64 size = 2; |
|
|
|
|
|
@ -564,3 +564,39 @@ func (vs *VolumeServer) VolumeEcShardsInfo(ctx context.Context, req *volume_serv |
|
|
EcShardInfos: ecShardInfos, |
|
|
EcShardInfos: ecShardInfos, |
|
|
}, nil |
|
|
}, nil |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// VolumeEcStatus returns content details for a EC volume.
|
|
|
|
|
|
func (vs *VolumeServer) VolumeEcStatus(ctx context.Context, req *volume_server_pb.VolumeEcStatusRequest) (*volume_server_pb.VolumeEcStatusResponse, error) { |
|
|
|
|
|
vid := needle.VolumeId(req.GetVolumeId()) |
|
|
|
|
|
ecv, found := vs.store.FindEcVolume(vid) |
|
|
|
|
|
if !found { |
|
|
|
|
|
return nil, fmt.Errorf("VolumeEcStatus: EC volume %d not found", vid) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
shards := uint32(len(ecv.Shards)) |
|
|
|
|
|
var files, filesDeleted, totalSize uint64 |
|
|
|
|
|
|
|
|
|
|
|
err := ecv.WalkIndex(func(_ types.NeedleId, _ types.Offset, size types.Size) error { |
|
|
|
|
|
switch size.IsDeleted() { |
|
|
|
|
|
case false: |
|
|
|
|
|
files++ |
|
|
|
|
|
totalSize += uint64(size) |
|
|
|
|
|
case true: |
|
|
|
|
|
filesDeleted++ |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
|
}) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, err |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
res := &volume_server_pb.VolumeEcStatusResponse{ |
|
|
|
|
|
ShardCount: shards, |
|
|
|
|
|
FileCount: files, |
|
|
|
|
|
FileDeletedCount: filesDeleted, |
|
|
|
|
|
VolumeSize: totalSize, |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return res, nil |
|
|
|
|
|
} |
|
|
@ -332,3 +332,10 @@ func SearchNeedleFromSortedIndex(ecxFile *os.File, ecxFileSize int64, needleId t |
|
|
func (ev *EcVolume) IsTimeToDestroy() bool { |
|
|
func (ev *EcVolume) IsTimeToDestroy() bool { |
|
|
return ev.ExpireAtSec > 0 && time.Now().Unix() > (int64(ev.ExpireAtSec)+destroyDelaySeconds) |
|
|
return ev.ExpireAtSec > 0 && time.Now().Unix() > (int64(ev.ExpireAtSec)+destroyDelaySeconds) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (ev *EcVolume) WalkIndex(processNeedleFn func(key types.NeedleId, offset types.Offset, size types.Size) error) error { |
|
|
|
|
|
if ev.ecxFile == nil { |
|
|
|
|
|
return fmt.Errorf("no ECX file associated with EC volume %v", ev.VolumeId) |
|
|
|
|
|
} |
|
|
|
|
|
return idx.WalkIndexFile(ev.ecxFile, 0, processNeedleFn) |
|
|
|
|
|
} |