diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 195fd09ee..23ca0051e 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -146,6 +146,7 @@ int32_t iguana_peermetrics(struct iguana_info *coin) addr = &coin->peers.active[i]; if ( addr->usock < 0 || addr->dead != 0 || addr->ready == 0 ) continue; + addr->pendblocks = 0; if ( addr->recvblocks > coin->peers.mostreceived ) coin->peers.mostreceived = addr->recvblocks; //printf("[%.0f %.0f] ",addr->recvblocks,addr->recvtotal); diff --git a/iguana/iguana_recv.c b/iguana/iguana_recv.c index 7936212a8..73b0fd581 100755 --- a/iguana/iguana_recv.c +++ b/iguana/iguana_recv.c @@ -834,7 +834,7 @@ int32_t iguana_blockQ(struct iguana_info *coin,struct iguana_bundle *bp,int32_t int32_t iguana_neargap(struct iguana_info *coin,struct iguana_peer *addr) { struct iguana_block *block,*bestblock = 0; struct iguana_bundle *bp,*bestbp = 0; - int32_t height,hdrsi,i,n,bundlei,gap,besti = -1; + int32_t height,hdrsi,i,j,r,n,bundlei,gap,besti = -1; if ( addr->rank > 0 ) { n = coin->peers.numranked * 2; @@ -843,12 +843,14 @@ int32_t iguana_neargap(struct iguana_info *coin,struct iguana_peer *addr) if ( (bp= coin->bundles[i]) == 0 || bp->emitfinish == 0 ) break; height = (i * coin->chain->bundlesize); - for (i=0; ichain->bundlesize; + j = (gap + r + i) % n; + hdrsi = (height + j) / coin->chain->bundlesize; if ( (bp= coin->bundles[hdrsi]) != 0 ) { - bundlei = (height + gap) % coin->chain->bundlesize; + bundlei = (height + j) % coin->chain->bundlesize; if ( (block= bp->blocks[bundlei]) != 0 && block->fpipbits == 0 && block->queued == 0 ) { if ( block->numrequests == bp->minrequests ) @@ -869,7 +871,7 @@ int32_t iguana_neargap(struct iguana_info *coin,struct iguana_peer *addr) } if ( bestblock != 0 ) { - printf("near hwm.%d gap.%d peer.%s bpranked.%d [%d:%d] pending.%d numreqs.%d\n",coin->blocks.hwmchain.height,gap,addr->ipaddr,bestbp->rank,bestbp->hdrsi,besti,addr->pendblocks,bestblock->numrequests); + printf("near hwm.%d gap.%d peer.%s bpranked.%d [%d:%d] pending.%d numreqs.%d\n",coin->blocks.hwmchain.height,j,addr->ipaddr,bestbp->rank,bestbp->hdrsi,besti,addr->pendblocks,bestblock->numrequests); bestblock->numrequests++; iguana_sendblockreqPT(coin,addr,bestbp,besti,bestblock->RO.hash2,1); return(1); @@ -882,7 +884,7 @@ int32_t iguana_pollQsPT(struct iguana_info *coin,struct iguana_peer *addr) { uint8_t serialized[sizeof(struct iguana_msghdr) + sizeof(uint32_t)*32 + sizeof(bits256)]; struct iguana_block *block; struct iguana_blockreq *req=0; char *hashstr=0; bits256 hash2; - int32_t bundlei,priority,i,m,z,pend,limit,height=-1,datalen,flag = 0; + int32_t j,r,bundlei,priority,i,m,z,pend,limit,height=-1,datalen,flag = 0; uint32_t now; struct iguana_bundle *bp; struct iguana_peer *ptr; if ( addr->msgcounts.verack == 0 ) return(0); @@ -942,7 +944,10 @@ int32_t iguana_pollQsPT(struct iguana_info *coin,struct iguana_peer *addr) flag = iguana_neargap(coin,addr); else if ( (bp= addr->bp) != 0 && bp->rank != 0 && addr->pendblocks < limit ) { - for (i=0; in; i++) + r = rand(); + for (j=0; jn; j++) + { + i = (r + j) % bp->n; if ( (block= bp->blocks[i]) != 0 && block->numrequests == bp->minrequests && block->fpipbits == 0 && block->queued == 0 ) { printf("peer.%s BPranked.%d [%d:%d] pending.%d numreqs.%d\n",addr->ipaddr,bp->rank,bp->hdrsi,i,addr->pendblocks,block->numrequests); @@ -951,6 +956,7 @@ int32_t iguana_pollQsPT(struct iguana_info *coin,struct iguana_peer *addr) iguana_sendblockreqPT(coin,addr,bp,i,block->RO.hash2,1); break; } + } } } if ( flag == 0 && req == 0 && addr->pendblocks < limit )