Read implements Wal.Read.
()
| 119 | |
| 120 | // Read implements Wal.Read. |
| 121 | func (p *LevelDBWal) Read() (l *kt.Log, err error) { |
| 122 | if atomic.LoadUint32(&p.closed) == 1 { |
| 123 | err = ErrWalClosed |
| 124 | return |
| 125 | } |
| 126 | |
| 127 | if atomic.LoadUint32(&p.read) == 1 { |
| 128 | err = io.EOF |
| 129 | return |
| 130 | } |
| 131 | |
| 132 | p.readLock.Lock() |
| 133 | defer p.readLock.Unlock() |
| 134 | |
| 135 | // start with base, use iterator to read |
| 136 | if p.it == nil { |
| 137 | keyRange := util.BytesPrefix(logHeaderKeyPrefix) |
| 138 | p.it = p.db.NewIterator(keyRange, nil) |
| 139 | } |
| 140 | |
| 141 | if p.it.Next() { |
| 142 | // load |
| 143 | l, err = p.load(p.it.Value()) |
| 144 | return |
| 145 | } |
| 146 | |
| 147 | p.it.Release() |
| 148 | if err = p.it.Error(); err == nil { |
| 149 | err = io.EOF |
| 150 | } |
| 151 | p.it = nil |
| 152 | |
| 153 | // log read complete, could not read again |
| 154 | atomic.StoreUint32(&p.read, 1) |
| 155 | |
| 156 | return |
| 157 | } |
| 158 | |
| 159 | // Get implements Wal.Get. |
| 160 | func (p *LevelDBWal) Get(i uint64) (l *kt.Log, err error) { |