request-strategy/order.go | 2 +- request-strategy/piece-request-order.go | 21 ++++++++++++--------- diff --git a/request-strategy/order.go b/request-strategy/order.go index f414226da0700a906cacee99560784eabc9f9f71..4068ed4dd80aa9e70b193e01bb7b2e2a90036330 100644 --- a/request-strategy/order.go +++ b/request-strategy/order.go @@ -81,7 +81,7 @@ storageLeft = &cap } var allTorrentsUnverifiedBytes int64 pro.tree.Ascend(func(i btree.Item) bool { - _i := i.(pieceRequestOrderItem) + _i := i.(*pieceRequestOrderItem) ih := _i.key.InfoHash var t Torrent = input.Torrent(ih) var piece Piece = t.Piece(_i.key.Index) diff --git a/request-strategy/piece-request-order.go b/request-strategy/piece-request-order.go index e0af7487559c90c44cbfc56041cd798e8a5bd334..0b1d6b4e01f9d5b776a0a75e39483f4ab549ffa1 100644 --- a/request-strategy/piece-request-order.go +++ b/request-strategy/piece-request-order.go @@ -35,8 +35,8 @@ key PieceRequestOrderKey state PieceRequestOrderState } -func (me pieceRequestOrderItem) Less(other btree.Item) bool { - otherConcrete := other.(pieceRequestOrderItem) +func (me *pieceRequestOrderItem) Less(other btree.Item) bool { + otherConcrete := other.(*pieceRequestOrderItem) return pieceOrderLess( pieceOrderInput{ PieceRequestOrderState: me.state, @@ -53,7 +53,7 @@ func (me *PieceRequestOrder) Add(key PieceRequestOrderKey, state PieceRequestOrderState) { if _, ok := me.keys[key]; ok { panic(key) } - if me.tree.ReplaceOrInsert(pieceRequestOrderItem{ + if me.tree.ReplaceOrInsert(&pieceRequestOrderItem{ key: key, state: state, }) != nil { @@ -63,13 +63,15 @@ me.keys[key] = state } func (me *PieceRequestOrder) Update(key PieceRequestOrderKey, state PieceRequestOrderState) { - if me.tree.Delete(me.existingItemForKey(key)) == nil { + item := me.existingItemForKey(key) + if item.state == state { + return + } + if me.tree.Delete(&item) == nil { panic(fmt.Sprintf("%#v", key)) } - if me.tree.ReplaceOrInsert(pieceRequestOrderItem{ - key: key, - state: state, - }) != nil { + item.state = state + if me.tree.ReplaceOrInsert(&item) != nil { panic(key) } me.keys[key] = state @@ -83,7 +85,8 @@ } } func (me *PieceRequestOrder) Delete(key PieceRequestOrderKey) { - if me.tree.Delete(me.existingItemForKey(key)) == nil { + item := me.existingItemForKey(key) + if me.tree.Delete(&item) == nil { panic(key) } delete(me.keys, key)