mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
internal/era: better abstraction between era and e2store
This commit is contained in:
parent
76e08e0cf5
commit
d6cc601921
2 changed files with 22 additions and 12 deletions
|
|
@ -23,7 +23,7 @@ import (
|
|||
)
|
||||
|
||||
const (
|
||||
HeaderSize = 8
|
||||
headerSize = 8
|
||||
valueSizeLimit = 1024 * 1024 * 50
|
||||
)
|
||||
|
||||
|
|
@ -50,7 +50,7 @@ func NewWriter(w io.Writer) *Writer {
|
|||
// record store the type (2 bytes), the length (4 bytes), and some reserved
|
||||
// data (2 bytes). The remaining bytes store b.
|
||||
func (w *Writer) Write(typ uint16, b []byte) (int, error) {
|
||||
buf := make([]byte, HeaderSize+len(b))
|
||||
buf := make([]byte, headerSize+len(b))
|
||||
binary.LittleEndian.PutUint16(buf, typ)
|
||||
binary.LittleEndian.PutUint32(buf[2:], uint32(len(b)))
|
||||
copy(buf[8:], b)
|
||||
|
|
@ -91,16 +91,16 @@ func (r *Reader) ReadAt(entry *Entry, off int64) (int, error) {
|
|||
|
||||
// Check length bounds.
|
||||
if length > valueSizeLimit {
|
||||
return HeaderSize, fmt.Errorf("item larger than item size limit %d: have %d", valueSizeLimit, length)
|
||||
return headerSize, fmt.Errorf("item larger than item size limit %d: have %d", valueSizeLimit, length)
|
||||
}
|
||||
if length == 0 {
|
||||
return HeaderSize, nil
|
||||
return headerSize, nil
|
||||
}
|
||||
|
||||
// Read value.
|
||||
val := make([]byte, length)
|
||||
if n, err := r.r.ReadAt(val, off+HeaderSize); err != nil {
|
||||
n += HeaderSize
|
||||
if n, err := r.r.ReadAt(val, off+headerSize); err != nil {
|
||||
n += headerSize
|
||||
// An entry with a non-zero length should not return EOF when
|
||||
// reading the value.
|
||||
if err == io.EOF {
|
||||
|
|
@ -109,12 +109,22 @@ func (r *Reader) ReadAt(entry *Entry, off int64) (int, error) {
|
|||
return n, err
|
||||
}
|
||||
entry.Value = val
|
||||
return int(HeaderSize + length), nil
|
||||
return int(headerSize + length), nil
|
||||
}
|
||||
|
||||
// Reads the header at off and returns the total length of the entry, including
|
||||
// header.
|
||||
func (r *Reader) LengthAt(off int64) (int64, error) {
|
||||
_, length, err := r.ReadMetadataAt(off)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return int64(length) + headerSize, nil
|
||||
}
|
||||
|
||||
// ReadMetadataAt reads the header metadata at the given offset.
|
||||
func (r *Reader) ReadMetadataAt(off int64) (typ uint16, length uint32, err error) {
|
||||
b := make([]byte, HeaderSize)
|
||||
b := make([]byte, headerSize)
|
||||
if n, err := r.r.ReadAt(b, off); err != nil {
|
||||
if err == io.EOF && n > 0 {
|
||||
return 0, 0, io.ErrUnexpectedEOF
|
||||
|
|
@ -154,7 +164,7 @@ func (r *Reader) Find(want uint16) (*Entry, error) {
|
|||
}
|
||||
return &e, nil
|
||||
}
|
||||
off += int64(HeaderSize + length)
|
||||
off += int64(headerSize + length)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -181,6 +191,6 @@ func (r *Reader) FindAll(want uint16) ([]*Entry, error) {
|
|||
}
|
||||
entries = append(entries, e)
|
||||
}
|
||||
off += int64(HeaderSize + length)
|
||||
off += int64(headerSize + length)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -171,11 +171,11 @@ func (r *Reader) ReadHeaderRLP(n uint64) ([]byte, error) {
|
|||
|
||||
func skipN(r *Reader, off int64, n int) (int64, error) {
|
||||
for i := 0; i < n; i++ {
|
||||
_, length, err := r.e.ReadMetadataAt(off) // header
|
||||
length, err := r.e.LengthAt(off)
|
||||
if err != nil {
|
||||
return off, err
|
||||
}
|
||||
off += e2store.HeaderSize + int64(length)
|
||||
off += length
|
||||
}
|
||||
return off, nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue