|
|
|
@ -28,6 +28,55 @@ import ( |
|
|
|
|
"github.com/ethereum/go-ethereum/swarm/shed" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
// TestDB_SubscribePull_first is a regression test for the first=false (from-1) bug
|
|
|
|
|
// The bug was that `first=false` was not behind an if-condition `if count > 0`. This resulted in chunks being missed, when
|
|
|
|
|
// the subscription is established before the chunk is actually uploaded. For example if a subscription is established with since=49,
|
|
|
|
|
// which means that the `SubscribePull` method should return chunk with BinID=49 via the channel, and the chunk for BinID=49 is uploaded,
|
|
|
|
|
// after the subscription, then it would have been skipped, where the correct behaviour is to not skip it and return it via the channel.
|
|
|
|
|
func TestDB_SubscribePull_first(t *testing.T) { |
|
|
|
|
db, cleanupFunc := newTestDB(t, nil) |
|
|
|
|
defer cleanupFunc() |
|
|
|
|
|
|
|
|
|
addrs := make(map[uint8][]chunk.Address) |
|
|
|
|
var addrsMu sync.Mutex |
|
|
|
|
var wantedChunksCount int |
|
|
|
|
|
|
|
|
|
// prepopulate database with some chunks
|
|
|
|
|
// before the subscription
|
|
|
|
|
uploadRandomChunksBin(t, db, addrs, &addrsMu, &wantedChunksCount, 100) |
|
|
|
|
|
|
|
|
|
// any bin should do the trick
|
|
|
|
|
bin := uint8(1) |
|
|
|
|
|
|
|
|
|
chunksInGivenBin := uint64(len(addrs[bin])) |
|
|
|
|
|
|
|
|
|
errc := make(chan error) |
|
|
|
|
|
|
|
|
|
since := chunksInGivenBin + 1 |
|
|
|
|
|
|
|
|
|
go func() { |
|
|
|
|
ch, stop := db.SubscribePull(context.TODO(), bin, since, 0) |
|
|
|
|
defer stop() |
|
|
|
|
|
|
|
|
|
chnk := <-ch |
|
|
|
|
|
|
|
|
|
if chnk.BinID != since { |
|
|
|
|
errc <- fmt.Errorf("expected chunk.BinID to be %v , but got %v", since, chnk.BinID) |
|
|
|
|
} else { |
|
|
|
|
errc <- nil |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond) |
|
|
|
|
|
|
|
|
|
uploadRandomChunksBin(t, db, addrs, &addrsMu, &wantedChunksCount, 100) |
|
|
|
|
|
|
|
|
|
err := <-errc |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TestDB_SubscribePull uploads some chunks before and after
|
|
|
|
|
// pull syncing subscription is created and validates if
|
|
|
|
|
// all addresses are received in the right order
|
|
|
|
|