Hi Nguyen,

Ack

Thanks
Lennart

> -----Original Message-----
> From: Nguyen Luu <nguyen.tk....@dektech.com.au>
> Sent: den 21 juni 2018 15:07
> To: Lennart Lund <lennart.l...@ericsson.com>
> Cc: opensaf-devel@lists.sourceforge.net; Nguyen Tran Khoi Luu
> <nguyen.tk....@dektech.com.au>
> Subject: [PATCH 1/1] smf: Fix failed rollback of DELETE/MODIFY CCB with
> originally empty attributes [#2877]
> 
> Currently, if an upgrade DELETE or MODIFY CCB contains empty-value
> attributes, SMF will create rollback data for those attributes with
> the hard-coded "<_empty_>" string value. However, this hard-coded
> string will actually make the later rollback fail, especially for
> numeric-type attributes, when trying to convert "<_empty_>" to the
> real numeric type, which is considered an invalid conversion.
> 
> This commit fixes that kind of rollback issue by:
> - Not re-create any originally empty-value attributes when rolling
>   back DELETE CCBs.
> - Check for the hard-coded marker string "<_empty_>" and not add it
>   to an attribute descriptor when rolling back empty attributes that
>   got added with values by MODIFY CCBs in the upgrade.
> 
> This commit also fixes a few semantic errors in the code, and improve
> some log/trace printouts.
> ---
>  src/smf/smfd/SmfImmOperation.cc                        |  5 ++---
>  src/smf/smfd/SmfImmOperation.h                         |  3 ++-
>  src/smf/smfd/SmfRollback.cc                            |  2 +-
>  src/smf/smfd/imm_modify_config/add_operation_to_ccb.cc | 13
> ++++++++-----
>  src/smf/smfd/imm_modify_config/attribute.cc            | 10 +++++++---
>  src/smf/smfd/imm_modify_config/immccb.cc               |  6 +++---
>  6 files changed, 23 insertions(+), 16 deletions(-)
> 
> diff --git a/src/smf/smfd/SmfImmOperation.cc
> b/src/smf/smfd/SmfImmOperation.cc
> index a8e65c5..fc127fa 100644
> --- a/src/smf/smfd/SmfImmOperation.cc
> +++ b/src/smf/smfd/SmfImmOperation.cc
> @@ -275,9 +275,8 @@ SaAisErrorT
> SmfImmDeleteOperation::PrepareRollback(
> 
>      if (saveAttribute == true) {
>        if (attr->attrValuesNumber == 0) {
> -        o_rollbackData->addAttrValue(attr->attrName,
> -                                     
> smf_immTypeToString(attr->attrValueType),
> -                                     "<_empty_>");
> +        // No need to re-create originally empty attribute
> +        continue;
>        } else {
>          for (unsigned int j = 0; j < attr->attrValuesNumber; j++) {
>            o_rollbackData->addAttrValue(
> diff --git a/src/smf/smfd/SmfImmOperation.h
> b/src/smf/smfd/SmfImmOperation.h
> index fc855d4..bc91431 100644
> --- a/src/smf/smfd/SmfImmOperation.h
> +++ b/src/smf/smfd/SmfImmOperation.h
> @@ -49,7 +49,8 @@ class SmfImmAttribute {
>    // Note: More than one value can be added (multi-value)
>    void AddAttributeValue(const std::string& i_value) {
>      m_values.push_back(i_value);
> -    attribute_.AddValue(i_value);
> +    if (i_value.compare("<_empty_>") != 0)
> +      attribute_.AddValue(i_value);
>    }
> 
>    // Note: This is the legacy function that returns a list of strings. Is 
> kept
> diff --git a/src/smf/smfd/SmfRollback.cc b/src/smf/smfd/SmfRollback.cc
> index 5aedd62..299a1cb 100644
> --- a/src/smf/smfd/SmfRollback.cc
> +++ b/src/smf/smfd/SmfRollback.cc
> @@ -408,7 +408,7 @@ SaAisErrorT
> SmfRollbackData::rollbackModifyOperation(
>    SmfImmModifyOperation* immOp = new (std::nothrow)
> SmfImmModifyOperation();
>    if (immOp == NULL) {
>      LOG_ER(
> -        "SmfRollbackData::rollbackModifyOperation, could not create
> SmfImmCreateOperation");
> +        "SmfRollbackData::rollbackModifyOperation, could not create
> SmfImmModifyOperation");
>      return SA_AIS_ERR_FAILED_OPERATION;
>    }
> 
> diff --git a/src/smf/smfd/imm_modify_config/add_operation_to_ccb.cc
> b/src/smf/smfd/imm_modify_config/add_operation_to_ccb.cc
> index 44373cd..e9dea79 100644
> --- a/src/smf/smfd/imm_modify_config/add_operation_to_ccb.cc
> +++ b/src/smf/smfd/imm_modify_config/add_operation_to_ccb.cc
> @@ -284,12 +284,15 @@ int AddModifyToCcb(const SaImmCcbHandleT&
> ccb_handle,
>              ais_error_ = ais_rc;
>              break;
>            }
> +        } else {
> +            // Unrecoverable Fail
> +            LOG_NO("%s: AddObjectModifyToCcb() Fail, %s", __FUNCTION__,
> +                   saf_error(ais_rc));
> +            recovery_info = kFail;
> +            api_name_ = "saImmOmCcbObjectModify_2";
> +            ais_error_ = ais_rc;
> +            break;
>          }
> -      } else {
> -        // Unrecoverable Fail
> -        recovery_info = kFail;
> -        api_name_ = "saImmOmCcbObjectModify_2";
> -        ais_error_ = ais_rc;
>        }
> 
>        // Add Modify to CCB Success
> diff --git a/src/smf/smfd/imm_modify_config/attribute.cc
> b/src/smf/smfd/imm_modify_config/attribute.cc
> index 9329110..d31524f 100644
> --- a/src/smf/smfd/imm_modify_config/attribute.cc
> +++ b/src/smf/smfd/imm_modify_config/attribute.cc
> @@ -88,10 +88,10 @@ static bool StringToNumericValue(const std::string&
> str_value,
>        }
>      }
>    } catch(std::invalid_argument& e) {
> -    LOG_NO("%s: Invalid argument", __FUNCTION__);
> +    LOG_NO("%s Fail: Invalid argument", __FUNCTION__);
>      rc = false;
>    } catch(std::out_of_range& e) {
> -    LOG_NO("%s: Out of range", __FUNCTION__);
> +    LOG_NO("%s Fail: Out of range", __FUNCTION__);
>      rc = false;
>    }
> 
> @@ -140,6 +140,9 @@ bool
> AttributeHandler::AddAttributesForModification(const ModifyDescriptor&
>          rc = false;
>          break;
>      }
> +    // break out of the 'for' loop if a 'switch case' fails
> +    if (rc == false)
> +      break;
>    }
> 
>    TRACE_LEAVE();
> @@ -234,7 +237,8 @@ StoreNumericAttribute(const AttributeDescriptor&
> attribute, Request request) {
>      // Create a vector containing all values for this attribute
>      if (StringToNumericValue<T>
>          (value_str, numeric_value, value_type) == false) {
> -      LOG_NO("%s: StringToNumericValue() Fail", __FUNCTION__);
> +      LOG_NO("%s Fail: name=%s, value=%s", __FUNCTION__,
> +             attribute.attribute_name.c_str(), value_str.c_str());
>        rc = false;
>        break;
>      }
> diff --git a/src/smf/smfd/imm_modify_config/immccb.cc
> b/src/smf/smfd/imm_modify_config/immccb.cc
> index f945bdc..cc62911 100644
> --- a/src/smf/smfd/imm_modify_config/immccb.cc
> +++ b/src/smf/smfd/imm_modify_config/immccb.cc
> @@ -189,9 +189,9 @@ int ModelModification::CreateHandles() {
>    if (recovery_info == kContinue) {
>      recovery_info = CreateCcb();
>      if (recovery_info == kFail) {
> -      LOG_NO("%s: CreateAdminOwner() Fail", __FUNCTION__);
> +      LOG_NO("%s: CreateCcb() Fail", __FUNCTION__);
>      } else if (recovery_info == kRestartOm) {
> -      TRACE("%s: CreateAdminOwner() Restart", __FUNCTION__);
> +      TRACE("%s: CreateCcb() Restart", __FUNCTION__);
>      }
>    }
>    TRACE_LEAVE();
> @@ -692,4 +692,4 @@ int ModelModification::ApplyModifications() {
>    return recovery_info;
>  }
> 
> -}  // namespace modelmodify
> \ No newline at end of file
> +}  // namespace modelmodify
> --
> 2.7.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to