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

Refactor: changing to different workstation

parent e45126a4
No related branches found
No related tags found
No related merge requests found
package ca package ca
const ( const (
MAX_STATEMENT_TIMEOUT = uint64(5000) MAX_STATEMENT_TIMEOUT = uint64(5000)
MAX_NEIGHBOR_COUNT = 8 MAX_NEIGHBOR_COUNT = 8
MAX_PENDING_HEARTBEATS = 10
MAX_MISSING_HEARTBEATS = 10
) )
...@@ -5,6 +5,7 @@ import ( ...@@ -5,6 +5,7 @@ import (
) )
var ( var (
ErrInternalError = errors.New("internal error")
ErrMalformedHeartbeat = errors.New("malformed heartbeat") ErrMalformedHeartbeat = errors.New("malformed heartbeat")
ErrUnknownNeighbor = errors.New("unknown neighbor") ErrUnknownNeighbor = errors.New("unknown neighbor")
ErrTooManyNeighbors = errors.New("too many neighbors") ErrTooManyNeighbors = errors.New("too many neighbors")
......
...@@ -5,6 +5,8 @@ import ( ...@@ -5,6 +5,8 @@ import (
"sort" "sort"
"strconv" "strconv"
"github.com/iotaledger/goshimmer/packages/typeutils"
"github.com/iotaledger/goshimmer/packages/events" "github.com/iotaledger/goshimmer/packages/events"
"github.com/iotaledger/goshimmer/packages/ca/heartbeat" "github.com/iotaledger/goshimmer/packages/ca/heartbeat"
...@@ -15,7 +17,7 @@ import ( ...@@ -15,7 +17,7 @@ import (
type NeighborManager struct { type NeighborManager struct {
Events NeighborManagerEvents Events NeighborManagerEvents
options *NeighborManagerOptions options *NeighborManagerOptions
lastAppliedHeartbeat *heartbeat.Heartbeat lastReceivedHeartbeat *heartbeat.Heartbeat
missingHeartbeats map[string]bool missingHeartbeats map[string]bool
pendingHeartbeats map[string]*heartbeat.Heartbeat pendingHeartbeats map[string]*heartbeat.Heartbeat
heartbeats map[string]*heartbeat.Heartbeat heartbeats map[string]*heartbeat.Heartbeat
...@@ -41,7 +43,7 @@ func (neighborManager *NeighborManager) Reset() { ...@@ -41,7 +43,7 @@ func (neighborManager *NeighborManager) Reset() {
neighborManager.neighborChains = make(map[string]*StatementChain) neighborManager.neighborChains = make(map[string]*StatementChain)
} }
func (neighborManager *NeighborManager) ApplyHeartbeat(heartbeat *heartbeat.Heartbeat) (err errors.IdentifiableError) { func (neighborManager *NeighborManager) storeHeartbeat(heartbeat *heartbeat.Heartbeat) (err errors.IdentifiableError) {
// region check if heartbeat is "syntactically correct" //////////////////////////////////////////////////////////// // region check if heartbeat is "syntactically correct" ////////////////////////////////////////////////////////////
mainStatement := heartbeat.GetMainStatement() mainStatement := heartbeat.GetMainStatement()
...@@ -61,12 +63,48 @@ func (neighborManager *NeighborManager) ApplyHeartbeat(heartbeat *heartbeat.Hear ...@@ -61,12 +63,48 @@ func (neighborManager *NeighborManager) ApplyHeartbeat(heartbeat *heartbeat.Hear
previousHeartbeatHash := mainStatement.GetPreviousStatementHash() previousHeartbeatHash := mainStatement.GetPreviousStatementHash()
if len(previousHeartbeatHash) == 0 { if len(previousHeartbeatHash) == 0 {
neighborManager.Reset() neighborManager.Reset()
} else if neighborManager.lastAppliedHeartbeat != nil && !bytes.Equal(neighborManager.lastAppliedHeartbeat.GetMainStatement().GetHash(), previousHeartbeatHash) { } else if neighborManager.lastReceivedHeartbeat != nil {
lastMainStatement := neighborManager.lastReceivedHeartbeat.GetMainStatement()
previousHeartbeatHashString := typeutils.BytesToString(previousHeartbeatHash)
if lastMainStatement != nil && !bytes.Equal(lastMainStatement.GetHash(), previousHeartbeatHash) {
if len(neighborManager.pendingHeartbeats) >= MAX_PENDING_HEARTBEATS || len(neighborManager.missingHeartbeats) >= MAX_MISSING_HEARTBEATS {
neighborManager.Reset()
} else if _, exists := neighborManager.heartbeats[previousHeartbeatHashString]; !exists {
neighborManager.missingHeartbeats[previousHeartbeatHashString] = true
}
}
}
heartbeatHash := typeutils.BytesToString(mainStatement.GetHash())
if neighborManager.lastReceivedHeartbeat == nil || mainStatement.GetTime() > neighborManager.lastReceivedHeartbeat.GetMainStatement().GetTime() {
neighborManager.lastReceivedHeartbeat = heartbeat
} }
neighborManager.heartbeats[heartbeatHash] = heartbeat
neighborManager.pendingHeartbeats[heartbeatHash] = heartbeat
delete(neighborManager.missingHeartbeats, heartbeatHash)
// endregion /////////////////////////////////////////////////////////////////////////////////////////////////////// // endregion ///////////////////////////////////////////////////////////////////////////////////////////////////////
return
}
func (neighborManager *NeighborManager) applyPendingHeartbeats() (err errors.IdentifiableError) {
if len(neighborManager.missingHeartbeats) == 0 && len(neighborManager.pendingHeartbeats) >= 1 {
// cycle through heartbeats and apply them one by one
}
return
}
func (neighborManager *NeighborManager) ApplyHeartbeat(heartbeat *heartbeat.Heartbeat) (err errors.IdentifiableError) {
if storeErr := neighborManager.storeHeartbeat(heartbeat); storeErr != nil {
err = storeErr
return
}
// region mark idle neighbors ////////////////////////////////////////////////////////////////////////////////////// // region mark idle neighbors //////////////////////////////////////////////////////////////////////////////////////
existingNeighbors := make(map[string]*StatementChain) existingNeighbors := make(map[string]*StatementChain)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment