routing: add mission control import functionality
This commit is contained in:
parent
6046c5cf86
commit
22491ad567
@ -342,6 +342,27 @@ func (m *MissionControl) GetHistorySnapshot() *MissionControlSnapshot {
|
|||||||
return m.state.getSnapshot()
|
return m.state.getSnapshot()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ImportHistory imports the set of mission control results provided to our
|
||||||
|
// in-memory state. These results are not persisted, so will not survive
|
||||||
|
// restarts.
|
||||||
|
func (m *MissionControl) ImportHistory(history *MissionControlSnapshot) error {
|
||||||
|
if history == nil {
|
||||||
|
return errors.New("cannot import nil history")
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Lock()
|
||||||
|
defer m.Unlock()
|
||||||
|
|
||||||
|
log.Infof("Importing history snapshot with %v pairs to mission control",
|
||||||
|
len(history.Pairs))
|
||||||
|
|
||||||
|
imported := m.state.importSnapshot(history)
|
||||||
|
|
||||||
|
log.Infof("Imported %v results to mission control", imported)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetPairHistorySnapshot returns the stored history for a given node pair.
|
// GetPairHistorySnapshot returns the stored history for a given node pair.
|
||||||
func (m *MissionControl) GetPairHistorySnapshot(
|
func (m *MissionControl) GetPairHistorySnapshot(
|
||||||
fromNode, toNode route.Vertex) TimedPairResult {
|
fromNode, toNode route.Vertex) TimedPairResult {
|
||||||
|
@ -209,3 +209,53 @@ func (m *missionControlState) getSnapshot() *MissionControlSnapshot {
|
|||||||
|
|
||||||
return &snapshot
|
return &snapshot
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// importSnapshot takes an existing snapshot and merges it with our current
|
||||||
|
// state if the result provided are fresher than our current results. It returns
|
||||||
|
// the number of pairs that were used.
|
||||||
|
func (m *missionControlState) importSnapshot(snapshot *MissionControlSnapshot) int {
|
||||||
|
var imported int
|
||||||
|
|
||||||
|
for _, pair := range snapshot.Pairs {
|
||||||
|
fromNode := pair.Pair.From
|
||||||
|
toNode := pair.Pair.To
|
||||||
|
|
||||||
|
results, found := m.getLastPairResult(fromNode)
|
||||||
|
if !found {
|
||||||
|
results = make(map[route.Vertex]TimedPairResult)
|
||||||
|
}
|
||||||
|
|
||||||
|
lastResult := results[toNode]
|
||||||
|
|
||||||
|
failResult := failPairResult(pair.FailAmt)
|
||||||
|
imported += m.importResult(
|
||||||
|
lastResult.FailTime, pair.FailTime, failResult,
|
||||||
|
fromNode, toNode,
|
||||||
|
)
|
||||||
|
|
||||||
|
successResult := successPairResult(pair.SuccessAmt)
|
||||||
|
imported += m.importResult(
|
||||||
|
lastResult.SuccessTime, pair.SuccessTime, successResult,
|
||||||
|
fromNode, toNode,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return imported
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *missionControlState) importResult(currentTs, importedTs time.Time,
|
||||||
|
importedResult pairResult, fromNode, toNode route.Vertex) int {
|
||||||
|
|
||||||
|
if currentTs.After(importedTs) {
|
||||||
|
log.Debugf("Not setting pair result for %v->%v (%v) "+
|
||||||
|
"success=%v, timestamp %v older than last result %v",
|
||||||
|
fromNode, toNode, importedResult.amt,
|
||||||
|
importedResult.success, importedTs, currentTs)
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
m.setLastPairResult(fromNode, toNode, importedTs, &importedResult)
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user