mirror of
https://github.com/cubefs/cubefs.git
synced 2026-08-02 02:00:56 +00:00
feat(data): change extentinfo serialize for getting remote extend info#22883846
Signed-off-by: clinx <chenlin1@oppo.com>
This commit is contained in:
parent
b0807770c3
commit
e3ae2ea3f1
@ -242,7 +242,7 @@ func (dp *DataPartition) getRemoteExtentInfo(extentType uint8, tinyExtents []uin
|
||||
err = errors.Trace(err, "getRemoteExtentInfo DataPartition(%v) read from host(%v)", dp.partitionID, target)
|
||||
return
|
||||
}
|
||||
err = json.Unmarshal(reply.Data[:reply.Size], &extentFiles)
|
||||
extentFiles, err = storage.UnmarshalBinarySlice(reply.Data[:reply.Size])
|
||||
if err != nil {
|
||||
err = errors.Trace(err, "getRemoteExtentInfo DataPartition(%v) unmarshal json(%v) from host(%v)",
|
||||
dp.partitionID, string(reply.Data[:reply.Size]), target)
|
||||
|
||||
@ -117,6 +117,24 @@ func (ei *ExtentInfo) String() (m string) {
|
||||
return fmt.Sprintf("FileID(%v)_Size(%v)_IsDeleted(%v)_Source(%v)_MT(%d)_AT(%d)_CRC(%d)", ei.FileID, ei.Size, ei.IsDeleted, source, ei.ModifyTime, ei.AccessTime, ei.Crc)
|
||||
}
|
||||
|
||||
func MarshalBinarySlice(eiSlice []*ExtentInfo) (v []byte, err error) {
|
||||
buff := bytes.NewBuffer([]byte{})
|
||||
if err := binary.Write(buff, binary.BigEndian, int32(len(eiSlice))); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, ei := range eiSlice {
|
||||
data, err := ei.MarshalBinary()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if _, err := buff.Write(data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return buff.Bytes(), nil
|
||||
}
|
||||
|
||||
func (ei *ExtentInfo) MarshalBinaryWithBuffer(buff *bytes.Buffer) (err error) {
|
||||
if err = binary.Write(buff, binary.BigEndian, ei.FileID); err != nil {
|
||||
return
|
||||
@ -154,6 +172,30 @@ func (ei *ExtentInfo) MarshalBinary() (v []byte, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func UnmarshalBinarySlice(data []byte) ([]*ExtentInfo, error) {
|
||||
buff := bytes.NewBuffer(data)
|
||||
|
||||
// Read the length of the slice
|
||||
var length int32
|
||||
if err := binary.Read(buff, binary.BigEndian, &length); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
eiSlice := make([]*ExtentInfo, length)
|
||||
|
||||
// Iterate and read each ExtentInfo
|
||||
for i := int32(0); i < length; i++ {
|
||||
// Read enough bytes for one ExtentInfo
|
||||
var ei *ExtentInfo = new(ExtentInfo)
|
||||
if err := ei.UnmarshalBinaryWithBuffer(buff); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
eiSlice[i] = ei
|
||||
}
|
||||
|
||||
return eiSlice, nil
|
||||
}
|
||||
|
||||
func (ei *ExtentInfo) UnmarshalBinaryWithBuffer(buff *bytes.Buffer) (err error) {
|
||||
if err = binary.Read(buff, binary.BigEndian, &ei.FileID); err != nil {
|
||||
return
|
||||
|
||||
@ -342,3 +342,21 @@ func TestExtentRecovery(t *testing.T) {
|
||||
t.Logf("dataSize %v, snapSize %v", dataSize, snapSize)
|
||||
require.True(t, util.BlockSize*10 == dataSize)
|
||||
}
|
||||
|
||||
func TestExtentSliceSerialize(t *testing.T) {
|
||||
eiSlice := []*storage.ExtentInfo{
|
||||
{FileID: 1, Size: 100, SnapshotDataOff: 1000, IsDeleted: false},
|
||||
{FileID: 2, Size: 200, SnapshotDataOff: 2000, IsDeleted: false},
|
||||
}
|
||||
data, err := storage.MarshalBinarySlice(eiSlice)
|
||||
require.NoError(t, err)
|
||||
|
||||
deserializedSlice, err := storage.UnmarshalBinarySlice(data)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, 2, len(deserializedSlice))
|
||||
require.Equal(t, uint64(1), deserializedSlice[0].FileID)
|
||||
require.Equal(t, uint64(2), deserializedSlice[1].FileID)
|
||||
require.Equal(t, uint64(2000), deserializedSlice[1].SnapshotDataOff)
|
||||
require.Equal(t, false, deserializedSlice[0].IsDeleted)
|
||||
require.Equal(t, uint64(200), deserializedSlice[1].Size)
|
||||
}
|
||||
|
||||
@ -1214,7 +1214,7 @@ func (s *DataNode) handlePacketToGetAllWatermarks(p *repl.Packet) {
|
||||
if err != nil {
|
||||
p.PackErrorBody(ActionGetAllExtentWatermarks, err.Error())
|
||||
} else {
|
||||
buf, err = json.Marshal(fInfoList)
|
||||
buf, err = storage.MarshalBinarySlice(fInfoList)
|
||||
if err != nil {
|
||||
p.PackErrorBody(ActionGetAllExtentWatermarks, err.Error())
|
||||
} else {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user