Skip to content

Commit 6ebb2b2

Browse files
committed
Refactor
1 parent d090720 commit 6ebb2b2

File tree

4 files changed

+41
-11
lines changed

4 files changed

+41
-11
lines changed

secretary/btree.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,24 @@ import (
1010
"github.com/codeharik/secretary/utils/file"
1111
)
1212

13+
func calcNodeSize(order int) int {
14+
node := Node{
15+
Version: 1,
16+
NodeID: 1,
17+
Index: 1,
18+
ParentIndex: 1,
19+
}
20+
21+
node.KeyLocation = make([]uint64, order)
22+
node.Keys = make([][]byte, order)
23+
24+
bin, err := binstruct.Serialize(&node)
25+
if err != nil {
26+
return -1
27+
}
28+
return len(bin)
29+
}
30+
1331
func (s *Secretary) NewBTree(
1432
collectionName string,
1533
order uint8,
@@ -26,7 +44,7 @@ func (s *Secretary) NewBTree(
2644
return nil, ErrorInvalidIncrement
2745
}
2846

29-
nodeSize := uint32(order)*(KEY_SIZE+KEY_OFFSET_SIZE) + 3*POINTER_SIZE + 1
47+
nodeSize := calcNodeSize(int(order))
3048

3149
safeCollectionName := utils.SafeCollectionString(collectionName)
3250
if len(safeCollectionName) < 5 || len(safeCollectionName) > MAX_COLLECTION_NAME_LENGTH {

secretary/pager.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"math"
66
"os"
77

8+
"github.com/codeharik/secretary/utils"
89
"github.com/dgraph-io/ristretto/v2"
910
)
1011

@@ -59,15 +60,15 @@ func (tree *BTree) NewRecordPager(fileType string, level uint8) (*RecordPager, e
5960

6061
// Opens or creates a file and sets up the Pager
6162
func NewPager[T PageItem[T]](tree *BTree, fileType string, level uint8) (*Pager[T], error) {
62-
pageSize := int64(float64(tree.BaseSize) * math.Pow(float64(tree.Increment)/100, float64(level)))
63+
itemSize := int64(float64(tree.BaseSize) * math.Pow(float64(tree.Increment)/100, float64(level)))
6364

6465
var headerSize int64 = 0
6566

66-
path := fmt.Sprintf("SECRETARY/%s/%s_%d_%d.bin", tree.CollectionName, fileType, level, pageSize)
67+
path := fmt.Sprintf("SECRETARY/%s/%s_%d_%d.bin", tree.CollectionName, fileType, level, itemSize)
6768
if fileType == "index" {
6869

6970
headerSize = SECRETARY_HEADER_LENGTH
70-
pageSize = 1024 * 1024
71+
itemSize = int64(tree.nodeSize)
7172

7273
path = fmt.Sprintf("SECRETARY/%s/%s.bin", tree.CollectionName, fileType)
7374
}
@@ -104,7 +105,7 @@ func NewPager[T PageItem[T]](tree *BTree, fileType string, level uint8) (*Pager[
104105
file: file,
105106
level: level,
106107
headerSize: headerSize,
107-
itemSize: pageSize,
108+
itemSize: itemSize,
108109
dirtyPages: map[int64]bool{},
109110
}
110111

@@ -226,6 +227,17 @@ func (store *Pager[T]) WriteAt(data []byte, offset int64) error {
226227

227228
// ReadAt reads data from the specified offset in the file
228229
func (store *Pager[T]) ReadAt(offset int64, size int32) ([]byte, error) {
230+
fileInfo, err := store.file.Stat()
231+
if err != nil {
232+
return nil, ErrorFileStat(err)
233+
}
234+
fileSize := fileInfo.Size()
235+
236+
if offset+int64(size) > fileSize {
237+
utils.Log(store.itemSize)
238+
return nil, ErrorDataExceedPageSize(int(size), store.itemSize, offset)
239+
}
240+
229241
// Allocate a buffer to hold the data
230242
data := make([]byte, size)
231243

secretary/pager_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func TestPagerWriteAndReadAtOffset(t *testing.T) {
104104

105105
{ // Test: Write data that exceed batch size, Should Fail
106106
offset := int64(float64(tree.nodePager.itemSize) * 5.8)
107-
data := make([]byte, int64(float64(tree.nodePager.itemSize)*0.4))
107+
data := make([]byte, int64(float64(tree.nodePager.itemSize)*0.8))
108108

109109
err := tree.nodePager.WriteAt(data, offset)
110110
if err == nil {

secretary/utils/binstruct/binary_struct.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
"sort"
1616
)
1717

18-
var BYTEORDER binary.ByteOrder = binary.LittleEndian
18+
var BYTEORDER binary.ByteOrder = binary.BigEndian
1919

2020
// Serialize struct to binary []byte (Little-Endian)
2121
// bin : type name
@@ -720,9 +720,9 @@ func writeByteLen(buf *bytes.Buffer, numByte int, length int) error {
720720
switch numByte {
721721
case 2:
722722
return binary.Write(buf, BYTEORDER, uint16(length))
723-
case 3:
724-
return binary.Write(buf, BYTEORDER, uint32(length))
725723
case 4:
724+
return binary.Write(buf, BYTEORDER, uint32(length))
725+
case 8:
726726
return binary.Write(buf, BYTEORDER, uint64(length))
727727
default:
728728
return binary.Write(buf, BYTEORDER, uint8(length))
@@ -737,11 +737,11 @@ func readByteLen(buf *bytes.Reader, numByte int) (int, error) {
737737
var temp uint16
738738
err = binary.Read(buf, BYTEORDER, &temp)
739739
length = int(temp)
740-
case 3:
740+
case 4:
741741
var temp uint32
742742
err = binary.Read(buf, BYTEORDER, &temp)
743743
length = int(temp)
744-
case 4:
744+
case 8:
745745
var temp uint64
746746
err = binary.Read(buf, BYTEORDER, &temp)
747747
length = int(temp)

0 commit comments

Comments
 (0)