func (p *sessionRecord) readVarint(field string, r io.ByteReader) int64 { x := int64(p.readUvarintMayEOF(field, r, false)) if x < 0 { p.err = errors.NewErrCorrupted(storage.FileDesc{}, &ErrManifestCorrupted{field, "invalid negative value"}) } return x }
func (p *sessionRecord) readUvarintMayEOF(field string, r io.ByteReader, mayEOF bool) uint64 { if p.err != nil { return 0 } x, err := binary.ReadUvarint(r) if err != nil { if err == io.ErrUnexpectedEOF || (mayEOF == false && err == io.EOF) { p.err = errors.NewErrCorrupted(storage.FileDesc{}, &ErrManifestCorrupted{field, "short read"}) } else if strings.HasPrefix(err.Error(), "binary:") { p.err = errors.NewErrCorrupted(storage.FileDesc{}, &ErrManifestCorrupted{field, err.Error()}) } else { p.err = err } return 0 } return x }
func (r *Reader) corrupt(n int, reason string, skip bool) error { if r.dropper != nil { r.dropper.Drop(&ErrCorrupted{n, reason}) } if r.strict && !skip { r.err = errors.NewErrCorrupted(storage.FileDesc{}, &ErrCorrupted{n, reason}) return r.err } return errSkip }
func (p *sessionRecord) readBytes(field string, r byteReader) []byte { if p.err != nil { return nil } n := p.readUvarint(field, r) if p.err != nil { return nil } x := make([]byte, n) _, p.err = io.ReadFull(r, x) if p.err != nil { if p.err == io.ErrUnexpectedEOF { p.err = errors.NewErrCorrupted(storage.FileDesc{}, &ErrManifestCorrupted{field, "short read"}) } return nil } return x }
func newErrBatchCorrupted(reason string) error { return errors.NewErrCorrupted(storage.FileDesc{}, &ErrBatchCorrupted{reason}) }
// Check and clean files. func (db *DB) checkAndCleanFiles() error { v := db.s.version() defer v.release() tmap := make(map[int64]bool) for _, tables := range v.levels { for _, t := range tables { tmap[t.fd.Num] = false } } fds, err := db.s.stor.List(storage.TypeAll) if err != nil { return err } var nt int var rem []storage.FileDesc for _, fd := range fds { keep := true switch fd.Type { case storage.TypeManifest: keep = fd.Num >= db.s.manifestFd.Num case storage.TypeJournal: if !db.frozenJournalFd.Nil() { keep = fd.Num >= db.frozenJournalFd.Num } else { keep = fd.Num >= db.journalFd.Num } case storage.TypeTable: _, keep = tmap[fd.Num] if keep { tmap[fd.Num] = true nt++ } } if !keep { rem = append(rem, fd) } } if nt != len(tmap) { var mfds []storage.FileDesc for num, present := range tmap { if !present { mfds = append(mfds, storage.FileDesc{storage.TypeTable, num}) db.logf("db@janitor table missing @%d", num) } } return errors.NewErrCorrupted(storage.FileDesc{}, &errors.ErrMissingFiles{Fds: mfds}) } db.logf("db@janitor F·%d G·%d", len(fds), len(rem)) for _, fd := range rem { db.logf("db@janitor removing %s-%d", fd.Type, fd.Num) if err := db.s.stor.Remove(fd); err != nil { return err } } return nil }
func newErrInternalKeyCorrupted(ikey []byte, reason string) error { return errors.NewErrCorrupted(storage.FileDesc{}, &ErrInternalKeyCorrupted{append([]byte{}, ikey...), reason}) }
func newErrManifestCorrupted(fd storage.FileDesc, field, reason string) error { return errors.NewErrCorrupted(fd, &ErrManifestCorrupted{field, reason}) }