Skip to content
Snippets Groups Projects
Commit 19f276af authored by capossele's avatar capossele
Browse files

:bug: fix data races on spammer

parent 963f23ec
No related branches found
No related tags found
No related merge requests found
......@@ -14,79 +14,74 @@ import (
)
var spamming = false
var spammingMutex sync.Mutex
var startMutex sync.Mutex
var shutdownSignal chan int
var shutdownSignal chan struct{}
var done chan struct{}
var sentCounter = uint(0)
func Start(tps uint) {
startMutex.Lock()
if !spamming {
shutdownSignal = make(chan int, 1)
func(shutdownSignal chan int) {
daemon.BackgroundWorker("Transaction Spammer", func() {
for {
start := time.Now()
totalSentCounter := int64(0)
for {
select {
case <-daemon.ShutdownSignal:
return
case <-shutdownSignal:
return
default:
sentCounter++
totalSentCounter++
tx := value_transaction.New()
tx.SetHead(true)
tx.SetTail(true)
tx.SetValue(totalSentCounter)
tx.SetBranchTransactionHash(tipselection.GetRandomTip())
tx.SetTrunkTransactionHash(tipselection.GetRandomTip())
mtx := &pb.Transaction{Body: tx.MetaTransaction.GetBytes()}
b, _ := proto.Marshal(mtx)
gossip.Events.TransactionReceived.Trigger(&gossip.TransactionReceivedEvent{Body: b, Peer: &local.INSTANCE.Peer})
if sentCounter >= tps {
duration := time.Since(start)
if duration < time.Second {
time.Sleep(time.Second - duration)
}
start = time.Now()
func init() {
shutdownSignal = make(chan struct{})
done = make(chan struct{})
}
sentCounter = 0
}
}
func Start(tps uint) {
spammingMutex.Lock()
spamming = true
spammingMutex.Unlock()
daemon.BackgroundWorker("Transaction Spammer", func() {
start := time.Now()
totalSentCounter := int64(0)
for {
select {
case <-daemon.ShutdownSignal:
return
case <-shutdownSignal:
done <- struct{}{}
return
default:
sentCounter++
totalSentCounter++
tx := value_transaction.New()
tx.SetHead(true)
tx.SetTail(true)
tx.SetValue(totalSentCounter)
tx.SetBranchTransactionHash(tipselection.GetRandomTip())
tx.SetTrunkTransactionHash(tipselection.GetRandomTip())
mtx := &pb.Transaction{Body: tx.MetaTransaction.GetBytes()}
b, _ := proto.Marshal(mtx)
gossip.Events.TransactionReceived.Trigger(&gossip.TransactionReceivedEvent{Body: b, Peer: &local.INSTANCE.Peer})
if sentCounter >= tps {
duration := time.Since(start)
if duration < time.Second {
time.Sleep(time.Second - duration)
}
}
})
}(shutdownSignal)
spamming = true
}
start = time.Now()
startMutex.Unlock()
sentCounter = 0
}
}
}
})
}
func Stop() {
startMutex.Lock()
spammingMutex.Lock()
if spamming {
close(shutdownSignal)
shutdownSignal <- struct{}{}
// wait for spammer to be done
<-done
spamming = false
}
startMutex.Unlock()
spammingMutex.Unlock()
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment