Change in osmo-bts[master]: bts_shutdown: Wait until all TRX are closed

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

pespin gerrit-no-reply at lists.osmocom.org
Tue Jun 23 14:18:42 UTC 2020


pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bts/+/18954 )

Change subject: bts_shutdown: Wait until all TRX are closed
......................................................................

bts_shutdown: Wait until all TRX are closed

Setting the phy link of a trx to SHUTDOWN sets operative state to
DISABLED, so we use operative state as a condition to know whether all
TRX are already powered off properly and we can exit.

Change-Id: I2bcd211d7edcc8486461a555d6c470a94b166ed7
---
M include/osmo-bts/bts_shutdown_fsm.h
M src/common/bts_shutdown_fsm.c
2 files changed, 51 insertions(+), 11 deletions(-)

Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, approved



diff --git a/include/osmo-bts/bts_shutdown_fsm.h b/include/osmo-bts/bts_shutdown_fsm.h
index 42f953a..1e74ac6 100644
--- a/include/osmo-bts/bts_shutdown_fsm.h
+++ b/include/osmo-bts/bts_shutdown_fsm.h
@@ -28,12 +28,14 @@
 enum bts_shutdown_fsm_states {
 	BTS_SHUTDOWN_ST_NONE,
 	BTS_SHUTDOWN_ST_WAIT_RAMP_DOWN_COMPL,
+	BTS_SHUTDOWN_ST_WAIT_TRX_CLOSED,
 	BTS_SHUTDOWN_ST_EXIT,
 };
 
 enum bts_shutdown_fsm_events {
 	BTS_SHUTDOWN_EV_START,
 	BTS_SHUTDOWN_EV_TRX_RAMP_COMPL,
+	BTS_SHUTDOWN_EV_TRX_CLOSED,
 };
 
 extern struct osmo_fsm bts_shutdown_fsm;
diff --git a/src/common/bts_shutdown_fsm.c b/src/common/bts_shutdown_fsm.c
index 81cd348..d8a8d11 100644
--- a/src/common/bts_shutdown_fsm.c
+++ b/src/common/bts_shutdown_fsm.c
@@ -32,7 +32,7 @@
 
 static const struct osmo_tdef_state_timeout bts_shutdown_fsm_timeouts[32] = {
 	[BTS_SHUTDOWN_ST_WAIT_RAMP_DOWN_COMPL] = { .T = -1 },
-	[BTS_SHUTDOWN_ST_EXIT] = { .T = -2 },
+	[BTS_SHUTDOWN_ST_WAIT_TRX_CLOSED] = { .T = -2 },
 };
 
 #define bts_shutdown_fsm_state_chg(fi, NEXT_STATE) \
@@ -79,12 +79,12 @@
 		LOGPFSML(fi, LOGL_INFO, "%s Ramping down complete, %u TRX remaining\n",
 			 gsm_trx_name(src_trx), remaining);
 		if (remaining == 0)
-			bts_shutdown_fsm_state_chg(fi, BTS_SHUTDOWN_ST_EXIT);
+			bts_shutdown_fsm_state_chg(fi, BTS_SHUTDOWN_ST_WAIT_TRX_CLOSED);
 		break;
 	}
 }
 
-static void st_exit_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)
+static void st_wait_trx_closed_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)
 {
 	struct gsm_bts *bts = (struct gsm_bts *)fi->priv;
 	struct gsm_bts_trx *trx;
@@ -94,9 +94,36 @@
 	llist_for_each_entry_reverse(trx, &bts->trx_list, list) {
 		bts_model_trx_close(trx);
 	}
-	/* There's yet no way to get confirmation from lower layers regarding
-	   state. Allow a few seconds of select() loop and timeout timer will
-	   exit later */
+	/* Now wait until all TRX are closed asynchronously, we'll get feedback through events... */
+}
+
+static void st_wait_trx_closed(struct osmo_fsm_inst *fi, uint32_t event, void *data)
+{
+	struct gsm_bts *bts = (struct gsm_bts *)fi->priv;
+	struct gsm_bts_trx *src_trx, *trx;
+	unsigned int remaining = 0;
+
+	switch(event) {
+	case BTS_SHUTDOWN_EV_TRX_CLOSED:
+		src_trx = (struct gsm_bts_trx *)data;
+
+		llist_for_each_entry(trx, &bts->trx_list, list) {
+			if (trx->mo.nm_state.operational != NM_OPSTATE_DISABLED)
+				remaining++;
+		}
+
+		LOGPFSML(fi, LOGL_INFO, "%s TRX closed, %u TRX remaining\n",
+			 gsm_trx_name(src_trx), remaining);
+		if (remaining == 0)
+			bts_shutdown_fsm_state_chg(fi, BTS_SHUTDOWN_ST_EXIT);
+		break;
+	}
+}
+
+static void st_exit_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)
+{
+	LOGPFSML(fi, LOGL_NOTICE, "Shutdown process completed successfuly, exiting process\n");
+	exit(0);
 }
 
 static struct osmo_fsm_state bts_shutdown_fsm_states[] = {
@@ -111,11 +138,20 @@
 		.in_event_mask =
 			X(BTS_SHUTDOWN_EV_TRX_RAMP_COMPL),
 		.out_state_mask =
-			X(BTS_SHUTDOWN_ST_EXIT),
+			X(BTS_SHUTDOWN_ST_WAIT_TRX_CLOSED),
 		.name = "WAIT_RAMP_DOWN_COMPL",
 		.onenter = st_wait_ramp_down_compl_on_enter,
 		.action = st_wait_ramp_down_compl,
 	},
+	[BTS_SHUTDOWN_ST_WAIT_TRX_CLOSED] = {
+		.in_event_mask =
+			X(BTS_SHUTDOWN_EV_TRX_CLOSED),
+		.out_state_mask =
+			X(BTS_SHUTDOWN_ST_EXIT),
+		.name = "WAIT_TRX_CLOSED",
+		.onenter = st_wait_trx_closed_on_enter,
+		.action = st_wait_trx_closed,
+	},
 	[BTS_SHUTDOWN_ST_EXIT] = {
 		.name = "EXIT",
 		.onenter = st_exit_on_enter,
@@ -125,6 +161,7 @@
 const struct value_string bts_shutdown_fsm_event_names[] = {
 	OSMO_VALUE_STRING(BTS_SHUTDOWN_EV_START),
 	OSMO_VALUE_STRING(BTS_SHUTDOWN_EV_TRX_RAMP_COMPL),
+	OSMO_VALUE_STRING(BTS_SHUTDOWN_ST_WAIT_TRX_CLOSED),
 	{ 0, NULL }
 };
 
@@ -133,11 +170,11 @@
 	switch (fi->state) {
 	case BTS_SHUTDOWN_ST_WAIT_RAMP_DOWN_COMPL:
 		LOGPFSML(fi, LOGL_ERROR, "Timer expired waiting for ramp down complete\n");
-		bts_shutdown_fsm_state_chg(fi, BTS_SHUTDOWN_ST_EXIT);
+		bts_shutdown_fsm_state_chg(fi, BTS_SHUTDOWN_ST_WAIT_TRX_CLOSED);
 		break;
-	case BTS_SHUTDOWN_ST_EXIT:
-		LOGPFSML(fi, LOGL_NOTICE, "Shutdown process completed successfuly, exiting process\n");
-		exit(0);
+	case BTS_SHUTDOWN_ST_WAIT_TRX_CLOSED:
+		LOGPFSML(fi, LOGL_ERROR, "Timer expired waiting for TRX close\n");
+		bts_shutdown_fsm_state_chg(fi, BTS_SHUTDOWN_ST_EXIT);
 		break;
 	default:
 		OSMO_ASSERT(false);
@@ -175,4 +212,5 @@
 {
 	struct osmo_fsm_inst *fi = trx->bts->shutdown_fi;
 	LOGPFSML(fi, LOGL_DEBUG, "%s Received TRX close cb rc=%d\n", gsm_trx_name(trx), rc);
+	osmo_fsm_inst_dispatch(fi, BTS_SHUTDOWN_EV_TRX_CLOSED, trx);
 }

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/18954
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: I2bcd211d7edcc8486461a555d6c470a94b166ed7
Gerrit-Change-Number: 18954
Gerrit-PatchSet: 4
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge at osmocom.org>
Gerrit-Reviewer: neels <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: pespin <pespin at sysmocom.de>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200623/3410e490/attachment.htm>


More information about the gerrit-log mailing list