Skip to content

Commit 30fbdd8

Browse files
Alex Bondarassaf758
authored andcommitted
GetShard: support multiple chunks in the same item
1 parent e03da7d commit 30fbdd8

File tree

3 files changed

+49
-38
lines changed

3 files changed

+49
-38
lines changed

pkg/dataplane/item.go

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -85,55 +85,61 @@ func (i Item) GetFieldUint64(name string) (uint64, error) {
8585
}
8686

8787
// For internal use only - DO NOT USE!
88-
func (i Item) GetShard() (int, []*ItemChunkData, *ItemChunkMetadata, *ItemCurrentChunkMetadata, error) {
88+
func (i Item) GetShard() (map[int]*ItemChunk, *ItemCurrentChunkMetadata, error) {
8989
const streamDataPrefix = "__data_stream["
9090
const streamMetadataPrefix = "__data_stream_metadata["
9191
const offsetPrefix = "__data_stream[0000]["
9292

93-
var chunkDataArray []*ItemChunkData
94-
chunkMetaData := ItemChunkMetadata{}
9593
currentChunkMetadata := ItemCurrentChunkMetadata{}
96-
var chunkID int
94+
chunkMap := make(map[int]*ItemChunk)
9795

9896
for k, v := range i {
9997
if strings.HasPrefix(k, streamDataPrefix) {
100-
chunkID, _ = strconv.Atoi(k[len(streamDataPrefix):][:4])
98+
chunkID, _ := strconv.Atoi(k[len(streamDataPrefix):][:4])
10199
offset, _ := strconv.ParseUint(k[len(offsetPrefix):][:16], 16, 64)
102100
data, ok := v.([]byte)
103101
if !ok {
104-
return 0, nil, nil, nil, v3ioerrors.ErrInvalidTypeConversion
102+
return nil, nil, v3ioerrors.ErrInvalidTypeConversion
105103
}
106104
streamData := ItemChunkData{Offset: offset, Data: &data}
107-
chunkDataArray = append(chunkDataArray, &streamData)
105+
if _, ok := chunkMap[chunkID]; !ok {
106+
chunkMap[chunkID] = &ItemChunk{}
107+
}
108+
chunkMap[chunkID].Data = append(chunkMap[chunkID].Data, &streamData)
108109
}
109110

110111
if strings.HasPrefix(k, streamMetadataPrefix) {
111-
chunkID, _ = strconv.Atoi(k[len(streamMetadataPrefix):][:4])
112+
chunkID, _ := strconv.Atoi(k[len(streamMetadataPrefix):][:4])
113+
if _, ok := chunkMap[chunkID]; !ok {
114+
chunkMap[chunkID] = &ItemChunk{}
115+
}
116+
112117
metadata, ok := v.([]byte)
113118
if !ok {
114-
return 0, nil, nil, nil, v3ioerrors.ErrInvalidTypeConversion
119+
return nil, nil, v3ioerrors.ErrInvalidTypeConversion
115120
}
116-
117121
buf := bytes.NewBuffer(metadata[8:64])
122+
chunkMetaData := ItemChunkMetadata{}
118123
err := binary.Read(buf, binary.LittleEndian, &chunkMetaData)
119124
if err != nil {
120-
return 0, nil, nil, nil, err
125+
return nil, nil, err
121126
}
127+
chunkMap[chunkID].Metadata = &chunkMetaData
122128

123129
buf = bytes.NewBuffer(metadata[0:1])
124130
var isCurrent bool
125131
err = binary.Read(buf, binary.LittleEndian, &isCurrent)
126132
if err != nil {
127-
return 0, nil, nil, nil, err
133+
return nil, nil, err
128134
}
129135
if isCurrent {
130136
buf = bytes.NewBuffer(metadata[64:110])
131137
err = binary.Read(buf, binary.LittleEndian, &currentChunkMetadata)
132138
if err != nil {
133-
return 0, nil, nil, nil, err
139+
return nil, nil, err
134140
}
135141
}
136142
}
137143
}
138-
return chunkID, chunkDataArray, &chunkMetaData, &currentChunkMetadata, nil
144+
return chunkMap, &currentChunkMetadata, nil
139145
}

pkg/dataplane/test/sync_test.go

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,21 +1258,21 @@ func (suite *syncStreamTestSuite) TestStream() {
12581258
for _, cursorItem := range cursorItems {
12591259
shardName, err := cursorItem.GetFieldString("__name")
12601260
suite.Require().NoError(err, "Failed to get item name")
1261-
chunkId, streamData, chunkMetadata, _, err := cursorItem.GetShard()
1261+
chunkMap , _, err := cursorItem.GetShard()
12621262
suite.Require().NoError(err, "Failed to get stream")
12631263

1264-
suite.Require().Equal(0, chunkId, "chunk indexes doesn't match")
1265-
suite.Require().True(chunkMetadata.ChunkSeqNumber == 0)
1266-
suite.Require().True(chunkMetadata.FirstRecordSeqNumber == 1)
1267-
suite.Require().True(chunkMetadata.LengthInBytes == 0)
1264+
suite.Require().Contains(chunkMap, 0, "chunk indexes doesn't match")
1265+
suite.Require().True(chunkMap[0].Metadata.ChunkSeqNumber == 0)
1266+
suite.Require().True(chunkMap[0].Metadata.FirstRecordSeqNumber == 1)
1267+
suite.Require().True(chunkMap[0].Metadata.LengthInBytes == 0)
12681268
switch shardName {
12691269
case "0":
1270-
suite.Require().True(strings.Contains(string(*streamData[0].Data), string(records[4].Data)))
1270+
suite.Require().True(strings.Contains(string(*chunkMap[0].Data[0].Data), string(records[4].Data)))
12711271
case "1":
1272-
suite.Require().True(strings.Contains(string(*streamData[0].Data), string(records[0].Data)))
1273-
suite.Require().True(strings.Contains(string(*streamData[0].Data), string(records[1].Data)))
1272+
suite.Require().True(strings.Contains(string(*chunkMap[0].Data[0].Data), string(records[0].Data)))
1273+
suite.Require().True(strings.Contains(string(*chunkMap[0].Data[0].Data), string(records[1].Data)))
12741274
case "2":
1275-
suite.Require().True(strings.Contains(string(*streamData[0].Data), string(records[3].Data)))
1275+
suite.Require().True(strings.Contains(string(*chunkMap[0].Data[0].Data), string(records[3].Data)))
12761276
}
12771277
}
12781278

@@ -1355,34 +1355,34 @@ func (suite *syncStreamBackupRestoreTestSuite) TestStream() {
13551355
cursorItems, err := cursor.AllSync()
13561356
suite.Require().NoError(err)
13571357

1358-
type Chunk struct {
1359-
Data []*v3io.ItemChunkData
1360-
ChunkMetadata *v3io.ItemChunkMetadata
1361-
}
13621358
type Shard struct {
1363-
Chunks map[int]*Chunk
1359+
Chunks map[int]*v3io.ItemChunk
13641360
CurrentChunk *v3io.ItemCurrentChunkMetadata
13651361
}
13661362
streamBackup := map[string]*Shard{}
13671363
for _, cursorItem := range cursorItems {
13681364
shardName, err := cursorItem.GetFieldString("__name")
13691365
suite.Require().NoError(err, "Failed to get item name")
1370-
chunkId, chunkDataArray, chunkMetadata, currentChunkMetadata, err := cursorItem.GetShard()
1366+
chunkMap, currentChunkMetadata, err := cursorItem.GetShard()
13711367
suite.Require().NoError(err, "Failed to get stream")
13721368

13731369
if _, ok := streamBackup[shardName]; !ok {
1374-
streamBackup[shardName] = &Shard{Chunks: map[int]*Chunk{}}
1370+
streamBackup[shardName] = &Shard{Chunks: map[int]*v3io.ItemChunk{}}
13751371
}
13761372

1377-
if _, ok := streamBackup[shardName].Chunks[chunkId]; !ok {
1378-
streamBackup[shardName].Chunks[chunkId] = &Chunk{}
1379-
}
1380-
if chunkMetadata != nil {
1381-
(*streamBackup[shardName].Chunks[chunkId]).ChunkMetadata = chunkMetadata
1382-
}
1383-
if len(chunkDataArray) != 0 {
1384-
(*streamBackup[shardName].Chunks[chunkId]).Data = chunkDataArray
1373+
for chunkId := range chunkMap {
1374+
if _, ok := streamBackup[shardName].Chunks[chunkId]; !ok {
1375+
streamBackup[shardName].Chunks[chunkId] = &v3io.ItemChunk{}
1376+
}
1377+
1378+
if chunkMap[chunkId].Metadata != nil {
1379+
(*streamBackup[shardName].Chunks[chunkId]).Metadata = chunkMap[chunkId].Metadata
1380+
}
1381+
if len(chunkMap[chunkId].Data) != 0 {
1382+
(*streamBackup[shardName].Chunks[chunkId]).Data = chunkMap[chunkId].Data
1383+
}
13851384
}
1385+
13861386
if currentChunkMetadata != nil {
13871387
streamBackup[shardName].CurrentChunk = currentChunkMetadata
13881388
}

pkg/dataplane/types.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,3 +469,8 @@ type ItemChunkData struct {
469469
Offset uint64
470470
Data *[]byte
471471
}
472+
473+
type ItemChunk struct {
474+
Metadata *ItemChunkMetadata
475+
Data []*ItemChunkData
476+
}

0 commit comments

Comments
 (0)