added garbage collection test. minor fix

This commit is contained in:
Alfonso de la Rocha 2022-09-13 16:06:18 +02:00
parent 76031d72ad
commit 1dadff303c
No known key found for this signature in database
GPG Key ID: 97DE48FDFC756FBD
2 changed files with 17 additions and 9 deletions

View File

@ -85,6 +85,10 @@ func (bInfo *blksInfo) eqErr() error {
return fmt.Errorf("equivocation error detected. Different block with the same ticket already seen") return fmt.Errorf("equivocation error detected. Different block with the same ticket already seen")
} }
func (cb *ConsistentBCast) Len() int {
return len(cb.m)
}
func (cb *ConsistentBCast) RcvBlock(ctx context.Context, blk *types.BlockMsg) error { func (cb *ConsistentBCast) RcvBlock(ctx context.Context, blk *types.BlockMsg) error {
cb.lk.Lock() cb.lk.Lock()
bcastDict, ok := cb.m[blk.Header.Height] bcastDict, ok := cb.m[blk.Header.Height]
@ -146,6 +150,8 @@ func (cb *ConsistentBCast) GarbageCollect(currEpoch abi.ChainEpoch) {
// without delivery, and the garbage collection wasn't triggered // without delivery, and the garbage collection wasn't triggered
// for a few epochs. // for a few epochs.
for i := 0; i < GC_SANITY_CHECK; i++ { for i := 0; i < GC_SANITY_CHECK; i++ {
delete(cb.m, currEpoch-abi.ChainEpoch(2-i)) if currEpoch > GC_LOOKBACK {
delete(cb.m, currEpoch-abi.ChainEpoch(GC_LOOKBACK+i))
}
} }
} }

View File

@ -38,6 +38,7 @@ func testSimpleDelivery(t *testing.T, cb *bcast.ConsistentBCast, epoch abi.Chain
wg.Add(numBlocks) wg.Add(numBlocks)
for i := 0; i < numBlocks; i++ { for i := 0; i < numBlocks; i++ {
go func(i int) { go func(i int) {
defer wg.Done()
// Add a random delay in block reception // Add a random delay in block reception
r := mrand.Intn(200) r := mrand.Intn(200)
time.Sleep(time.Duration(r) * time.Millisecond) time.Sleep(time.Duration(r) * time.Millisecond)
@ -47,7 +48,6 @@ func testSimpleDelivery(t *testing.T, cb *bcast.ConsistentBCast, epoch abi.Chain
if err != nil { if err != nil {
errs = append(errs, err) errs = append(errs, err)
} }
wg.Done()
}(i) }(i)
} }
wg.Wait() wg.Wait()
@ -64,6 +64,7 @@ func TestSeveralEpochs(t *testing.T) {
wg.Add(numEpochs) wg.Add(numEpochs)
for i := 0; i < numEpochs; i++ { for i := 0; i < numEpochs; i++ {
go func(i int) { go func(i int) {
defer wg.Done()
// Add a random delay between epochs // Add a random delay between epochs
r := mrand.Intn(500) r := mrand.Intn(500)
time.Sleep(time.Duration(i*TEST_DELAY)*time.Second + time.Duration(r)*time.Millisecond) time.Sleep(time.Duration(i*TEST_DELAY)*time.Second + time.Duration(r)*time.Millisecond)
@ -76,10 +77,11 @@ func TestSeveralEpochs(t *testing.T) {
} else { } else {
testEquivocation(t, cb, abi.ChainEpoch(i), rNumBlocks) testEquivocation(t, cb, abi.ChainEpoch(i), rNumBlocks)
} }
wg.Done() cb.GarbageCollect(abi.ChainEpoch(i))
}(i) }(i)
} }
wg.Wait() wg.Wait()
require.Equal(t, cb.Len(), bcast.GC_LOOKBACK)
} }
// bias is expected to be 0-1 // bias is expected to be 0-1
@ -101,28 +103,28 @@ func testEquivocation(t *testing.T, cb *bcast.ConsistentBCast, epoch abi.ChainEp
proof := randomProof(t) proof := randomProof(t)
// Valid blocks // Valid blocks
go func(i int, proof []byte) { go func(i int, proof []byte) {
defer wg.Done()
r := mrand.Intn(200) r := mrand.Intn(200)
time.Sleep(time.Duration(r) * time.Millisecond) time.Sleep(time.Duration(r) * time.Millisecond)
blk := newBlock(t, 100, proof, []byte("valid"+strconv.Itoa(i))) blk := newBlock(t, epoch, proof, []byte("valid"+strconv.Itoa(i)))
cb.RcvBlock(ctx, blk) cb.RcvBlock(ctx, blk)
err := cb.WaitForDelivery(blk.Header) err := cb.WaitForDelivery(blk.Header)
if err != nil { if err != nil {
errs = append(errs, err) errs = append(errs, err)
} }
wg.Done()
}(i, proof) }(i, proof)
// Equivocation for the last block // Equivocation for the last block
if i == numBlocks-1 { if i == numBlocks-1 {
// Attempting equivocation // Attempting equivocation
go func(i int, proof []byte) { go func(i int, proof []byte) {
defer wg.Done()
// Use the same proof and the same epoch // Use the same proof and the same epoch
blk := newBlock(t, 100, proof, []byte("invalid"+strconv.Itoa(i))) blk := newBlock(t, epoch, proof, []byte("invalid"+strconv.Itoa(i)))
cb.RcvBlock(ctx, blk) cb.RcvBlock(ctx, blk)
err := cb.WaitForDelivery(blk.Header) err := cb.WaitForDelivery(blk.Header)
// Equivocation detected // Equivocation detected
require.Error(t, err) require.Error(t, err)
wg.Done()
}(i, proof) }(i, proof)
} }
} }
@ -150,6 +152,7 @@ func TestFailedEquivocation(t *testing.T) {
proof := randomProof(t) proof := randomProof(t)
// Valid blocks // Valid blocks
go func(i int, proof []byte) { go func(i int, proof []byte) {
defer wg.Done()
r := mrand.Intn(200) r := mrand.Intn(200)
time.Sleep(time.Duration(r) * time.Millisecond) time.Sleep(time.Duration(r) * time.Millisecond)
blk := newBlock(t, 100, proof, []byte("valid"+strconv.Itoa(i))) blk := newBlock(t, 100, proof, []byte("valid"+strconv.Itoa(i)))
@ -158,13 +161,13 @@ func TestFailedEquivocation(t *testing.T) {
if err != nil { if err != nil {
errs = append(errs, err) errs = append(errs, err)
} }
wg.Done()
}(i, proof) }(i, proof)
// Equivocation for the last block // Equivocation for the last block
if i == numBlocks-1 { if i == numBlocks-1 {
// Attempting equivocation // Attempting equivocation
go func(i int, proof []byte) { go func(i int, proof []byte) {
defer wg.Done()
// The equivocated block arrives late // The equivocated block arrives late
time.Sleep(2 * TEST_DELAY * time.Second) time.Sleep(2 * TEST_DELAY * time.Second)
// Use the same proof and the same epoch // Use the same proof and the same epoch
@ -173,7 +176,6 @@ func TestFailedEquivocation(t *testing.T) {
err := cb.WaitForDelivery(blk.Header) err := cb.WaitForDelivery(blk.Header)
// Equivocation detected // Equivocation detected
require.Error(t, err) require.Error(t, err)
wg.Done()
}(i, proof) }(i, proof)
} }
} }