@@ -39,13 +39,18 @@ func openDatalog(opts *Options) (*datalog, error) {
3939 if ext != segmentExt {
4040 continue
4141 }
42- seg , err := dl .openSegment (name )
42+ id , seqID , err := parseSegmentName (name )
43+ if err != nil {
44+ return nil , err
45+ }
46+ seg , err := dl .openSegment (name , id , seqID )
4347 if err != nil {
4448 return nil , err
4549 }
4650 if seg .sequenceID > dl .maxSequenceID {
4751 dl .maxSequenceID = seg .sequenceID
4852 }
53+ dl .segments [seg .id ] = seg
4954 }
5055
5156 if err := dl .swapSegment (); err != nil {
@@ -71,46 +76,33 @@ func parseSegmentName(name string) (uint16, uint64, error) {
7176 return uint16 (id ), seqID , nil
7277}
7378
74- func (dl * datalog ) openSegment (name string ) (* segment , error ) {
75- id , seqID , err := parseSegmentName (name )
76- if err != nil {
77- return nil , err
78- }
79+ func (dl * datalog ) openSegment (name string , id uint16 , seqID uint64 ) (* segment , error ) {
7980 f , err := openFile (dl .opts .FileSystem , filepath .Join (dl .opts .path , name ), false )
8081 if err != nil {
8182 return nil , err
8283 }
84+
8385 meta := & segmentMeta {}
8486 if ! f .empty () {
8587 metaPath := filepath .Join (dl .opts .path , name + metaExt )
8688 if err := readGobFile (dl .opts .FileSystem , metaPath , & meta ); err != nil {
8789 logger .Printf ("error reading segment meta %d: %v" , id , err )
8890 // TODO: rebuild meta?
8991 }
90- } else {
91- dl .maxSequenceID ++
92- seqID = dl .maxSequenceID
9392 }
9493
95- df := & segment {
94+ seg := & segment {
9695 file : f ,
9796 id : id ,
9897 sequenceID : seqID ,
9998 name : name ,
10099 meta : meta ,
101100 }
102- dl . segments [ id ] = df
103- return df , nil
101+
102+ return seg , nil
104103}
105104
106105func (dl * datalog ) nextWritableSegmentID () (uint16 , uint64 , error ) {
107- for id , seg := range dl .segments {
108- // Pick unfilled segment.
109- if seg != nil && ! seg .meta .Full {
110- dl .maxSequenceID ++
111- return uint16 (id ), dl .maxSequenceID , nil
112- }
113- }
114106 for id , seg := range dl .segments {
115107 // Pick empty segment.
116108 if seg == nil {
@@ -122,21 +114,29 @@ func (dl *datalog) nextWritableSegmentID() (uint16, uint64, error) {
122114}
123115
124116func (dl * datalog ) swapSegment () error {
117+ // Pick unfilled segment.
118+ for _ , seg := range dl .segments {
119+ if seg != nil && ! seg .meta .Full {
120+ dl .curSeg = seg
121+ return nil
122+ }
123+ }
124+
125+ // Create new segment.
125126 id , seqID , err := dl .nextWritableSegmentID ()
126127 if err != nil {
127128 return err
128129 }
129- var seg * segment
130- if dl .segments [id ] != nil {
131- seg = dl .segments [id ]
132- } else {
133- name := segmentName (id , seqID )
134- seg , err = dl .openSegment (name )
135- if err != nil {
136- return err
137- }
130+
131+ name := segmentName (id , seqID )
132+ seg , err := dl .openSegment (name , id , seqID )
133+ if err != nil {
134+ return err
138135 }
136+
137+ dl .segments [id ] = seg
139138 dl .curSeg = seg
139+
140140 return nil
141141}
142142
@@ -189,14 +189,13 @@ func (dl *datalog) readKey(sl slot) ([]byte, error) {
189189 return key, nil*/
190190}
191191
192- func (dl * datalog ) trackOverwrite (sl slot ) {
192+ func (dl * datalog ) trackDel (sl slot ) {
193193 meta := dl .segments [sl .segmentID ].meta
194194 meta .DeletedKeys ++
195195 meta .DeletedBytes += encodedRecordSize (sl .kvSize ())
196196}
197197
198- func (dl * datalog ) del (key []byte , sl slot ) error {
199- dl .trackOverwrite (sl )
198+ func (dl * datalog ) del (key []byte ) error {
200199 delRecord := encodeDeleteRecord (key )
201200 _ , _ , err := dl .writeRecord (delRecord , recordTypeDelete )
202201 if err != nil {
@@ -226,7 +225,7 @@ func (dl *datalog) writeRecord(data []byte, rt recordType) (uint16, uint32, erro
226225 return dl .curSeg .id , uint32 (off ), nil
227226}
228227
229- func (dl * datalog ) writeKeyValue (key []byte , value []byte ) (uint16 , uint32 , error ) {
228+ func (dl * datalog ) put (key []byte , value []byte ) (uint16 , uint32 , error ) {
230229 return dl .writeRecord (encodePutRecord (key , value ), recordTypePut )
231230}
232231
@@ -250,20 +249,20 @@ func (dl *datalog) close() error {
250249 return nil
251250}
252251
253- func ( dl * datalog ) segmentsBySequenceID () ([] * segment , error ) {
254- // Sort segments in ascending order by sequence ID.
252+ // segmentsBySequenceID returns segments ordered from oldest to newest.
253+ func ( dl * datalog ) segmentsBySequenceID () [] * segment {
255254 var segments []* segment
256255
257- for _ , f := range dl .segments {
258- if f == nil {
256+ for _ , seg := range dl .segments {
257+ if seg == nil {
259258 continue
260259 }
261- segments = append (segments , f )
260+ segments = append (segments , seg )
262261 }
263262
264263 sort .SliceStable (segments , func (i , j int ) bool {
265264 return segments [i ].sequenceID < segments [j ].sequenceID
266265 })
267266
268- return segments , nil
267+ return segments
269268}
0 commit comments