Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit b77f22b

Browse files
committed
Avoid unnecessary seek calls that are determining offsets that are already known or about to be thrown away anyway.
Signed-off-by: Filip Navara <[email protected]>
1 parent c2ab4ac commit b77f22b

File tree

4 files changed

+50
-40
lines changed

4 files changed

+50
-40
lines changed

plumbing/format/packfile/packfile.go

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -79,19 +79,11 @@ func (p *Packfile) GetByOffset(o int64) (plumbing.EncodedObject, error) {
7979
}
8080
}
8181

82-
if _, err := p.s.SeekFromStart(o); err != nil {
83-
if err == io.EOF || isInvalid(err) {
84-
return nil, plumbing.ErrObjectNotFound
85-
}
86-
87-
return nil, err
88-
}
89-
90-
return p.nextObject()
82+
return p.objectAtOffset(o);
9183
}
9284

93-
func (p *Packfile) nextObjectHeader() (*ObjectHeader, error) {
94-
h, err := p.s.NextObjectHeader()
85+
func (p *Packfile) objectHeaderAtOffset(offset int64) (*ObjectHeader, error) {
86+
h, err := p.s.SeekObjectHeader(offset)
9587
p.s.pendingObject = nil
9688
return h, err
9789
}
@@ -131,11 +123,7 @@ func (p *Packfile) getObjectData(
131123
if baseType, ok := p.offsetToType[offset]; ok {
132124
typ = baseType
133125
} else {
134-
if _, err = p.s.SeekFromStart(offset); err != nil {
135-
return
136-
}
137-
138-
h, err = p.nextObjectHeader()
126+
h, err = p.objectHeaderAtOffset(offset)
139127
if err != nil {
140128
return
141129
}
@@ -192,11 +180,7 @@ func (p *Packfile) getObjectType(h *ObjectHeader) (typ plumbing.ObjectType, err
192180
if baseType, ok := p.offsetToType[offset]; ok {
193181
typ = baseType
194182
} else {
195-
if _, err = p.s.SeekFromStart(offset); err != nil {
196-
return
197-
}
198-
199-
h, err = p.nextObjectHeader()
183+
h, err = p.objectHeaderAtOffset(offset)
200184
if err != nil {
201185
return
202186
}
@@ -213,8 +197,8 @@ func (p *Packfile) getObjectType(h *ObjectHeader) (typ plumbing.ObjectType, err
213197
return
214198
}
215199

216-
func (p *Packfile) nextObject() (plumbing.EncodedObject, error) {
217-
h, err := p.nextObjectHeader()
200+
func (p *Packfile) objectAtOffset(offset int64) (plumbing.EncodedObject, error) {
201+
h, err := p.objectHeaderAtOffset(offset)
218202
if err != nil {
219203
if err == io.EOF || isInvalid(err) {
220204
return nil, plumbing.ErrObjectNotFound
@@ -271,11 +255,7 @@ func (p *Packfile) getObjectContent(offset int64) (io.ReadCloser, error) {
271255
}
272256
}
273257

274-
if _, err := p.s.SeekFromStart(offset); err != nil {
275-
return nil, err
276-
}
277-
278-
h, err := p.nextObjectHeader()
258+
h, err := p.objectHeaderAtOffset(offset)
279259
if err != nil {
280260
return nil, err
281261
}

plumbing/format/packfile/parser.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -401,11 +401,7 @@ func (p *Parser) readData(o *objectInfo) ([]byte, error) {
401401
return data, nil
402402
}
403403

404-
if _, err := p.scanner.SeekFromStart(o.Offset); err != nil {
405-
return nil, err
406-
}
407-
408-
if _, err := p.scanner.NextObjectHeader(); err != nil {
404+
if _, err := p.scanner.SeekObjectHeader(o.Offset); err != nil {
409405
return nil, err
410406
}
411407

plumbing/format/packfile/scanner.go

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,52 @@ func (s *Scanner) readCount() (uint32, error) {
138138
return binary.ReadUint32(s.r)
139139
}
140140

141+
// SeekObjectHeader seeks to specified offset and returns the ObjectHeader
142+
// for the next object in the reader
143+
func (s *Scanner) SeekObjectHeader(offset int64) (*ObjectHeader, error) {
144+
// if seeking we assume that you are not interested on the header
145+
if s.version == 0 {
146+
s.version = VersionSupported
147+
}
148+
149+
if _, err := s.r.Seek(offset, io.SeekStart); err != nil {
150+
return nil, err
151+
}
152+
153+
h, err := s.nextObjectHeader();
154+
if err != nil {
155+
return nil, err
156+
}
157+
158+
h.Offset = offset
159+
return h, nil
160+
}
161+
141162
// NextObjectHeader returns the ObjectHeader for the next object in the reader
142163
func (s *Scanner) NextObjectHeader() (*ObjectHeader, error) {
143-
defer s.Flush()
144-
145164
if err := s.doPending(); err != nil {
146165
return nil, err
147166
}
148167

168+
offset, err := s.r.Seek(0, io.SeekCurrent);
169+
if err != nil {
170+
return nil, err
171+
}
172+
173+
h, err := s.nextObjectHeader();
174+
if err != nil {
175+
return nil, err
176+
}
177+
178+
h.Offset = offset
179+
return h, nil
180+
}
181+
182+
// nextObjectHeader returns the ObjectHeader for the next object in the reader
183+
// without the Offset field
184+
func (s *Scanner) nextObjectHeader() (*ObjectHeader, error) {
185+
defer s.Flush()
186+
149187
s.crc.Reset()
150188

151189
h := &ObjectHeader{}

storage/filesystem/object.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -322,11 +322,7 @@ func (s *ObjectStorage) decodeDeltaObjectAt(
322322
}
323323

324324
p := packfile.NewScanner(f)
325-
if _, err := p.SeekFromStart(offset); err != nil {
326-
return nil, err
327-
}
328-
329-
header, err := p.NextObjectHeader()
325+
header, err := p.SeekObjectHeader(offset);
330326
if err != nil {
331327
return nil, err
332328
}

0 commit comments

Comments
 (0)