feat(data): change extentinfo serialize for getting remote extend info#22883846

Signed-off-by: clinx <chenlin1@oppo.com>
This commit is contained in:
clinx 2025-01-13 12:23:21 +08:00 committed by zhumingze1108
parent b0807770c3
commit e3ae2ea3f1
4 changed files with 62 additions and 2 deletions

View File

@ -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)

View File

@ -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

View File

@ -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)
}

View File

@ -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 {