|
|
@ -10,6 +10,7 @@ import ( |
|
|
|
"github.com/chrislusf/seaweedfs/weed/stats" |
|
|
|
"github.com/chrislusf/seaweedfs/weed/storage/needle" |
|
|
|
"github.com/chrislusf/seaweedfs/weed/storage/super_block" |
|
|
|
"github.com/chrislusf/seaweedfs/weed/storage/types" |
|
|
|
) |
|
|
|
|
|
|
|
func (vs *VolumeServer) DeleteCollection(ctx context.Context, req *volume_server_pb.DeleteCollectionRequest) (*volume_server_pb.DeleteCollectionResponse, error) { |
|
|
@ -166,3 +167,44 @@ func (vs *VolumeServer) VolumeServerStatus(ctx context.Context, req *volume_serv |
|
|
|
return resp, nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
func (vs *VolumeServer) VolumeNeedleStatus(ctx context.Context, req *volume_server_pb.VolumeNeedleStatusRequest) (*volume_server_pb.VolumeNeedleStatusResponse, error) { |
|
|
|
|
|
|
|
resp := &volume_server_pb.VolumeNeedleStatusResponse{} |
|
|
|
|
|
|
|
volumeId := needle.VolumeId(req.VolumeId) |
|
|
|
|
|
|
|
n := &needle.Needle{ |
|
|
|
Id: types.NeedleId(req.NeedleId), |
|
|
|
} |
|
|
|
|
|
|
|
var count int |
|
|
|
var err error |
|
|
|
hasVolume := vs.store.HasVolume(volumeId) |
|
|
|
if !hasVolume { |
|
|
|
_, hasEcVolume := vs.store.FindEcVolume(volumeId) |
|
|
|
if !hasEcVolume { |
|
|
|
return nil, fmt.Errorf("volume not found %d", req.VolumeId) |
|
|
|
} |
|
|
|
count, err = vs.store.ReadEcShardNeedle(volumeId, n) |
|
|
|
} else { |
|
|
|
count, err = vs.store.ReadVolumeNeedle(volumeId, n) |
|
|
|
} |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
if count < 0 { |
|
|
|
return nil, fmt.Errorf("needle not found %d", n.Id) |
|
|
|
} |
|
|
|
|
|
|
|
resp.NeedleId = uint64(n.Id) |
|
|
|
resp.Cookie = uint32(n.Cookie) |
|
|
|
resp.Size = n.Size |
|
|
|
resp.LastModified = n.LastModified |
|
|
|
resp.Crc = n.Checksum.Value() |
|
|
|
if n.HasTtl() { |
|
|
|
resp.Ttl = n.Ttl.String() |
|
|
|
} |
|
|
|
return resp, nil |
|
|
|
|
|
|
|
} |