Skip to content
Snippets Groups Projects
Unverified Commit f7533a9e authored by Hans Moog's avatar Hans Moog Committed by GitHub
Browse files

Merge branch 'master' into feat/iota.go

parents b5ec7827 d3274a21
No related branches found
No related tags found
No related merge requests found
Showing
with 199 additions and 113 deletions
...@@ -68,7 +68,7 @@ func scheduleUpdateForSalt(saltToUpdate *salt.Salt, settingsKey []byte, lifeSpan ...@@ -68,7 +68,7 @@ func scheduleUpdateForSalt(saltToUpdate *salt.Salt, settingsKey []byte, lifeSpan
if saltToUpdate.ExpirationTime.Before(now) { if saltToUpdate.ExpirationTime.Before(now) {
updatePublicSalt(saltToUpdate, settingsKey, lifeSpan, callback) updatePublicSalt(saltToUpdate, settingsKey, lifeSpan, callback)
} else { } else {
daemon.BackgroundWorker(func() { daemon.BackgroundWorker("Salt Updater", func() {
select { select {
case <-time.After(saltToUpdate.ExpirationTime.Sub(now)): case <-time.After(saltToUpdate.ExpirationTime.Sub(now)):
updatePublicSalt(saltToUpdate, settingsKey, lifeSpan, callback) updatePublicSalt(saltToUpdate, settingsKey, lifeSpan, callback)
......
...@@ -37,7 +37,7 @@ func ConfigureServer(plugin *node.Plugin) { ...@@ -37,7 +37,7 @@ func ConfigureServer(plugin *node.Plugin) {
} }
func RunServer(plugin *node.Plugin) { func RunServer(plugin *node.Plugin) {
daemon.BackgroundWorker(func() { daemon.BackgroundWorker("Autopeering TCP Server", func() {
if *parameters.ADDRESS.Value == "0.0.0.0" { if *parameters.ADDRESS.Value == "0.0.0.0" {
plugin.LogInfo("Starting TCP Server (port " + strconv.Itoa(*parameters.PORT.Value) + ") ...") plugin.LogInfo("Starting TCP Server (port " + strconv.Itoa(*parameters.PORT.Value) + ") ...")
} else { } else {
......
...@@ -41,7 +41,7 @@ func ConfigureServer(plugin *node.Plugin) { ...@@ -41,7 +41,7 @@ func ConfigureServer(plugin *node.Plugin) {
} }
func RunServer(plugin *node.Plugin) { func RunServer(plugin *node.Plugin) {
daemon.BackgroundWorker(func() { daemon.BackgroundWorker("Autopeering UDP Server", func() {
if *parameters.ADDRESS.Value == "0.0.0.0" { if *parameters.ADDRESS.Value == "0.0.0.0" {
plugin.LogInfo("Starting UDP Server (port " + strconv.Itoa(*parameters.PORT.Value) + ") ...") plugin.LogInfo("Starting UDP Server (port " + strconv.Itoa(*parameters.PORT.Value) + ") ...")
} else { } else {
......
package bundleprocessor
import (
"github.com/iotaledger/goshimmer/packages/errors"
"github.com/iotaledger/goshimmer/packages/model/bundle"
"github.com/iotaledger/goshimmer/packages/model/transactionmetadata"
"github.com/iotaledger/goshimmer/packages/model/value_transaction"
"github.com/iotaledger/goshimmer/packages/ternary"
"github.com/iotaledger/goshimmer/plugins/tangle"
)
func ProcessSolidBundleHead(headTransaction *value_transaction.ValueTransaction) (*bundle.Bundle, errors.IdentifiableError) {
// only process the bundle if we didn't process it, yet
return tangle.GetBundle(headTransaction.GetHash(), func(headTransactionHash ternary.Trytes) (*bundle.Bundle, errors.IdentifiableError) {
// abort if bundle syntax is wrong
if !headTransaction.IsHead() {
return nil, ErrProcessBundleFailed.Derive(errors.New("invalid parameter"), "transaction needs to be head of bundle")
}
// initialize event variables
newBundle := bundle.New(headTransactionHash)
bundleTransactions := make([]*value_transaction.ValueTransaction, 0)
// iterate through trunk transactions until we reach the tail
currentTransaction := headTransaction
for {
// abort if we reached a previous head
if currentTransaction.IsHead() && currentTransaction != headTransaction {
newBundle.SetTransactionHashes(mapTransactionsToTransactionHashes(bundleTransactions))
Events.InvalidBundle.Trigger(newBundle, bundleTransactions)
return nil, ErrProcessBundleFailed.Derive(errors.New("invalid bundle found"), "missing bundle tail")
}
// update bundle transactions
bundleTransactions = append(bundleTransactions, currentTransaction)
// retrieve & update metadata
currentTransactionMetadata, dbErr := tangle.GetTransactionMetadata(currentTransaction.GetHash(), transactionmetadata.New)
if dbErr != nil {
return nil, ErrProcessBundleFailed.Derive(dbErr, "failed to retrieve transaction metadata")
}
currentTransactionMetadata.SetBundleHeadHash(headTransactionHash)
// update value bundle flag
if !newBundle.IsValueBundle() && currentTransaction.GetValue() != 0 {
newBundle.SetValueBundle(true)
}
// if we are done -> trigger events
if currentTransaction.IsTail() {
newBundle.SetTransactionHashes(mapTransactionsToTransactionHashes(bundleTransactions))
Events.BundleSolid.Trigger(newBundle, bundleTransactions)
return newBundle, nil
}
// try to iterate to next turn
if nextTransaction, err := tangle.GetTransaction(currentTransaction.GetTrunkTransactionHash()); err != nil {
return nil, ErrProcessBundleFailed.Derive(err, "failed to retrieve trunk while processing bundle")
} else {
currentTransaction = nextTransaction
}
}
})
}
func mapTransactionsToTransactionHashes(transactions []*value_transaction.ValueTransaction) (result []ternary.Trytes) {
result = make([]ternary.Trytes, len(transactions))
for k, v := range transactions {
result[k] = v.GetHash()
}
return
}
package bundleprocessor
import (
"fmt"
"testing"
"github.com/iotaledger/goshimmer/packages/events"
"github.com/iotaledger/goshimmer/packages/model/bundle"
"github.com/iotaledger/goshimmer/packages/model/value_transaction"
"github.com/iotaledger/goshimmer/packages/ternary"
"github.com/iotaledger/goshimmer/plugins/tangle"
"github.com/magiconair/properties/assert"
)
func TestProcessSolidBundleHead(t *testing.T) {
tangle.PLUGIN.InitTest()
tx := value_transaction.New()
tx.SetTail(true)
tx.SetValue(3)
tx1 := value_transaction.New()
tx1.SetTrunkTransactionHash(tx.GetHash())
tx1.SetHead(true)
tangle.StoreTransaction(tx)
tangle.StoreTransaction(tx1)
Events.BundleSolid.Attach(events.NewClosure(func(bundle *bundle.Bundle, transactions []*value_transaction.ValueTransaction) {
fmt.Println("IT HAPPENED")
fmt.Println(bundle.GetHash())
}))
result, err := ProcessSolidBundleHead(tx1)
if err != nil {
t.Error(err)
} else {
assert.Equal(t, result.GetHash(), ternary.Trytes("UFWJYEWKMEQDNSQUCUWBGOFRHVBGHVVYEZCLCGRDTRQSMAFALTIPMJEEYFDPMQCNJWLXUWFMBZGHQRO99"), "invalid bundle hash")
assert.Equal(t, result.IsValueBundle(), true, "invalid value bundle status")
}
}
...@@ -7,15 +7,13 @@ import ( ...@@ -7,15 +7,13 @@ import (
) )
var Events = pluginEvents{ var Events = pluginEvents{
DataBundleReceived: events.NewEvent(bundleEventCaller), BundleSolid: events.NewEvent(bundleEventCaller),
ValueBundleReceived: events.NewEvent(bundleEventCaller), InvalidBundle: events.NewEvent(bundleEventCaller),
InvalidBundleReceived: events.NewEvent(bundleEventCaller),
} }
type pluginEvents struct { type pluginEvents struct {
DataBundleReceived *events.Event BundleSolid *events.Event
ValueBundleReceived *events.Event InvalidBundle *events.Event
InvalidBundleReceived *events.Event
} }
func bundleEventCaller(handler interface{}, params ...interface{}) { func bundleEventCaller(handler interface{}, params ...interface{}) {
......
package bundleprocessor package bundleprocessor
import ( import (
"github.com/iotaledger/goshimmer/packages/errors" "github.com/iotaledger/goshimmer/packages/daemon"
"github.com/iotaledger/goshimmer/packages/events" "github.com/iotaledger/goshimmer/packages/events"
"github.com/iotaledger/goshimmer/packages/model/bundle"
"github.com/iotaledger/goshimmer/packages/model/transactionmetadata"
"github.com/iotaledger/goshimmer/packages/model/value_transaction" "github.com/iotaledger/goshimmer/packages/model/value_transaction"
"github.com/iotaledger/goshimmer/packages/node" "github.com/iotaledger/goshimmer/packages/node"
"github.com/iotaledger/goshimmer/packages/workerpool"
"github.com/iotaledger/goshimmer/plugins/tangle" "github.com/iotaledger/goshimmer/plugins/tangle"
"github.com/iotaledger/iota.go/trinary" "github.com/iotaledger/iota.go/trinary"
) )
var PLUGIN = node.NewPlugin("Bundle Processor", configure) var PLUGIN = node.NewPlugin("Bundle Processor", configure, run)
func configure(plugin *node.Plugin) { func configure(plugin *node.Plugin) {
workerPool = workerpool.New(func(task workerpool.Task) {
if _, err := ProcessSolidBundleHead(task.Param(0).(*value_transaction.ValueTransaction)); err != nil {
plugin.LogFailure(err.Error())
}
}, workerpool.WorkerCount(WORKER_COUNT), workerpool.QueueSize(2*WORKER_COUNT))
tangle.Events.TransactionSolid.Attach(events.NewClosure(func(tx *value_transaction.ValueTransaction) { tangle.Events.TransactionSolid.Attach(events.NewClosure(func(tx *value_transaction.ValueTransaction) {
if tx.IsHead() { if tx.IsHead() {
if _, err := ProcessSolidBundleHead(tx); err != nil { workerPool.Submit(tx)
plugin.LogFailure(err.Error())
}
} }
})) }))
}
func ProcessSolidBundleHead(headTransaction *value_transaction.ValueTransaction) (*bundle.Bundle, errors.IdentifiableError) {
// only process the bundle if we didn't process it, yet
return tangle.GetBundle(headTransaction.GetHash(), func(headTransactionHash trinary.Trytes) (*bundle.Bundle, errors.IdentifiableError) {
// abort if bundle syntax is wrong
if !headTransaction.IsHead() {
return nil, ErrProcessBundleFailed.Derive(errors.New("invalid parameter"), "transaction needs to be head of bundle")
}
// initialize event variables
newBundle := bundle.New(headTransactionHash)
bundleTransactions := make([]*value_transaction.ValueTransaction, 0)
// iterate through trunk transactions until we reach the tail
currentTransaction := headTransaction
for {
// abort if we reached a previous head
if currentTransaction.IsHead() && currentTransaction != headTransaction {
newBundle.SetTransactionHashes(mapTransactionsToTransactionHashes(bundleTransactions))
Events.InvalidBundleReceived.Trigger(newBundle, bundleTransactions) daemon.Events.Shutdown.Attach(events.NewClosure(func() {
plugin.LogInfo("Stopping Bundle Processor ...")
return nil, ErrProcessBundleFailed.Derive(errors.New("invalid bundle found"), "missing bundle tail") workerPool.Stop()
} }))
}
// update bundle transactions
bundleTransactions = append(bundleTransactions, currentTransaction)
// retrieve & update metadata
currentTransactionMetadata, dbErr := tangle.GetTransactionMetadata(currentTransaction.GetHash(), transactionmetadata.New)
if dbErr != nil {
return nil, ErrProcessBundleFailed.Derive(dbErr, "failed to retrieve transaction metadata")
}
currentTransactionMetadata.SetBundleHeadHash(headTransactionHash)
// update value bundle flag
if !newBundle.IsValueBundle() && currentTransaction.GetValue() != 0 {
newBundle.SetValueBundle(true)
}
// if we are done -> trigger events func run(plugin *node.Plugin) {
if currentTransaction.IsTail() { plugin.LogInfo("Starting Bundle Processor ...")
newBundle.SetTransactionHashes(mapTransactionsToTransactionHashes(bundleTransactions))
if newBundle.IsValueBundle() { daemon.BackgroundWorker("Bundle Processor", func() {
Events.ValueBundleReceived.Trigger(newBundle, bundleTransactions) plugin.LogSuccess("Starting Bundle Processor ... done")
} else {
Events.DataBundleReceived.Trigger(newBundle, bundleTransactions)
}
return newBundle, nil workerPool.Run()
}
// try to iterate to next turn plugin.LogSuccess("Stopping Bundle Processor ... done")
if nextTransaction, err := tangle.GetTransaction(currentTransaction.GetTrunkTransactionHash()); err != nil {
return nil, ErrProcessBundleFailed.Derive(err, "failed to retrieve trunk while processing bundle")
} else {
currentTransaction = nextTransaction
}
}
}) })
} }
func mapTransactionsToTransactionHashes(transactions []*value_transaction.ValueTransaction) (result []trinary.Trytes) { var workerPool *workerpool.WorkerPool
result = make([]trinary.Trytes, len(transactions))
for k, v := range transactions {
result[k] = v.GetHash()
}
return const WORKER_COUNT = 10000
}
...@@ -47,7 +47,7 @@ func runNeighbors(plugin *node.Plugin) { ...@@ -47,7 +47,7 @@ func runNeighbors(plugin *node.Plugin) {
} }
func manageConnection(plugin *node.Plugin, neighbor *Neighbor) { func manageConnection(plugin *node.Plugin, neighbor *Neighbor) {
daemon.BackgroundWorker(func() { daemon.BackgroundWorker("Connection Manager ("+neighbor.Identity.StringIdentifier+")", func() {
failedConnectionAttempts := 0 failedConnectionAttempts := 0
for _, exists := GetNeighbor(neighbor.Identity.StringIdentifier); exists && failedConnectionAttempts < CONNECTION_MAX_ATTEMPTS; { for _, exists := GetNeighbor(neighbor.Identity.StringIdentifier); exists && failedConnectionAttempts < CONNECTION_MAX_ATTEMPTS; {
......
...@@ -26,7 +26,7 @@ func configureSendQueue(plugin *node.Plugin) { ...@@ -26,7 +26,7 @@ func configureSendQueue(plugin *node.Plugin) {
func runSendQueue(plugin *node.Plugin) { func runSendQueue(plugin *node.Plugin) {
plugin.LogInfo("Starting Send Queue Dispatcher ...") plugin.LogInfo("Starting Send Queue Dispatcher ...")
daemon.BackgroundWorker(func() { daemon.BackgroundWorker("Gossip Send Queue Dispatcher", func() {
plugin.LogSuccess("Starting Send Queue Dispatcher ... done") plugin.LogSuccess("Starting Send Queue Dispatcher ... done")
for { for {
...@@ -54,7 +54,7 @@ func runSendQueue(plugin *node.Plugin) { ...@@ -54,7 +54,7 @@ func runSendQueue(plugin *node.Plugin) {
connectedNeighborsMutex.Lock() connectedNeighborsMutex.Lock()
for _, neighborQueue := range neighborQueues { for _, neighborQueue := range neighborQueues {
startNeighborSendQueue(neighborQueue) startNeighborSendQueue(neighborQueue.protocol.Neighbor, neighborQueue)
} }
connectedNeighborsMutex.Unlock() connectedNeighborsMutex.Unlock()
} }
...@@ -104,13 +104,13 @@ func setupEventHandlers(neighbor *Neighbor) { ...@@ -104,13 +104,13 @@ func setupEventHandlers(neighbor *Neighbor) {
})) }))
if daemon.IsRunning() { if daemon.IsRunning() {
startNeighborSendQueue(queue) startNeighborSendQueue(neighbor, queue)
} }
})) }))
} }
func startNeighborSendQueue(neighborQueue *neighborQueue) { func startNeighborSendQueue(neighbor *Neighbor, neighborQueue *neighborQueue) {
daemon.BackgroundWorker(func() { daemon.BackgroundWorker("Gossip Send Queue ("+neighbor.Identity.StringIdentifier+")", func() {
for { for {
select { select {
case <-daemon.ShutdownSignal: case <-daemon.ShutdownSignal:
......
...@@ -73,7 +73,7 @@ func configureServer(plugin *node.Plugin) { ...@@ -73,7 +73,7 @@ func configureServer(plugin *node.Plugin) {
func runServer(plugin *node.Plugin) { func runServer(plugin *node.Plugin) {
plugin.LogInfo("Starting TCP Server (port " + strconv.Itoa(*PORT.Value) + ") ...") plugin.LogInfo("Starting TCP Server (port " + strconv.Itoa(*PORT.Value) + ") ...")
daemon.BackgroundWorker(func() { daemon.BackgroundWorker("Gossip TCP Server", func() {
plugin.LogSuccess("Starting TCP Server (port " + strconv.Itoa(*PORT.Value) + ") ... done") plugin.LogSuccess("Starting TCP Server (port " + strconv.Itoa(*PORT.Value) + ") ... done")
TCPServer.Listen(*PORT.Value) TCPServer.Listen(*PORT.Value)
......
...@@ -4,6 +4,7 @@ import ( ...@@ -4,6 +4,7 @@ import (
"os" "os"
"os/signal" "os/signal"
"strconv" "strconv"
"strings"
"syscall" "syscall"
"time" "time"
...@@ -31,7 +32,13 @@ var PLUGIN = node.NewPlugin("Graceful Shutdown", func(plugin *node.Plugin) { ...@@ -31,7 +32,13 @@ var PLUGIN = node.NewPlugin("Graceful Shutdown", func(plugin *node.Plugin) {
secondsSinceStart := x.Sub(start).Seconds() secondsSinceStart := x.Sub(start).Seconds()
if secondsSinceStart <= WAIT_TO_KILL_TIME_IN_SECONDS { if secondsSinceStart <= WAIT_TO_KILL_TIME_IN_SECONDS {
plugin.LogWarning("Received shutdown request - waiting (max " + strconv.Itoa(WAIT_TO_KILL_TIME_IN_SECONDS-int(secondsSinceStart)) + " seconds) to finish processing ...") processList := ""
runningBackgroundWorkers := daemon.GetRunningBackgroundWorkers()
if len(runningBackgroundWorkers) >= 1 {
processList = "(" + strings.Join(runningBackgroundWorkers, ", ") + ") "
}
plugin.LogWarning("Received shutdown request - waiting (max " + strconv.Itoa(WAIT_TO_KILL_TIME_IN_SECONDS-int(secondsSinceStart)) + " seconds) to finish processing " + processList + "...")
} else { } else {
plugin.LogFailure("Background processes did not terminate in time! Forcing shutdown ...") plugin.LogFailure("Background processes did not terminate in time! Forcing shutdown ...")
......
...@@ -36,7 +36,7 @@ var PLUGIN = node.NewPlugin("Statusscreen TPS", func(plugin *node.Plugin) { ...@@ -36,7 +36,7 @@ var PLUGIN = node.NewPlugin("Statusscreen TPS", func(plugin *node.Plugin) {
return "TPS", strconv.FormatUint(atomic.LoadUint64(&receivedTps), 10) + " received / " + strconv.FormatUint(atomic.LoadUint64(&solidTps), 10) + " new" return "TPS", strconv.FormatUint(atomic.LoadUint64(&receivedTps), 10) + " received / " + strconv.FormatUint(atomic.LoadUint64(&solidTps), 10) + " new"
}) })
}, func(plugin *node.Plugin) { }, func(plugin *node.Plugin) {
daemon.BackgroundWorker(func() { daemon.BackgroundWorker("Statusscreen TPS Tracker", func() {
ticker := time.NewTicker(time.Second) ticker := time.NewTicker(time.Second)
for { for {
......
...@@ -100,7 +100,7 @@ func run(plugin *node.Plugin) { ...@@ -100,7 +100,7 @@ func run(plugin *node.Plugin) {
return false return false
}) })
daemon.BackgroundWorker(func() { daemon.BackgroundWorker("Statusscreen Refresher", func() {
for { for {
select { select {
case <-daemon.ShutdownSignal: case <-daemon.ShutdownSignal:
...@@ -111,7 +111,7 @@ func run(plugin *node.Plugin) { ...@@ -111,7 +111,7 @@ func run(plugin *node.Plugin) {
} }
}) })
daemon.BackgroundWorker(func() { daemon.BackgroundWorker("Statusscreen App", func() {
if err := app.SetRoot(frame, true).SetFocus(frame).Run(); err != nil { if err := app.SetRoot(frame, true).SetFocus(frame).Run(); err != nil {
panic(err) panic(err)
} }
......
...@@ -12,11 +12,12 @@ func configure(plugin *node.Plugin) { ...@@ -12,11 +12,12 @@ func configure(plugin *node.Plugin) {
configureTransactionDatabase(plugin) configureTransactionDatabase(plugin)
configureTransactionMetaDataDatabase(plugin) configureTransactionMetaDataDatabase(plugin)
configureApproversDatabase(plugin) configureApproversDatabase(plugin)
configureBundleDatabase(plugin)
configureSolidifier(plugin) configureSolidifier(plugin)
} }
func run(plugin *node.Plugin) { func run(plugin *node.Plugin) {
// this plugin has no background workers runSolidifier(plugin)
} }
// endregion /////////////////////////////////////////////////////////////////////////////////////////////////////////// // endregion ///////////////////////////////////////////////////////////////////////////////////////////////////////////
...@@ -9,37 +9,44 @@ import ( ...@@ -9,37 +9,44 @@ import (
"github.com/iotaledger/goshimmer/packages/model/transactionmetadata" "github.com/iotaledger/goshimmer/packages/model/transactionmetadata"
"github.com/iotaledger/goshimmer/packages/model/value_transaction" "github.com/iotaledger/goshimmer/packages/model/value_transaction"
"github.com/iotaledger/goshimmer/packages/node" "github.com/iotaledger/goshimmer/packages/node"
"github.com/iotaledger/goshimmer/packages/ternary"
"github.com/iotaledger/goshimmer/packages/workerpool"
"github.com/iotaledger/goshimmer/plugins/gossip" "github.com/iotaledger/goshimmer/plugins/gossip"
"github.com/iotaledger/iota.go/trinary" "github.com/iotaledger/iota.go/trinary"
) )
// region plugin module setup ////////////////////////////////////////////////////////////////////////////////////////// // region plugin module setup //////////////////////////////////////////////////////////////////////////////////////////
//var solidifierChan = make(chan *value_transaction.ValueTransaction, 1000) var workerPool *workerpool.WorkerPool
const NUMBER_OF_WORKERS = 3000
var tasksChan = make(chan *meta_transaction.MetaTransaction, NUMBER_OF_WORKERS)
func configureSolidifier(plugin *node.Plugin) { func configureSolidifier(plugin *node.Plugin) {
for i := 0; i < NUMBER_OF_WORKERS; i++ { workerPool = workerpool.New(func(task workerpool.Task) {
go func() { processMetaTransaction(plugin, task.Param(0).(*meta_transaction.MetaTransaction))
for { }, workerpool.WorkerCount(WORKER_COUNT), workerpool.QueueSize(2*WORKER_COUNT))
select {
case <-daemon.ShutdownSignal:
return
case rawTransaction := <-tasksChan:
processMetaTransaction(plugin, rawTransaction)
}
}
}()
}
gossip.Events.ReceiveTransaction.Attach(events.NewClosure(func(rawTransaction *meta_transaction.MetaTransaction) { gossip.Events.ReceiveTransaction.Attach(events.NewClosure(func(rawTransaction *meta_transaction.MetaTransaction) {
tasksChan <- rawTransaction workerPool.Submit(rawTransaction)
}))
daemon.Events.Shutdown.Attach(events.NewClosure(func() {
plugin.LogInfo("Stopping Solidifier ...")
workerPool.Stop()
})) }))
} }
func runSolidifier(plugin *node.Plugin) {
plugin.LogInfo("Starting Solidifier ...")
daemon.BackgroundWorker("Tangle Solidifier", func() {
plugin.LogSuccess("Starting Solidifier ... done")
workerPool.Run()
plugin.LogSuccess("Stopping Solidifier ... done")
})
}
// endregion /////////////////////////////////////////////////////////////////////////////////////////////////////////// // endregion ///////////////////////////////////////////////////////////////////////////////////////////////////////////
// Checks and updates the solid flag of a single transaction. // Checks and updates the solid flag of a single transaction.
...@@ -115,10 +122,10 @@ func IsSolid(transaction *value_transaction.ValueTransaction) (bool, errors.Iden ...@@ -115,10 +122,10 @@ func IsSolid(transaction *value_transaction.ValueTransaction) (bool, errors.Iden
} }
func propagateSolidity(transactionHash trinary.Trytes) errors.IdentifiableError { func propagateSolidity(transactionHash trinary.Trytes) errors.IdentifiableError {
if approvers, err := GetApprovers(transactionHash, approvers.New); err != nil { if transactionApprovers, err := GetApprovers(transactionHash, approvers.New); err != nil {
return err return err
} else { } else {
for _, approverHash := range approvers.GetHashes() { for _, approverHash := range transactionApprovers.GetHashes() {
if approver, err := GetTransaction(approverHash); err != nil { if approver, err := GetTransaction(approverHash); err != nil {
return err return err
} else if approver != nil { } else if approver != nil {
...@@ -178,5 +185,6 @@ func processTransaction(plugin *node.Plugin, transaction *value_transaction.Valu ...@@ -178,5 +185,6 @@ func processTransaction(plugin *node.Plugin, transaction *value_transaction.Valu
return return
} }
//solidifierChan <- transaction
} }
const WORKER_COUNT = 400
...@@ -33,7 +33,7 @@ func configure(plugin *node.Plugin) { ...@@ -33,7 +33,7 @@ func configure(plugin *node.Plugin) {
func run(plugin *node.Plugin) { func run(plugin *node.Plugin) {
plugin.LogInfo("Starting Web Server ...") plugin.LogInfo("Starting Web Server ...")
daemon.BackgroundWorker(func() { daemon.BackgroundWorker("WebAPI Server", func() {
plugin.LogSuccess("Starting Web Server ... done") plugin.LogSuccess("Starting Web Server ... done")
if err := Server.Start(":8080"); err != nil { if err := Server.Start(":8080"); err != nil {
......
...@@ -45,7 +45,7 @@ func run(plugin *node.Plugin) { ...@@ -45,7 +45,7 @@ func run(plugin *node.Plugin) {
plugin.LogInfo("Starting ZeroMQ Publisher (port " + strconv.Itoa(*PORT.Value) + ") ...") plugin.LogInfo("Starting ZeroMQ Publisher (port " + strconv.Itoa(*PORT.Value) + ") ...")
daemon.BackgroundWorker(func() { daemon.BackgroundWorker("ZeroMQ Publisher", func() {
if err := startPublisher(plugin); err != nil { if err := startPublisher(plugin); err != nil {
plugin.LogFailure("Stopping ZeroMQ Publisher: " + err.Error()) plugin.LogFailure("Stopping ZeroMQ Publisher: " + err.Error())
} else { } else {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment