laforge has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bsc/+/35566?usp=email )
Change subject: Also track downtime when OML link is lost ......................................................................
Also track downtime when OML link is lost
This will be used in a later patch to dertemine when a BTS became offline.
Related: OS#6018 Change-Id: I1776099cbfef51af1d5a3a056fb0654abd7366a9 --- M include/osmocom/bsc/bts.h M src/osmo-bsc/bts.c M src/osmo-bsc/bts_ctrl.c M src/osmo-bsc/bts_ipaccess_nanobts.c M src/osmo-bsc/bts_vty.c M src/osmo-bsc/e1_config.c 6 files changed, 30 insertions(+), 13 deletions(-)
Approvals: pespin: Looks good to me, but someone else must approve Jenkins Builder: Verified fixeria: Looks good to me, approved
diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h index a1799eb..e9634ee 100644 --- a/include/osmocom/bsc/bts.h +++ b/include/osmocom/bsc/bts.h @@ -375,8 +375,8 @@ struct e1inp_sign_link *oml_link; /* Timer to use for deferred drop of OML link, see \ref ipaccess_drop_oml_deferred */ struct osmo_timer_list oml_drop_link_timer; - /* when OML link was established */ - time_t uptime; + /* when OML link was established or lost */ + time_t updowntime;
/* Abis network management O&M handle */ struct abis_nm_h *nmh; @@ -815,7 +815,7 @@ #define BTS_STORE_UPTIME_INTERVAL 10 /* in seconds */ void bts_store_uptime(struct gsm_bts *bts);
-unsigned long long bts_uptime(const struct gsm_bts *bts); +unsigned long long bts_updowntime(const struct gsm_bts *bts);
#define BTS_STORE_LCHAN_DURATIONS_INTERVAL 1 /* in seconds */ void bts_store_lchan_durations(struct gsm_bts *bts); diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c index 733d16e..8cc9e9a 100644 --- a/src/osmo-bsc/bts.c +++ b/src/osmo-bsc/bts.c @@ -766,7 +766,8 @@
void bts_store_uptime(struct gsm_bts *bts) { - osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_UPTIME_SECONDS), bts_uptime(bts)); + osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_UPTIME_SECONDS), + bts->oml_link ? bts_updowntime(bts) : 0); }
void bts_store_lchan_durations(struct gsm_bts *bts) @@ -824,20 +825,20 @@ rate_ctr_add(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHAN_SDCCH_ACTIVE_MILLISECONDS_TOTAL), elapsed_sdcch_ms); }
-unsigned long long bts_uptime(const struct gsm_bts *bts) +unsigned long long bts_updowntime(const struct gsm_bts *bts) { struct timespec tp;
- if (!bts->uptime || !bts->oml_link) + if (!bts->updowntime) return 0;
if (osmo_clock_gettime(CLOCK_MONOTONIC, &tp) != 0) { - LOGP(DNM, LOGL_ERROR, "BTS %u uptime computation failure: %s\n", bts->nr, strerror(errno)); + LOGP(DNM, LOGL_ERROR, "BTS %u uptime/downtime computation failure: %s\n", bts->nr, strerror(errno)); return 0; }
/* monotonic clock helps to ensure that the conversion is valid */ - return difftime(tp.tv_sec, bts->uptime); + return difftime(tp.tv_sec, bts->updowntime); }
char *get_model_oml_status(const struct gsm_bts *bts) diff --git a/src/osmo-bsc/bts_ctrl.c b/src/osmo-bsc/bts_ctrl.c index acbe68a..9c14190 100644 --- a/src/osmo-bsc/bts_ctrl.c +++ b/src/osmo-bsc/bts_ctrl.c @@ -372,7 +372,7 @@ { const struct gsm_bts *bts = cmd->node;
- cmd->reply = talloc_asprintf(cmd, "%llu", bts_uptime(bts)); + cmd->reply = talloc_asprintf(cmd, "%llu", bts->oml_link ? bts_updowntime(bts) : 0); if (!cmd->reply) { cmd->reply = "OOM"; return CTRL_CMD_ERROR; diff --git a/src/osmo-bsc/bts_ipaccess_nanobts.c b/src/osmo-bsc/bts_ipaccess_nanobts.c index c690b46..b0532e5 100644 --- a/src/osmo-bsc/bts_ipaccess_nanobts.c +++ b/src/osmo-bsc/bts_ipaccess_nanobts.c @@ -527,6 +527,8 @@ struct gsm_bts_trx_ts *ts ; uint8_t tn; uint8_t i; + struct timespec tp; + int rc;
/* First of all, remove deferred drop if enabled */ osmo_timer_del(&bts->oml_drop_link_timer); @@ -537,7 +539,8 @@ LOG_BTS(bts, DLINP, LOGL_NOTICE, "Dropping OML link: %s\n", reason); e1inp_sign_link_destroy(bts->oml_link); bts->oml_link = NULL; - bts->uptime = 0; + rc = osmo_clock_gettime(CLOCK_MONOTONIC, &tp); + bts->updowntime = (rc < 0) ? 0 : tp.tv_sec; /* we don't need sub-second precision for downtime */ osmo_stat_item_dec(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_OML_CONNECTED), 1); gsm_bts_stats_reset(bts);
@@ -710,7 +713,7 @@ E1INP_SIGN_OML, bts->c0, bts->oml_tei, 0); rc = osmo_clock_gettime(CLOCK_MONOTONIC, &tp); - bts->uptime = (rc < 0) ? 0 : tp.tv_sec; /* we don't need sub-second precision for uptime */ + bts->updowntime = (rc < 0) ? 0 : tp.tv_sec; /* we don't need sub-second precision for uptime */ if (!(sign_link->trx->bts->ip_access.flags & OML_UP)) { e1inp_event(sign_link->ts, S_L_INP_TEI_UP, sign_link->tei, sign_link->sapi); diff --git a/src/osmo-bsc/bts_vty.c b/src/osmo-bsc/bts_vty.c index 8b97dce..8aa1f89 100644 --- a/src/osmo-bsc/bts_vty.c +++ b/src/osmo-bsc/bts_vty.c @@ -4127,7 +4127,7 @@ vty_out(vty, " OML Link state: %s", get_model_oml_status(bts)); if (bts_setup_ramp_active(bts->network)) vty_out(vty, " BTS Ramping: %s", bts_setup_ramp_get_state_str(bts)); - sec = bts_uptime(bts); + sec = bts_updowntime(bts); if (sec) vty_out(vty, " %llu days %llu hours %llu min. %llu sec.", OSMO_SEC2DAY(sec), OSMO_SEC2HRS(sec), OSMO_SEC2MIN(sec), sec % 60); diff --git a/src/osmo-bsc/e1_config.c b/src/osmo-bsc/e1_config.c index db77234..dbea3e9 100644 --- a/src/osmo-bsc/e1_config.c +++ b/src/osmo-bsc/e1_config.c @@ -197,7 +197,7 @@ e1inp_sign_link_destroy(bts->oml_link); bts->oml_link = oml_link; rc = osmo_clock_gettime(CLOCK_MONOTONIC, &tp); - bts->uptime = (rc < 0) ? 0 : tp.tv_sec; /* we don't need sub-second precision for uptime */ + bts->updowntime = (rc < 0) ? 0 : tp.tv_sec; /* we don't need sub-second precision for uptime */
llist_for_each_entry(trx, &bts->trx_list, list) e1_reconfig_trx(trx);