rosedblabs / wal

Write Ahead Log for LSM or bitcask storage(or any append-only write).
Apache License 2.0
231 stars 38 forks source link
bitcask database kv-store lsm-tree storage write-ahead-log

wal

Write Ahead Log for LSM or bitcask storage.

Key Features

Design Overview

wal-logo.png

Format

Format of a single segment file:

       +-----+-------------+--+----+----------+------+-- ... ----+
 File  | r0  |      r1     |P | r2 |    r3    |  r4  |           |
       +-----+-------------+--+----+----------+------+-- ... ----+
       |<---- BlockSize ----->|<---- BlockSize ----->|

  rn = variable size records
  P = Padding
  BlockSize = 32KB

Format of a single record:

+----------+-------------+-----------+--- ... ---+
| CRC (4B) | Length (2B) | Type (1B) |  Payload  |
+----------+-------------+-----------+--- ... ---+

CRC = 32-bit hash computed over the payload using CRC
Length = Length of the payload data
Type = Type of record
       (FullType, FirstType, MiddleType, LastType)
       The type is used to group a bunch of records together to represent
       blocks that are larger than BlockSize
Payload = Byte stream as long as specified by the payload size

Getting Started

func main() {
    wal, _ := wal.Open(wal.DefaultOptions)
    // write some data
    chunkPosition, _ := wal.Write([]byte("some data 1"))
    // read by the position
    val, _ := wal.Read(chunkPosition)
    fmt.Println(string(val))

    wal.Write([]byte("some data 2"))
    wal.Write([]byte("some data 3"))

    // iterate all data in wal
    reader := wal.NewReader()
    for {
        val, pos, err := reader.Next()
        if err == io.EOF {
            break
        }
        fmt.Println(string(val))
        fmt.Println(pos) // get position of the data for next read
    }
}