Skip to content

Commit aec61dd

Browse files
committed
mgo: optimize seeking to end of GridFS file
1 parent dc255bb commit aec61dd

File tree

8 files changed

+25
-11
lines changed

8 files changed

+25
-11
lines changed

bulk.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ package mgo
1010
// http://blog.mongodb.org/post/84922794768/mongodbs-new-bulk-api
1111
//
1212
type Bulk struct {
13-
c *Collection
14-
ordered bool
13+
c *Collection
14+
ordered bool
1515
inserts []interface{}
1616
}
1717

@@ -44,7 +44,7 @@ func (c *Collection) Bulk() *Bulk {
4444
}
4545

4646
// Unordered puts the bulk operation in unordered mode.
47-
//
47+
//
4848
// In unordered mode the indvidual operations may be sent
4949
// out of order, which means latter operations may proceed
5050
// even if prior ones have failed.

cluster.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ func (cluster *mongoCluster) server(addr string, tcpaddr *net.TCPAddr) *mongoSer
396396

397397
func resolveAddr(addr string) (*net.TCPAddr, error) {
398398
// This hack allows having a timeout on resolution.
399-
conn, err := net.DialTimeout("udp", addr, 10 * time.Second)
399+
conn, err := net.DialTimeout("udp", addr, 10*time.Second)
400400
if err != nil {
401401
log("SYNC Failed to resolve server address: ", addr)
402402
return nil, errors.New("failed to resolve server address: " + addr)

cluster_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1184,7 +1184,7 @@ func (s *S) TestPoolLimitSimple(c *C) {
11841184
// Put the one socket back in the pool, freeing it for the copy.
11851185
session.Refresh()
11861186
delay := <-done
1187-
c.Assert(delay > 300 * time.Millisecond, Equals, true, Commentf("Delay: %s", delay))
1187+
c.Assert(delay > 300*time.Millisecond, Equals, true, Commentf("Delay: %s", delay))
11881188
}
11891189
}
11901190

gridfs.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,14 @@ func (file *GridFile) Seek(offset int64, whence int) (pos int64, err error) {
651651
if offset > file.doc.Length {
652652
return file.offset, errors.New("seek past end of file")
653653
}
654+
if offset == file.doc.Length {
655+
// If we're seeking to the end of the file,
656+
// no need to read anything. This enables
657+
// a client to find the size of the file using only the
658+
// io.ReadSeeker interface with low overhead.
659+
file.offset = offset
660+
return file.offset, nil
661+
}
654662
chunk := int(offset / int64(file.doc.ChunkSize))
655663
if chunk+1 == file.chunk && offset >= file.offset {
656664
file.rbuf = file.rbuf[int(offset-file.offset):]

gridfs_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ import (
3131
"os"
3232
"time"
3333

34+
. "gopkg.in/check.v1"
3435
"gopkg.in/mgo.v2"
3536
"gopkg.in/mgo.v2/bson"
36-
. "gopkg.in/check.v1"
3737
)
3838

3939
func (s *S) TestGridFSCreate(c *C) {
@@ -485,6 +485,13 @@ func (s *S) TestGridFSSeek(c *C) {
485485
c.Assert(err, IsNil)
486486
c.Assert(b, DeepEquals, []byte("nopqr"))
487487

488+
o, err = file.Seek(0, os.SEEK_END)
489+
c.Assert(err, IsNil)
490+
c.Assert(o, Equals, int64(22))
491+
n, err = file.Read(b)
492+
c.Assert(err, Equals, io.EOF)
493+
c.Assert(n, Equals, 0)
494+
488495
o, err = file.Seek(-10, os.SEEK_END)
489496
c.Assert(err, IsNil)
490497
c.Assert(o, Equals, int64(12))

log.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ type log_Logger interface {
4242
}
4343

4444
var (
45-
globalLogger log_Logger
46-
globalDebug bool
47-
globalMutex sync.Mutex
45+
globalLogger log_Logger
46+
globalDebug bool
47+
globalMutex sync.Mutex
4848
)
4949

5050
// RACE WARNING: There are known data races when logging, which are manually

raceoff.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,3 @@
33
package mgo
44

55
const raceDetector = false
6-

server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ func (server *mongoServer) pinger(loop bool) {
295295
time.Sleep(delay)
296296
}
297297
op := op
298-
socket, _, err := server.AcquireSocket(0, 3 * delay)
298+
socket, _, err := server.AcquireSocket(0, 3*delay)
299299
if err == nil {
300300
start := time.Now()
301301
_, _ = socket.SimpleQuery(&op)

0 commit comments

Comments
 (0)