forked from mirror/ledisdb
update table reader
This commit is contained in:
parent
c3303e1fdb
commit
4a0244180a
|
@ -41,27 +41,26 @@ type tableReader struct {
|
|||
first uint64
|
||||
last uint64
|
||||
|
||||
lastTime uint32
|
||||
|
||||
offsetStartPos int64
|
||||
offsetLen uint32
|
||||
|
||||
lastReadTime sync2.AtomicInt64
|
||||
}
|
||||
|
||||
func newTableReader(name string) (*tableReader, error) {
|
||||
func newTableReader(base string, index int64) (*tableReader, error) {
|
||||
t := new(tableReader)
|
||||
t.name = name
|
||||
t.name = path.Join(base, fmtTableName(index))
|
||||
t.index = index
|
||||
|
||||
var err error
|
||||
|
||||
if _, err = fmt.Sscanf(path.Base(name), "%d.ldb", &t.index); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err = t.check(); err != nil {
|
||||
log.Error("check %s error: %s, try to repair", name, err.Error())
|
||||
log.Error("check %s error: %s, try to repair", t.name, err.Error())
|
||||
|
||||
if err = t.repair(); err != nil {
|
||||
log.Error("repair %s error: %s", name, err.Error())
|
||||
log.Error("repair %s error: %s", t.name, err.Error())
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
@ -164,6 +163,7 @@ func (t *tableReader) check() error {
|
|||
}
|
||||
|
||||
t.last = l.ID
|
||||
t.lastTime = l.CreateTime
|
||||
|
||||
if t.first > t.last {
|
||||
return fmt.Errorf("invalid log table first %d > last %d", t.first, t.last)
|
||||
|
@ -206,6 +206,8 @@ func (t *tableReader) repair() error {
|
|||
break
|
||||
}
|
||||
|
||||
t.lastTime = l.CreateTime
|
||||
|
||||
if err := tw.StoreLog(&l); err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import (
|
|||
"github.com/siddontang/go/log"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
@ -80,6 +81,7 @@ func TestFileTable(t *testing.T) {
|
|||
}
|
||||
|
||||
var r *tableReader
|
||||
|
||||
name := w.name
|
||||
|
||||
if r, err = w.Flush(); err != nil {
|
||||
|
@ -111,7 +113,7 @@ func TestFileTable(t *testing.T) {
|
|||
|
||||
r.Close()
|
||||
|
||||
if r, err = newTableReader(name); err != nil {
|
||||
if r, err = newTableReader(base, 1); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer r.Close()
|
||||
|
@ -135,34 +137,32 @@ func TestFileTable(t *testing.T) {
|
|||
|
||||
r.Close()
|
||||
|
||||
testRepair(t, name, s, 11)
|
||||
testRepair(t, name, s, 32)
|
||||
testRepair(t, name, s, 42)
|
||||
testRepair(t, name, s, 72)
|
||||
testRepair(t, name, 1, s, 11)
|
||||
testRepair(t, name, 1, s, 32)
|
||||
testRepair(t, name, 1, s, 42)
|
||||
testRepair(t, name, 1, s, 72)
|
||||
|
||||
if err := os.Truncate(name, s-73); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if r, err = newTableReader(name); err == nil {
|
||||
if r, err = newTableReader(base, 1); err == nil {
|
||||
t.Fatal("can not repair")
|
||||
}
|
||||
|
||||
name = w.name
|
||||
|
||||
if r, err := w.Flush(); err != nil {
|
||||
t.Fatal(err)
|
||||
} else {
|
||||
r.Close()
|
||||
}
|
||||
|
||||
if r, err = newTableReader(name); err != nil {
|
||||
if r, err = newTableReader(base, 2); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer r.Close()
|
||||
}
|
||||
|
||||
func testRepair(t *testing.T, name string, s int64, cutSize int64) {
|
||||
func testRepair(t *testing.T, name string, index int64, s int64, cutSize int64) {
|
||||
var r *tableReader
|
||||
var err error
|
||||
|
||||
|
@ -170,7 +170,7 @@ func testRepair(t *testing.T, name string, s int64, cutSize int64) {
|
|||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if r, err = newTableReader(name); err != nil {
|
||||
if r, err = newTableReader(path.Dir(name), index); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer r.Close()
|
||||
|
|
Loading…
Reference in New Issue