<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/18954">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bts_shutdown: Wait until all TRX are closed<br><br>Setting the phy link of a trx to SHUTDOWN sets operative state to<br>DISABLED, so we use operative state as a condition to know whether all<br>TRX are already powered off properly and we can exit.<br><br>Change-Id: I2bcd211d7edcc8486461a555d6c470a94b166ed7<br>---<br>M include/osmo-bts/bts_shutdown_fsm.h<br>M src/common/bts_shutdown_fsm.c<br>2 files changed, 51 insertions(+), 11 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/bts_shutdown_fsm.h b/include/osmo-bts/bts_shutdown_fsm.h</span><br><span>index 42f953a..1e74ac6 100644</span><br><span>--- a/include/osmo-bts/bts_shutdown_fsm.h</span><br><span>+++ b/include/osmo-bts/bts_shutdown_fsm.h</span><br><span>@@ -28,12 +28,14 @@</span><br><span> enum bts_shutdown_fsm_states {</span><br><span>   BTS_SHUTDOWN_ST_NONE,</span><br><span>        BTS_SHUTDOWN_ST_WAIT_RAMP_DOWN_COMPL,</span><br><span style="color: hsl(120, 100%, 40%);">+ BTS_SHUTDOWN_ST_WAIT_TRX_CLOSED,</span><br><span>     BTS_SHUTDOWN_ST_EXIT,</span><br><span> };</span><br><span> </span><br><span> enum bts_shutdown_fsm_events {</span><br><span>    BTS_SHUTDOWN_EV_START,</span><br><span>       BTS_SHUTDOWN_EV_TRX_RAMP_COMPL,</span><br><span style="color: hsl(120, 100%, 40%);">+       BTS_SHUTDOWN_EV_TRX_CLOSED,</span><br><span> };</span><br><span> </span><br><span> extern struct osmo_fsm bts_shutdown_fsm;</span><br><span>diff --git a/src/common/bts_shutdown_fsm.c b/src/common/bts_shutdown_fsm.c</span><br><span>index 81cd348..d8a8d11 100644</span><br><span>--- a/src/common/bts_shutdown_fsm.c</span><br><span>+++ b/src/common/bts_shutdown_fsm.c</span><br><span>@@ -32,7 +32,7 @@</span><br><span> </span><br><span> static const struct osmo_tdef_state_timeout bts_shutdown_fsm_timeouts[32] = {</span><br><span>  [BTS_SHUTDOWN_ST_WAIT_RAMP_DOWN_COMPL] = { .T = -1 },</span><br><span style="color: hsl(0, 100%, 40%);">-   [BTS_SHUTDOWN_ST_EXIT] = { .T = -2 },</span><br><span style="color: hsl(120, 100%, 40%);">+ [BTS_SHUTDOWN_ST_WAIT_TRX_CLOSED] = { .T = -2 },</span><br><span> };</span><br><span> </span><br><span> #define bts_shutdown_fsm_state_chg(fi, NEXT_STATE) \</span><br><span>@@ -79,12 +79,12 @@</span><br><span>             LOGPFSML(fi, LOGL_INFO, "%s Ramping down complete, %u TRX remaining\n",</span><br><span>                     gsm_trx_name(src_trx), remaining);</span><br><span>          if (remaining == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                     bts_shutdown_fsm_state_chg(fi, BTS_SHUTDOWN_ST_EXIT);</span><br><span style="color: hsl(120, 100%, 40%);">+                 bts_shutdown_fsm_state_chg(fi, BTS_SHUTDOWN_ST_WAIT_TRX_CLOSED);</span><br><span>             break;</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void st_exit_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+static void st_wait_trx_closed_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span> {</span><br><span>   struct gsm_bts *bts = (struct gsm_bts *)fi->priv;</span><br><span>         struct gsm_bts_trx *trx;</span><br><span>@@ -94,9 +94,36 @@</span><br><span>        llist_for_each_entry_reverse(trx, &bts->trx_list, list) {</span><br><span>             bts_model_trx_close(trx);</span><br><span>    }</span><br><span style="color: hsl(0, 100%, 40%);">-       /* There's yet no way to get confirmation from lower layers regarding</span><br><span style="color: hsl(0, 100%, 40%);">-          state. Allow a few seconds of select() loop and timeout timer will</span><br><span style="color: hsl(0, 100%, 40%);">-      exit later */</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Now wait until all TRX are closed asynchronously, we'll get feedback through events... */</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void st_wait_trx_closed(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_bts *bts = (struct gsm_bts *)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_bts_trx *src_trx, *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned int remaining = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch(event) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case BTS_SHUTDOWN_EV_TRX_CLOSED:</span><br><span style="color: hsl(120, 100%, 40%);">+              src_trx = (struct gsm_bts_trx *)data;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (trx->mo.nm_state.operational != NM_OPSTATE_DISABLED)</span><br><span style="color: hsl(120, 100%, 40%);">+                           remaining++;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPFSML(fi, LOGL_INFO, "%s TRX closed, %u TRX remaining\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                         gsm_trx_name(src_trx), remaining);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (remaining == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                   bts_shutdown_fsm_state_chg(fi, BTS_SHUTDOWN_ST_EXIT);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void st_exit_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPFSML(fi, LOGL_NOTICE, "Shutdown process completed successfuly, exiting process\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     exit(0);</span><br><span> }</span><br><span> </span><br><span> static struct osmo_fsm_state bts_shutdown_fsm_states[] = {</span><br><span>@@ -111,11 +138,20 @@</span><br><span>              .in_event_mask =</span><br><span>                     X(BTS_SHUTDOWN_EV_TRX_RAMP_COMPL),</span><br><span>           .out_state_mask =</span><br><span style="color: hsl(0, 100%, 40%);">-                       X(BTS_SHUTDOWN_ST_EXIT),</span><br><span style="color: hsl(120, 100%, 40%);">+                      X(BTS_SHUTDOWN_ST_WAIT_TRX_CLOSED),</span><br><span>          .name = "WAIT_RAMP_DOWN_COMPL",</span><br><span>            .onenter = st_wait_ramp_down_compl_on_enter,</span><br><span>                 .action = st_wait_ramp_down_compl,</span><br><span>   },</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_SHUTDOWN_ST_WAIT_TRX_CLOSED] = {</span><br><span style="color: hsl(120, 100%, 40%);">+         .in_event_mask =</span><br><span style="color: hsl(120, 100%, 40%);">+                      X(BTS_SHUTDOWN_EV_TRX_CLOSED),</span><br><span style="color: hsl(120, 100%, 40%);">+                .out_state_mask =</span><br><span style="color: hsl(120, 100%, 40%);">+                     X(BTS_SHUTDOWN_ST_EXIT),</span><br><span style="color: hsl(120, 100%, 40%);">+              .name = "WAIT_TRX_CLOSED",</span><br><span style="color: hsl(120, 100%, 40%);">+          .onenter = st_wait_trx_closed_on_enter,</span><br><span style="color: hsl(120, 100%, 40%);">+               .action = st_wait_trx_closed,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span>   [BTS_SHUTDOWN_ST_EXIT] = {</span><br><span>           .name = "EXIT",</span><br><span>            .onenter = st_exit_on_enter,</span><br><span>@@ -125,6 +161,7 @@</span><br><span> const struct value_string bts_shutdown_fsm_event_names[] = {</span><br><span>   OSMO_VALUE_STRING(BTS_SHUTDOWN_EV_START),</span><br><span>    OSMO_VALUE_STRING(BTS_SHUTDOWN_EV_TRX_RAMP_COMPL),</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_VALUE_STRING(BTS_SHUTDOWN_ST_WAIT_TRX_CLOSED),</span><br><span>  { 0, NULL }</span><br><span> };</span><br><span> </span><br><span>@@ -133,11 +170,11 @@</span><br><span>        switch (fi->state) {</span><br><span>      case BTS_SHUTDOWN_ST_WAIT_RAMP_DOWN_COMPL:</span><br><span>           LOGPFSML(fi, LOGL_ERROR, "Timer expired waiting for ramp down complete\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           bts_shutdown_fsm_state_chg(fi, BTS_SHUTDOWN_ST_EXIT);</span><br><span style="color: hsl(120, 100%, 40%);">+         bts_shutdown_fsm_state_chg(fi, BTS_SHUTDOWN_ST_WAIT_TRX_CLOSED);</span><br><span>             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case BTS_SHUTDOWN_ST_EXIT:</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPFSML(fi, LOGL_NOTICE, "Shutdown process completed successfuly, exiting process\n");</span><br><span style="color: hsl(0, 100%, 40%);">-               exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+      case BTS_SHUTDOWN_ST_WAIT_TRX_CLOSED:</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGPFSML(fi, LOGL_ERROR, "Timer expired waiting for TRX close\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          bts_shutdown_fsm_state_chg(fi, BTS_SHUTDOWN_ST_EXIT);</span><br><span>                break;</span><br><span>       default:</span><br><span>             OSMO_ASSERT(false);</span><br><span>@@ -175,4 +212,5 @@</span><br><span> {</span><br><span>       struct osmo_fsm_inst *fi = trx->bts->shutdown_fi;</span><br><span>      LOGPFSML(fi, LOGL_DEBUG, "%s Received TRX close cb rc=%d\n", gsm_trx_name(trx), rc);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_fsm_inst_dispatch(fi, BTS_SHUTDOWN_EV_TRX_CLOSED, trx);</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/18954">change 18954</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-bts/+/18954"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I2bcd211d7edcc8486461a555d6c470a94b166ed7 </div>
<div style="display:none"> Gerrit-Change-Number: 18954 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>