Re: [devel] [PATCH 1/1] amfd: not accept lock-in if su is reparing [#3121]

2019-12-02 Thread Minh Hon Chau

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(&su->is_inst

[devel] [PATCH 1/1] amfd: not accept lock-in if su is reparing [#3121]

2019-12-01 Thread thang.d.nguyen
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(&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_e