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-creating any originally empty-value attributes when rolling
back DELETE CCBs.
- Saving an actual empty string instead of the hard-coded "<_empty_>"
string for later rollback of empty attributes that are going to be
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 | 8 ++++----
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, 25 insertions(+), 17 deletions(-)
diff --git a/src/smf/smfd/SmfImmOperation.cc b/src/smf/smfd/SmfImmOperation.cc
index a8e65c5..d482870 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(
@@ -385,9 +384,10 @@ SaAisErrorT SmfImmModifyOperation::PrepareRollback(
while ((attr = attributes[i++]) != NULL) {
if (!strcmp((elem).m_name.c_str(), attr->attrName)) {
if (attr->attrValuesNumber == 0) {
+ // Save an empty string as rollback value for empty attribute
o_rollbackData->addAttrValue(attr->attrName,
smf_immTypeToString(attr->attrValueType),
- "<_empty_>");
+ "");
} 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..d14ea10 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.empty())
+ 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel