Hi Thang,

I assume you have tried and there is no way to reuse the current *state* of su to prevent the lock-in op in this scenario, and this patch tested ok with upgrade/downgrade. The down side of adding checkpoint is that we will stick with it even then we find better solution later on, since removing the checkpoint would cause a nbc.

No comments from me.

Thanks

Minh

On 2/12/19 2:39 pm, thang.d.nguyen wrote:
AMFD should not accept lock-in admin op on SU
if the SU is repairing.
---
  src/amf/amfd/chkop.cc     |  9 +++++++++
  src/amf/amfd/ckpt.h       |  3 ++-
  src/amf/amfd/ckpt_dec.cc  | 42 +++++++++++++++++++++++++++++++++++++--
  src/amf/amfd/ckpt_enc.cc  | 30 +++++++++++++++++++++++++++-
  src/amf/amfd/ckpt_msg.h   |  1 +
  src/amf/amfd/ckpt_updt.cc |  1 +
  src/amf/amfd/sgproc.cc    |  1 +
  src/amf/amfd/su.cc        | 19 ++++++++++++++++++
  src/amf/amfd/su.h         |  3 +++
  9 files changed, 105 insertions(+), 4 deletions(-)

diff --git a/src/amf/amfd/chkop.cc b/src/amf/amfd/chkop.cc
index 56b0142a6..15408b657 100644
--- a/src/amf/amfd/chkop.cc
+++ b/src/amf/amfd/chkop.cc
@@ -923,6 +923,14 @@ uint32_t avsv_send_ckpt_data(AVD_CL_CB *cb, uint32_t 
action,
          /* No need to send the message as standy would get the applier 
callback
           */
          return NCSCC_RC_SUCCESS;
+    case AVSV_CKPT_SU_INST_PROCESSED:
+      if (avd_cb->avd_peer_ver < AVD_MBCSV_SUB_PART_VERSION_11) {
+        /* No need to send the message to old std as this async is newly added.
+         */
+        return NCSCC_RC_SUCCESS;
+      }
+      cb->async_updt_cnt.su_updt++;
+      break;
      /* else fall through */
      case AVSV_CKPT_SU_SI_CURR_ACTIVE:
      case AVSV_CKPT_SU_SI_CURR_STBY:
@@ -1366,6 +1374,7 @@ static uint32_t avsv_validate_reo_type_in_csync(AVD_CL_CB 
*cb,
      case AVSV_CKPT_SU_SI_CURR_STBY:
      case AVSV_CKPT_SU_ADMIN_STATE:
      case AVSV_CKPT_SU_TERM_STATE:
+    case AVSV_CKPT_SU_INST_PROCESSED:
      case AVSV_CKPT_SU_SWITCH:
      case AVSV_CKPT_SU_OPER_STATE:
      case AVSV_CKPT_SU_PRES_STATE:
diff --git a/src/amf/amfd/ckpt.h b/src/amf/amfd/ckpt.h
index 2e1538719..f092f5b8c 100644
--- a/src/amf/amfd/ckpt.h
+++ b/src/amf/amfd/ckpt.h
@@ -35,9 +35,10 @@
  #define AMF_AMFD_CKPT_H_
// current version
-#define AVD_MBCSV_SUB_PART_VERSION 10
+#define AVD_MBCSV_SUB_PART_VERSION 11
// supported versions
+#define AVD_MBCSV_SUB_PART_VERSION_11 11
  #define AVD_MBCSV_SUB_PART_VERSION_10 10
  #define AVD_MBCSV_SUB_PART_VERSION_9 9
  #define AVD_MBCSV_SUB_PART_VERSION_8 8
diff --git a/src/amf/amfd/ckpt_dec.cc b/src/amf/amfd/ckpt_dec.cc
index 75213f821..7030f43b1 100644
--- a/src/amf/amfd/ckpt_dec.cc
+++ b/src/amf/amfd/ckpt_dec.cc
@@ -63,6 +63,7 @@ static uint32_t dec_su_si_curr_active(AVD_CL_CB *cb, 
NCS_MBCSV_CB_DEC *dec);
  static uint32_t dec_su_si_curr_stby(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec);
  static uint32_t dec_su_admin_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec);
  static uint32_t dec_su_term_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec);
+static uint32_t dec_su_inst_msg_processed(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC 
*dec);
  static uint32_t dec_su_switch(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec);
  static uint32_t dec_su_oper_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec);
  static uint32_t dec_su_pres_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec);
@@ -162,8 +163,8 @@ const AVSV_DECODE_CKPT_DATA_FUNC_PTR 
avd_dec_data_func_list[] = {
      dec_comp_pres_state, dec_comp_restart_count, nullptr, /* AVSV_SYNC_COMMIT 
*/
      dec_su_restart_count, dec_si_dep_state, dec_ng_admin_state,
      dec_avd_to_avd_job_queue_status,
-    dec_node_failover_state
-
+    dec_node_failover_state,
+    dec_su_inst_msg_processed
  };
/*
@@ -445,6 +446,9 @@ static void decode_su(NCS_UBAID *ub, AVD_SU *su, uint16_t 
peer_version) {
if (peer_version >= AVD_MBCSV_SUB_PART_VERSION_2)
      osaf_decode_bool(ub, &su->su_is_external);
+
+  if (peer_version >= AVD_MBCSV_SUB_PART_VERSION_11)
+    osaf_decode_bool(ub, &su->is_inst_msg_processed);
  }
/****************************************************************************\
@@ -1538,6 +1542,40 @@ static uint32_t dec_su_term_state(AVD_CL_CB *cb, 
NCS_MBCSV_CB_DEC *dec) {
    return NCSCC_RC_SUCCESS;
  }
+/****************************************************************************\
+ *
+ * Purpose:  Decode SU inst msg of service
+ *
+ * Input: cb - CB pointer.
+ *        dec - Decode arguments passed by MBCSV.
+ *
+ * Returns: NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE.
+ *
+ * NOTES:
+ *
+ *
+\**************************************************************************/
+static uint32_t dec_su_inst_msg_processed(
+                                     AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec) {
+  SaNameT name;
+
+  TRACE_ENTER();
+
+  osaf_decode_sanamet(&dec->i_uba, &name);
+  AVD_SU *su = su_db->find(Amf::to_string(&name));
+  osafassert(su != nullptr);
+  osaf_decode_uint32(&dec->i_uba,
+                    reinterpret_cast<uint32_t *>(&su->is_inst_msg_processed));
+
+  cb->async_updt_cnt.su_updt++;
+
+  TRACE_LEAVE2("'%s', is_inst_msg_processed=%u, su_updt:%d",
+               osaf_extended_name_borrow(&name), su->is_inst_msg_processed,
+               cb->async_updt_cnt.su_updt);
+  osaf_extended_name_free(&name);
+  return NCSCC_RC_SUCCESS;
+}
+
  /****************************************************************************\
   *
   * Purpose:  Decode SU toggle SI.
diff --git a/src/amf/amfd/ckpt_enc.cc b/src/amf/amfd/ckpt_enc.cc
index 2ca98f82d..26f66ce9f 100644
--- a/src/amf/amfd/ckpt_enc.cc
+++ b/src/amf/amfd/ckpt_enc.cc
@@ -62,6 +62,7 @@ static uint32_t enc_su_si_curr_active(AVD_CL_CB *cb, 
NCS_MBCSV_CB_ENC *enc);
  static uint32_t enc_su_si_curr_stby(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc);
  static uint32_t enc_su_admin_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc);
  static uint32_t enc_su_term_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc);
+static uint32_t enc_su_inst_msg_processed(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC 
*enc);
  static uint32_t enc_su_switch(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc);
  static uint32_t enc_su_oper_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc);
  static uint32_t enc_su_pres_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc);
@@ -165,7 +166,7 @@ const AVSV_ENCODE_CKPT_DATA_FUNC_PTR 
avd_enc_ckpt_data_func_list[] = {
      enc_comp_pres_state, enc_comp_restart_count, nullptr, /* AVSV_SYNC_COMMIT 
*/
      enc_su_restart_count, enc_si_dep_state, enc_ng_admin_state,
      enc_avd_to_avd_job_queue_status,
-    enc_node_failover_state};
+    enc_node_failover_state, enc_su_inst_msg_processed};
/*
   * Function list for encoding the cold sync response data
@@ -419,6 +420,9 @@ static void encode_su(NCS_UBAID *ub, AVD_SU *su, uint16_t 
peer_version) {
if (peer_version >= AVD_MBCSV_SUB_PART_VERSION_2)
      osaf_encode_bool(ub, su->su_is_external);
+
+  if (peer_version >= AVD_MBCSV_SUB_PART_VERSION_11)
+    osaf_encode_bool(ub, su->is_inst_msg_processed);
  }
/****************************************************************************\
@@ -1297,6 +1301,30 @@ static uint32_t enc_su_term_state(AVD_CL_CB *cb, 
NCS_MBCSV_CB_ENC *enc) {
    return NCSCC_RC_SUCCESS;
  }
+/****************************************************************************\
+ *
+ * Purpose:  Encode SU inst msg of service.
+ *
+ * Input: cb - CB pointer.
+ *        enc - Encode arguments passed by MBCSV.
+ *
+ * Returns: NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE.
+ *
+ * NOTES:
+ *
+ *
+\**************************************************************************/
+static uint32_t enc_su_inst_msg_processed(
+                                     AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc) {
+  TRACE_ENTER();
+  osafassert(NCS_MBCSV_ACT_UPDATE == enc->io_action);
+  const AVD_SU *su = reinterpret_cast<AVD_SU *>(enc->io_reo_hdl);
+  osaf_encode_sanamet_o2(&enc->io_uba, su->name.c_str());
+  osaf_encode_bool(&enc->io_uba, su->is_inst_msg_processed);
+  TRACE_LEAVE();
+  return NCSCC_RC_SUCCESS;
+}
+
  /****************************************************************************\
   *
   * Purpose:  Encode SU toggle SI.
diff --git a/src/amf/amfd/ckpt_msg.h b/src/amf/amfd/ckpt_msg.h
index c89ad9249..7b5960a85 100644
--- a/src/amf/amfd/ckpt_msg.h
+++ b/src/amf/amfd/ckpt_msg.h
@@ -114,6 +114,7 @@ typedef enum avsv_ckpt_msg_reo_type {
    AVSV_CKPT_NG_ADMIN_STATE,
    AVSV_CKPT_AVD_IMM_JOB_QUEUE_STATUS,
    AVSV_CKPT_NODE_FAILOVER_STATE,
+  AVSV_CKPT_SU_INST_PROCESSED,
    AVSV_CKPT_MSG_MAX
  } AVSV_CKPT_MSG_REO_TYPE;
diff --git a/src/amf/amfd/ckpt_updt.cc b/src/amf/amfd/ckpt_updt.cc
index 471c68730..b01eadb24 100644
--- a/src/amf/amfd/ckpt_updt.cc
+++ b/src/amf/amfd/ckpt_updt.cc
@@ -205,6 +205,7 @@ uint32_t avd_ckpt_su(AVD_CL_CB *cb, AVD_SU *ckpt_su,
    su->saAmfSUNumCurrStandbySIs = ckpt_su->saAmfSUNumCurrStandbySIs;
    su->saAmfSUHostedByNode = ckpt_su->saAmfSUHostedByNode;
    su->term_state = ckpt_su->term_state;
+  su->is_inst_msg_processed = ckpt_su->is_inst_msg_processed;
    su->su_switch = ckpt_su->su_switch;
    su->saAmfSURestartCount = ckpt_su->saAmfSURestartCount;
diff --git a/src/amf/amfd/sgproc.cc b/src/amf/amfd/sgproc.cc
index ddd825d44..1d7e62a23 100644
--- a/src/amf/amfd/sgproc.cc
+++ b/src/amf/amfd/sgproc.cc
@@ -2126,6 +2126,7 @@ uint32_t avd_sg_app_su_inst_func(AVD_CL_CB *cb, AVD_SG 
*sg) {
              }
            } else {
              if (avd_snd_presence_msg(cb, i_su, false) == NCSCC_RC_SUCCESS) {
+              i_su->set_inst_msg_processed(false);
                num_try_insvc_su++;
              }
            }
diff --git a/src/amf/amfd/su.cc b/src/amf/amfd/su.cc
index 8c8ef9d4f..e1da8f726 100644
--- a/src/amf/amfd/su.cc
+++ b/src/amf/amfd/su.cc
@@ -51,6 +51,7 @@ void AVD_SU::initialize() {
    term_state = false;
    su_switch = AVSV_SI_TOGGLE_STABLE;
    su_is_external = false;
+  is_inst_msg_processed = true;
    su_act_state = 0;
    sg_of_su = nullptr;
    su_on_node = nullptr;
@@ -810,6 +811,12 @@ void AVD_SU::set_pres_state(SaAmfPresenceStateT 
pres_state) {
       */
      return;
+ if ((pres_state == SA_AMF_PRESENCE_INSTANTIATED) ||
+      (pres_state == SA_AMF_PRESENCE_INSTANTIATION_FAILED) ||
+      (pres_state == SA_AMF_PRESENCE_TERMINATION_FAILED)) {
+    set_inst_msg_processed(true);
+  }
+
    osafassert(pres_state <= SA_AMF_PRESENCE_TERMINATION_FAILED);
    TRACE_ENTER2("'%s' %s => %s", name.c_str(),
                 avd_pres_state_name[saAmfSUPresenceState],
@@ -1085,6 +1092,12 @@ void AVD_SU::lock_instantiation(SaImmOiHandleT 
immoi_handle,
      goto done;
    }
+ if (is_inst_msg_processed == false) {
+    report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_TRY_AGAIN,
+                          nullptr, "'%s' instantiate not done", name.c_str());
+    goto done;
+  }
+
    if (list_of_susi != nullptr) {
      report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_TRY_AGAIN,
                            nullptr, "SIs still assigned to this SU '%s'",
@@ -2377,6 +2390,12 @@ void AVD_SU::set_term_state(bool state) {
    m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(avd_cb, this, AVSV_CKPT_SU_TERM_STATE);
  }
+void AVD_SU::set_inst_msg_processed(bool processed) {
+  is_inst_msg_processed = processed;
+  TRACE("%s inst_msg_processed %u", name.c_str(), processed);
+  m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(avd_cb, this, AVSV_CKPT_SU_INST_PROCESSED);
+}
+
  void AVD_SU::set_su_switch(SaToggleState state, bool wrt_to_imm) {
    su_switch = state;
    TRACE("%s su_switch %u", name.c_str(), su_switch);
diff --git a/src/amf/amfd/su.h b/src/amf/amfd/su.h
index 7afc5abee..f32f3138a 100644
--- a/src/amf/amfd/su.h
+++ b/src/amf/amfd/su.h
@@ -87,6 +87,8 @@ class AVD_SU {
bool su_is_external; /* indicates if this SU is external */ + bool is_inst_msg_processed; /* indicate inst msg sent to nd */
+
    int su_act_state;  // not used, kept for EDU, remove later
bool wait_for_contained_to_quiesce;
@@ -122,6 +124,7 @@ class AVD_SU {
    void set_all_susis_assigned_quiesced(void);
    void set_all_susis_assigned(void);
    void set_term_state(bool state);
+  void set_inst_msg_processed(bool processed);
    void remove_from_model();
    void set_su_switch(SaToggleState state, bool wrt_to_imm = true);
    AVD_AVND *get_node_ptr(void) const;


_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to