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 (
|
const (
|
||||||
HeaderSize = 8
|
headerSize = 8
|
||||||
valueSizeLimit = 1024 * 1024 * 50
|
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
|
// record store the type (2 bytes), the length (4 bytes), and some reserved
|
||||||
// data (2 bytes). The remaining bytes store b.
|
// data (2 bytes). The remaining bytes store b.
|
||||||
func (w *Writer) Write(typ uint16, b []byte) (int, error) {
|
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.PutUint16(buf, typ)
|
||||||
binary.LittleEndian.PutUint32(buf[2:], uint32(len(b)))
|
binary.LittleEndian.PutUint32(buf[2:], uint32(len(b)))
|
||||||
copy(buf[8:], b)
|
copy(buf[8:], b)
|
||||||
|
|
@ -91,16 +91,16 @@ func (r *Reader) ReadAt(entry *Entry, off int64) (int, error) {
|
||||||
|
|
||||||
// Check length bounds.
|
// Check length bounds.
|
||||||
if length > valueSizeLimit {
|
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 {
|
if length == 0 {
|
||||||
return HeaderSize, nil
|
return headerSize, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read value.
|
// Read value.
|
||||||
val := make([]byte, length)
|
val := make([]byte, length)
|
||||||
if n, err := r.r.ReadAt(val, off+HeaderSize); err != nil {
|
if n, err := r.r.ReadAt(val, off+headerSize); err != nil {
|
||||||
n += HeaderSize
|
n += headerSize
|
||||||
// An entry with a non-zero length should not return EOF when
|
// An entry with a non-zero length should not return EOF when
|
||||||
// reading the value.
|
// reading the value.
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
|
|
@ -109,12 +109,22 @@ func (r *Reader) ReadAt(entry *Entry, off int64) (int, error) {
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
entry.Value = val
|
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.
|
// ReadMetadataAt reads the header metadata at the given offset.
|
||||||
func (r *Reader) ReadMetadataAt(off int64) (typ uint16, length uint32, err error) {
|
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 n, err := r.r.ReadAt(b, off); err != nil {
|
||||||
if err == io.EOF && n > 0 {
|
if err == io.EOF && n > 0 {
|
||||||
return 0, 0, io.ErrUnexpectedEOF
|
return 0, 0, io.ErrUnexpectedEOF
|
||||||
|
|
@ -154,7 +164,7 @@ func (r *Reader) Find(want uint16) (*Entry, error) {
|
||||||
}
|
}
|
||||||
return &e, nil
|
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)
|
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) {
|
func skipN(r *Reader, off int64, n int) (int64, error) {
|
||||||
for i := 0; i < n; i++ {
|
for i := 0; i < n; i++ {
|
||||||
_, length, err := r.e.ReadMetadataAt(off) // header
|
length, err := r.e.LengthAt(off)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return off, err
|
return off, err
|
||||||
}
|
}
|
||||||
off += e2store.HeaderSize + int64(length)
|
off += length
|
||||||
}
|
}
|
||||||
return off, nil
|
return off, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue