@@ -88,9 +88,9 @@ func newWal(path string, tx *badger.Txn, m *mem, size int64) *wal {
8888 y .Check (err )
8989 }
9090 if m == nil {
91- return & wal {f : f , m : make (map [uint64 ]* pointer ), dirty : true }
91+ return & wal {f : f , m : make (map [uint64 ]pointer ), dirty : true }
9292 }
93- w := & wal {f : f , tx : tx , m : make (map [uint64 ]* pointer , len (m .m )), dirty : true }
93+ w := & wal {f : f , tx : tx , m : make (map [uint64 ]pointer , len (m .m )), dirty : true }
9494 for _ , e := range m .m {
9595 y .Check (w .append (e ))
9696 }
@@ -116,7 +116,7 @@ func walInitSize(max int64) int {
116116type wal struct {
117117 tx * badger.Txn
118118 f * z.MmapFile
119- m map [uint64 ]* pointer
119+ m map [uint64 ]pointer
120120 pos int64
121121 o sync.Once
122122
@@ -190,7 +190,7 @@ func (w *wal) append(e *badger.Entry) error {
190190 if err != nil {
191191 return err
192192 }
193- p := & pointer {
193+ p := pointer {
194194 key : e .Key ,
195195 offset : uint32 (w .pos ),
196196 len : l ,
@@ -219,35 +219,47 @@ func (w *wal) read(key []byte, cpy bool) (*badger.Entry, error) {
219219 return w .readPtr (p , cpy )
220220}
221221
222- func (w * wal ) readPtr (p * pointer , cpy bool ) ( * badger. Entry , error ) {
222+ func (w * wal ) readPtrRaw (p pointer ) ( k , v [] byte , userMeta byte , expiresAt uint64 ) {
223223 buf := w .f .Slice (int (p .offset ))
224- var e walEntry
225- e .h .decode (buf )
226- e .k = buf [headerSize : headerSize + e .h .klen ]
227- e .v = buf [headerSize + e .h .klen : headerSize + e .h .klen + e .h .vlen ]
224+ var h header
225+ h .decode (buf )
226+ k = buf [headerSize : headerSize + h .klen ]
227+ v = buf [headerSize + h .klen : headerSize + h .klen + h .vlen ]
228+ return k , v , h .userMeta , h .expiresAt
229+ }
230+
231+ func (w * wal ) readPtr (p pointer , cpy bool ) (* badger.Entry , error ) {
232+ k , v , userMeta , expiresAt := w .readPtrRaw (p )
228233 if cpy {
229- e . k = y .SafeCopy (nil , e . k )
230- e . v = y .SafeCopy (nil , e . v )
234+ k = y .SafeCopy (nil , k )
235+ v = y .SafeCopy (nil , v )
231236 }
232237 return & badger.Entry {
233- Key : e . k ,
234- Value : e . v ,
235- UserMeta : e . h . userMeta ,
236- ExpiresAt : e . h . expiresAt ,
238+ Key : k ,
239+ Value : v ,
240+ UserMeta : userMeta ,
241+ ExpiresAt : expiresAt ,
237242 }, nil
238243}
239244
240- func (w * wal ) Replay (fn func (e * badger. Entry ) error ) error {
241- for _ , v := range w .m {
242- e , err := w .readPtr ( v , true )
243- if err != nil {
245+ func (w * wal ) ReplayRaw (fn func (key , value [] byte , userMeta byte , expiresAt uint64 ) error ) error {
246+ for _ , p := range w .m {
247+ k , v , userMeta , expiresAt := w .readPtrRaw ( p )
248+ if err := fn ( k , v , userMeta , expiresAt ); err != nil {
244249 return err
245250 }
251+ }
252+ return nil
253+ }
254+
255+ func (w * wal ) Replay (fn func (e * badger.Entry ) error ) error {
256+ return w .ReplayRaw (func (key , value []byte , userMeta byte , expiresAt uint64 ) error {
257+ e := & badger.Entry {Key : y .SafeCopy (nil , key ), Value : y .SafeCopy (nil , value ), UserMeta : userMeta , ExpiresAt : expiresAt }
246258 if err := fn (e ); err != nil {
247259 return err
248260 }
249- }
250- return nil
261+ return nil
262+ })
251263}
252264
253265func (w * wal ) newIterator (prefix []byte , readTs uint64 , reversed bool ) iterator {
@@ -287,7 +299,7 @@ func (w *wal) rebuildEntries() {
287299type entry struct {
288300 h uint64
289301 key []byte
290- p * pointer
302+ p pointer
291303}
292304
293305type walIterator struct {
0 commit comments