diff --git a/t/neo/storage/fs1/filestorage.go b/t/neo/storage/fs1/filestorage.go index ba2b65a42cbea7c6ec77bfb9aba4146d24c6c700..18d6a2b1314f4f599460138b78527a7982c06366 100644 --- a/t/neo/storage/fs1/filestorage.go +++ b/t/neo/storage/fs1/filestorage.go @@ -410,19 +410,33 @@ func (dh *DataHeader) LoadPrevRev(r io.ReaderAt /* *os.File */) error { return io.EOF // no more previous revisions } - err = dh.Load(r, dh.PrevRevPos) + posCur := dh.Pos + + err := dh.loadPrevRev(r) + if err != nil { + // data record @...: loading prev rev: data record @...: ... + err = &ErrDataRecord{posCur, "loading prev rev", err} + } + return err +} + +func (dh *DataHeader) loadPrevRev(r io.ReaderAt /* *os.File */) error { + oid := dh.Oid + tid := dh.Tid + + err := dh.Load(r, dh.PrevRevPos) if err != nil { return err } if dh.Oid != oid { - // data record @...: while loading as prev rev for data record @...: oid mismatch ... - return ... + // XXX vvv valid only if ErrDataRecord prints oid + return decodeErr(dh, "oid mismatch") } if dh.Tid >= tid { - // data record @...: while loading as prev rev for data record @...: tid not decreasing: ... - return ... + // XXX vvv valid only if ErrDataRecord prints tid + return decodeErr(dh, "tid mismatch") } return nil @@ -436,12 +450,12 @@ func (dh *DataHeader) LoadBack(r io.ReaderAt /* *os.File */) error { } var xxx [8]byte // XXX escapes ? - _, err = r.ReadAt(xxx[:], dh.Pos + DataHeaderSize) + _, err := r.ReadAt(xxx[:], dh.Pos + DataHeaderSize) if err != nil { return dh.err("read data", noEOF(err)) } - backPos = int64(binary.BigEndian.Uint64(xxx[:])) + backPos := int64(binary.BigEndian.Uint64(xxx[:])) if backPos < dataValidFrom { return decodeErr(dh, "invalid backpointer: %v", backPos) } @@ -450,7 +464,29 @@ func (dh *DataHeader) LoadBack(r io.ReaderAt /* *os.File */) error { } // TODO backPos can be also == 0 - (means deleted rev) - err = dh.Load(r, backPos) + posCur := dh.Pos + tid := dh.Tid + + // TODO compare this with loadPrevRev() way + err = func() error { + err := dh.Load(r, backPos) + if err != nil { + return err + } + + // XXX also dh.Oid == oid ? + // but in general back pointer might point to record with different oid + if dh.Tid >= tid { + return decodeErr(dh, "tid not decreasing") + } + + return err + }() + + if err != nil { + err = &ErrDataRecord{posCur, "loading back rev", err} + } + return err } @@ -569,7 +605,7 @@ func (fs *FileStorage) Load(xid zodb.Xid) (data []byte, tid zodb.Tid, err error) // now read actual data data = make([]byte, dh.DataLen) // TODO -> slab ? - n, err := fs.file.ReadAt(data, dh.Pos + DataHeaderSize) + _, err = fs.file.ReadAt(data, dh.Pos + DataHeaderSize) if err != nil { return nil, zodb.Tid(0), &ErrXidLoad{xid, noEOF(err)} }