Commit 288ada27 authored by Francis Li's avatar Francis Li Committed by GitHub

[op-conductor] resume logic improvement (#9197)

* Add conductor transition diagram

* Update sequencer active status upon resume
parent 640b4cb7
...@@ -27,4 +27,12 @@ On a high level, op-conductor serves the following functions: ...@@ -27,4 +27,12 @@ On a high level, op-conductor serves the following functions:
3. monitor sequencer (op-node) health 3. monitor sequencer (op-node) health
4. control loop => control sequencer (op-node) status (start / stop) based on different scenarios 4. control loop => control sequencer (op-node) status (start / stop) based on different scenarios
### Conductor State Transition
![conductor state transition](./assets/op-conductor-state-transition.svg)
Helpful tips:
To better understand the graph, focus on one node at a time, understand what can be transitioned to this current state and how it can transition to other states.
This way you could understand how we handle the state transitions.
This is initial version of README, more details will be added later. This is initial version of README, more details will be added later.
This diff is collapsed.
...@@ -133,13 +133,7 @@ func (c *OpConductor) initSequencerControl(ctx context.Context) error { ...@@ -133,13 +133,7 @@ func (c *OpConductor) initSequencerControl(ctx context.Context) error {
node := sources.NewRollupClient(nc) node := sources.NewRollupClient(nc)
c.ctrl = client.NewSequencerControl(exec, node) c.ctrl = client.NewSequencerControl(exec, node)
active, err := c.ctrl.SequencerActive(ctx) return c.updateSequencerActiveStatus()
if err != nil {
return errors.Wrap(err, "failed to get sequencer active status")
}
c.seqActive.Store(active)
return nil
} }
func (c *OpConductor) initConsensus(ctx context.Context) error { func (c *OpConductor) initConsensus(ctx context.Context) error {
...@@ -358,6 +352,11 @@ func (oc *OpConductor) Pause(ctx context.Context) error { ...@@ -358,6 +352,11 @@ func (oc *OpConductor) Pause(ctx context.Context) error {
// Resume resumes the control loop of OpConductor. // Resume resumes the control loop of OpConductor.
func (oc *OpConductor) Resume(ctx context.Context) error { func (oc *OpConductor) Resume(ctx context.Context) error {
err := oc.updateSequencerActiveStatus()
if err != nil {
return errors.Wrap(err, "cannot resume because failed to get sequencer active status")
}
select { select {
case oc.resumeCh <- struct{}{}: case oc.resumeCh <- struct{}{}:
<-oc.resumeDoneCh <-oc.resumeDoneCh
...@@ -612,3 +611,12 @@ func (oc *OpConductor) startSequencer() error { ...@@ -612,3 +611,12 @@ func (oc *OpConductor) startSequencer() error {
oc.seqActive.Store(true) oc.seqActive.Store(true)
return nil return nil
} }
func (oc *OpConductor) updateSequencerActiveStatus() error {
active, err := oc.ctrl.SequencerActive(oc.shutdownCtx)
if err != nil {
return errors.Wrap(err, "failed to get sequencer active status")
}
oc.seqActive.Store(active)
return nil
}
...@@ -175,6 +175,7 @@ func (s *OpConductorTestSuite) TestControlLoop1() { ...@@ -175,6 +175,7 @@ func (s *OpConductorTestSuite) TestControlLoop1() {
s.healthUpdateCh <- true s.healthUpdateCh <- true
// Resume // Resume
s.ctrl.EXPECT().SequencerActive(mock.Anything).Return(false, nil)
err = s.conductor.Resume(s.ctx) err = s.conductor.Resume(s.ctx)
s.NoError(err) s.NoError(err)
s.False(s.conductor.Paused()) s.False(s.conductor.Paused())
...@@ -200,6 +201,7 @@ func (s *OpConductorTestSuite) TestControlLoop2() { ...@@ -200,6 +201,7 @@ func (s *OpConductorTestSuite) TestControlLoop2() {
s.True(s.conductor.Paused()) s.True(s.conductor.Paused())
// Resume // Resume
s.ctrl.EXPECT().SequencerActive(mock.Anything).Return(false, nil)
err = s.conductor.Resume(s.ctx) err = s.conductor.Resume(s.ctx)
s.NoError(err) s.NoError(err)
s.False(s.conductor.Paused()) s.False(s.conductor.Paused())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment