Skip to content
Snippets Groups Projects
Commit 9eb72cb0 authored by Hans Moog's avatar Hans Moog
Browse files

Refactor: removed duplicate code

parent 27642325
No related branches found
No related tags found
No related merge requests found
......@@ -3,6 +3,7 @@ module github.com/iotaledger/goshimmer
go 1.13
require (
cloud.google.com/go v0.36.0 // indirect
github.com/dgraph-io/badger/v2 v2.0.1
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/dgryski/go-farm v0.0.0-20191112170834-c2139c5d712b // indirect
......@@ -41,6 +42,7 @@ require (
golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 // indirect
golang.org/x/text v0.3.2 // indirect
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7 // indirect
google.golang.org/appengine v1.4.0 // indirect
gopkg.in/ini.v1 v1.51.1 // indirect
gopkg.in/yaml.v2 v2.2.7 // indirect
)
package transactionrequester
import (
"time"
)
const (
DEFAULT_REQUEST_WORKER_COUNT = 1024
DEFAULT_RETRY_INTERVAL = 10 * time.Second
)
package transactionrequester
import (
"github.com/iotaledger/hive.go/events"
)
type Events struct {
SendRequest *events.Event
}
package transactionrequester
import (
"time"
)
type Options struct {
retryInterval time.Duration
workerCount int
}
func newOptions(optionalOptions []Option) *Options {
result := &Options{
retryInterval: 10 * time.Second,
workerCount: DEFAULT_REQUEST_WORKER_COUNT,
}
for _, optionalOption := range optionalOptions {
optionalOption(result)
}
return result
}
type Option func(*Options)
func RetryInterval(interval time.Duration) Option {
return func(args *Options) {
args.retryInterval = interval
}
}
func WorkerCount(workerCount int) Option {
return func(args *Options) {
args.workerCount = workerCount
}
}
package transactionrequester
import (
"sync"
"time"
"github.com/iotaledger/hive.go/async"
"github.com/iotaledger/hive.go/events"
"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
)
type TransactionRequester struct {
scheduledRequests map[transaction.Id]*time.Timer
requestWorker async.NonBlockingWorkerPool
options *Options
Events Events
scheduledRequestsMutex sync.RWMutex
}
func New(optionalOptions ...Option) *TransactionRequester {
requester := &TransactionRequester{
scheduledRequests: make(map[transaction.Id]*time.Timer),
options: newOptions(optionalOptions),
Events: Events{
SendRequest: events.NewEvent(func(handler interface{}, params ...interface{}) {
handler.(func(transaction.Id))(params[0].(transaction.Id))
}),
},
}
requester.requestWorker.Tune(requester.options.workerCount)
return requester
}
func (requester *TransactionRequester) ScheduleRequest(transactionId transaction.Id) {
var retryRequest func(bool)
retryRequest = func(initialRequest bool) {
requester.requestWorker.Submit(func() {
requester.scheduledRequestsMutex.RLock()
if _, requestExists := requester.scheduledRequests[transactionId]; !initialRequest && !requestExists {
requester.scheduledRequestsMutex.RUnlock()
return
}
requester.scheduledRequestsMutex.RUnlock()
requester.Events.SendRequest.Trigger(transactionId)
requester.scheduledRequestsMutex.Lock()
requester.scheduledRequests[transactionId] = time.AfterFunc(requester.options.retryInterval, func() { retryRequest(false) })
requester.scheduledRequestsMutex.Unlock()
})
}
retryRequest(true)
}
func (requester *TransactionRequester) StopRequest(transactionId transaction.Id) {
requester.scheduledRequestsMutex.RLock()
if timer, timerExists := requester.scheduledRequests[transactionId]; timerExists {
requester.scheduledRequestsMutex.RUnlock()
timer.Stop()
requester.scheduledRequestsMutex.Lock()
delete(requester.scheduledRequests, transactionId)
requester.scheduledRequestsMutex.Unlock()
} else {
requester.scheduledRequestsMutex.RUnlock()
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment