]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Fix issue #97
authorMatt Joiner <anacrolix@gmail.com>
Tue, 12 Jul 2016 06:45:22 +0000 (16:45 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Tue, 12 Jul 2016 06:45:22 +0000 (16:45 +1000)
storage/completion.go
storage/completion_piece_map.go
storage/db.go
storage/file_storage_piece.go
storage/mmap.go

index 13c99e2d64addfe866dc943d3549948f96e1d137..a5c28fcb4a6442a342e378e8f333bfd0ccfb3ef1 100644 (file)
@@ -7,8 +7,8 @@ import (
 )
 
 type pieceCompletion interface {
-       Get(metainfo.Piece) bool
-       Set(metainfo.Piece, bool)
+       Get(metainfo.Piece) (bool, error)
+       Set(metainfo.Piece, bool) error
        Close()
 }
 
index 8b904fb9dc9535dc1193a0a273264589d68b7bd4..b8a2d5b4a5c8518ba55cff027b2cb4001df4bea8 100644 (file)
@@ -10,12 +10,12 @@ type mapPieceCompletion struct {
 
 func (mapPieceCompletion) Close() {}
 
-func (me *mapPieceCompletion) Get(p metainfo.Piece) bool {
+func (me *mapPieceCompletion) Get(p metainfo.Piece) (bool, error) {
        _, ok := me.m[p.Key()]
-       return ok
+       return ok, nil
 }
 
-func (me *mapPieceCompletion) Set(p metainfo.Piece, b bool) {
+func (me *mapPieceCompletion) Set(p metainfo.Piece, b bool) error {
        if b {
                if me.m == nil {
                        me.m = make(map[metainfo.PieceKey]struct{})
@@ -24,4 +24,5 @@ func (me *mapPieceCompletion) Set(p metainfo.Piece, b bool) {
        } else {
                delete(me.m, p.Key())
        }
+       return nil
 }
index f7e126d0ccfa4e845ff3ae24ad808f9f64737810..db95a11d29ae26fa642fd8f59cbd4512df4f7b8f 100644 (file)
@@ -26,25 +26,19 @@ func newDBPieceCompletion(dir string) (ret *dbPieceCompletion, err error) {
        return
 }
 
-func (me *dbPieceCompletion) Get(p metainfo.Piece) (ret bool) {
+func (me *dbPieceCompletion) Get(p metainfo.Piece) (ret bool, err error) {
        row := me.db.QueryRow(`select exists(select * from completed where infohash=? and "index"=?)`, p.Info.Hash().HexString(), p.Index())
-       err := row.Scan(&ret)
-       if err != nil {
-               panic(err)
-       }
+       err = row.Scan(&ret)
        return
 }
 
-func (me *dbPieceCompletion) Set(p metainfo.Piece, b bool) {
-       var err error
+func (me *dbPieceCompletion) Set(p metainfo.Piece, b bool) (err error) {
        if b {
                _, err = me.db.Exec(`insert into completed (infohash, "index") values (?, ?)`, p.Info.Hash().HexString(), p.Index())
        } else {
                _, err = me.db.Exec(`delete from completed where infohash=? and "index"=?`, p.Info.Hash().HexString(), p.Index())
        }
-       if err != nil {
-               panic(err)
-       }
+       return
 }
 
 func (me *dbPieceCompletion) Close() {
index fec993a309a3fdcfd2437d60737d9bb5e62ef06b..44648c136e89a387f5c30156930449058fc556f1 100644 (file)
@@ -14,10 +14,10 @@ type fileStoragePiece struct {
        r io.ReaderAt
 }
 
-func (fs *fileStoragePiece) GetIsComplete() (ret bool) {
-       ret = fs.completion.Get(fs.p)
-       if !ret {
-               return
+func (fs *fileStoragePiece) GetIsComplete() bool {
+       ret, err := fs.completion.Get(fs.p)
+       if err != nil || !ret {
+               return false
        }
        // If it's allegedly complete, check that its constituent files have the
        // necessary length.
@@ -29,11 +29,11 @@ func (fs *fileStoragePiece) GetIsComplete() (ret bool) {
                }
        }
        if ret {
-               return
+               return true
        }
        // The completion was wrong, fix it.
        fs.completion.Set(fs.p, false)
-       return
+       return false
 }
 
 func (fs *fileStoragePiece) MarkComplete() error {
index 836b6f0f104f7daf73238f62f9fe30cd4c30c529..6a81f26e37d03d9f070744d04a833776f692454c 100644 (file)
@@ -58,8 +58,9 @@ type mmapStoragePiece struct {
        io.WriterAt
 }
 
-func (sp mmapStoragePiece) GetIsComplete() bool {
-       return sp.pc.Get(sp.p)
+func (sp mmapStoragePiece) GetIsComplete() (ret bool) {
+       ret, _ = sp.pc.Get(sp.p)
+       return
 }
 
 func (sp mmapStoragePiece) MarkComplete() error {