@@ -66,7 +66,8 @@ type Endure struct {
6666 stopTimeout time.Duration
6767
6868 // deps is a map with all saved deps
69- deps map [string ]interface {}
69+ deps map [string ]interface {}
70+ depsOrd []string
7071 // disabled is a map with disabled deps
7172 disabled map [string ]bool
7273 // initialized vertices map
@@ -121,7 +122,8 @@ func NewContainer(logger *zap.Logger, options ...Options) (*Endure, error) {
121122 output : Empty ,
122123 disabled : make (map [string ]bool ),
123124 initialized : make (map [string ]bool ),
124- deps : make (map [string ]interface {}),
125+ deps : make (map [string ]interface {}, 5 ),
126+ depsOrd : make ([]string , 0 , 2 ),
125127 }
126128
127129 // Transition map
@@ -266,6 +268,7 @@ func (e *Endure) Register(vertex interface{}) error {
266268
267269 // save all vertices on the initial stage
268270 e .deps [vertexID ] = vertex
271+ e .depsOrd = append (e .depsOrd , vertexID )
269272
270273 return nil
271274}
@@ -414,6 +417,9 @@ START:
414417 head = head .Next
415418 }
416419
420+ // we don't need startup helpers anymore
421+ e .depsOrd = nil
422+ e .deps = nil
417423 return nil
418424}
419425
@@ -459,6 +465,8 @@ func (e *Endure) Shutdown() error {
459465 return e .shutdown (e .runList .Head , true )
460466}
461467
468+ // I don't like this part, this should be rewritten
469+ // We should compute whole subgraph after we found disabled vertex and remove it with 1 operation.
462470func (e * Endure ) removeVertex (head * ll.DllNode ) error {
463471 const op = errors .Op ("endure_disable" )
464472 e .logger .Debug ("found disabled vertex" , zap .String ("id" , head .Vertex .ID ))
@@ -467,6 +475,12 @@ func (e *Endure) removeVertex(head *ll.DllNode) error {
467475 // disable all types which vertex provides as a root
468476 e .disabled [providesID ] = true
469477 delete (e .deps , providesID )
478+ for i := 0 ; i < len (e .depsOrd ); i ++ {
479+ if e .depsOrd [i ] == head .Vertex .ID {
480+ e .depsOrd = append (e .depsOrd [:i ], e .depsOrd [i + 1 :]... )
481+ break
482+ }
483+ }
470484 }
471485
472486 e .disabled [head .Vertex .ID ] = true
@@ -478,11 +492,17 @@ func (e *Endure) removeVertex(head *ll.DllNode) error {
478492 e .graph = nil
479493 e .graph = graph .NewGraph ()
480494
495+ for i := 0 ; i < len (e .depsOrd ); i ++ {
496+ if e .depsOrd [i ] == head .Vertex .ID {
497+ e .depsOrd = append (e .depsOrd [:i ], e .depsOrd [i + 1 :]... )
498+ break
499+ }
500+ }
481501 delete (e .deps , head .Vertex .ID )
482502
483503 // re-register all deps, excluding disabled
484- for k := range e . deps {
485- err := e .reRegister (e .deps [k ])
504+ for i := 0 ; i < len ( e . depsOrd ); i ++ {
505+ err := e .reRegister (e.deps [e. depsOrd [ i ] ])
486506 if err != nil {
487507 return errors .E (op , err )
488508 }
0 commit comments