osaf/services/saf/immsv/immloadd/imm_loader.cc | 34 +++++++++--
osaf/services/saf/immsv/immloadd/imm_loader.hh | 10 ++-
osaf/services/saf/immsv/immloadd/imm_pbe_load.cc | 70 ++++++++++++++++++-----
3 files changed, 89 insertions(+), 25 deletions(-)
Failure in sqlite3 api will be considered as pbe file being corrupted.
For failure in IMM API, the error code will be checked to detect if pbe is
corrupted or not.
diff --git a/osaf/services/saf/immsv/immloadd/imm_loader.cc
b/osaf/services/saf/immsv/immloadd/imm_loader.cc
--- a/osaf/services/saf/immsv/immloadd/imm_loader.cc
+++ b/osaf/services/saf/immsv/immloadd/imm_loader.cc
@@ -482,7 +482,8 @@ bool createImmObject(SaImmClassNameT cla
char * objectName,
std::list<SaImmAttrValuesT_2> *attrValuesList,
SaImmCcbHandleT ccbHandle,
- std::map<std::string, SaImmAttrValuesT_2> *classRDNMap)
+ std::map<std::string, SaImmAttrValuesT_2> *classRDNMap,
+ bool* pbeCorrupted)
{
SaNameT parentName;
SaImmAttrValuesT_2** attrValues;
@@ -493,6 +494,7 @@ bool createImmObject(SaImmClassNameT cla
TRACE_ENTER2("CREATE IMM OBJECT %s, %s", className, objectName);
+ if (pbeCorrupted) *pbeCorrupted = true;
TRACE("attrValuesList size:%zu clasRDNMap size:%zu",
attrValuesList->size(),
classRDNMap?classRDNMap->size():0);
@@ -589,9 +591,19 @@ bool createImmObject(SaImmClassNameT cla
if (SA_AIS_OK != errorCode)
{
- LOG_ER("Failed to create object err: %d, class: %s, dn: '%s'. "
- "Check for duplicate attributes, or trace osafimmloadd",
- errorCode, className, objectName);
+ if (pbeCorrupted &&
+ ((errorCode != SA_AIS_ERR_INVALID_PARAM &&
+ errorCode != SA_AIS_ERR_BAD_OPERATION &&
+ errorCode != SA_AIS_ERR_NOT_EXIST &&
+ errorCode != SA_AIS_ERR_EXIST &&
+ errorCode != SA_AIS_ERR_FAILED_OPERATION &&
+ errorCode != SA_AIS_ERR_NAME_TOO_LONG) ||
+ (errorCode == SA_AIS_ERR_FAILED_OPERATION &&
!isValidationAborted(ccbHandle)))) {
+ *pbeCorrupted = false;
+ }
+ LOG_ER("Failed to create object err: %d, class: %s, dn: '%s'. "
+ "Check for duplicate attributes, or trace osafimmloadd",
+ errorCode, className, objectName);
rc = false;
goto freemem;
}
@@ -631,7 +643,8 @@ freemem:
bool createImmClass(SaImmHandleT immHandle,
const SaImmClassNameT className,
SaImmClassCategoryT classCategory,
- std::list<SaImmAttrDefinitionT_2>* attrDefinitions)
+ std::list<SaImmAttrDefinitionT_2>* attrDefinitions,
+ bool* pbeCorrupted)
{
SaImmAttrDefinitionT_2** attrDefinition;
SaAisErrorT errorCode = SA_AIS_OK;
@@ -640,6 +653,7 @@ bool createImmClass(SaImmHandleT immHand
TRACE_ENTER2("CREATING IMM CLASS %s", className);
+ if (pbeCorrupted) *pbeCorrupted = true;
/* Set the attrDefinition array */
attrDefinition = (SaImmAttrDefinitionT_2**)
calloc((attrDefinitions->size() + 1),
@@ -680,6 +694,11 @@ bool createImmClass(SaImmHandleT immHand
if (SA_AIS_OK != errorCode)
{
+ if (pbeCorrupted &&
+ errorCode != SA_AIS_ERR_INVALID_PARAM &&
+ errorCode != SA_AIS_ERR_EXIST) {
+ *pbeCorrupted = false;
+ }
LOG_ER("FAILED to create IMM class %s, err:%d", className, errorCode);
rc = false;
goto freemem;
@@ -2727,6 +2746,7 @@ int main(int argc, char* argv[])
const char* pbe_file = getenv("IMMSV_PBE_FILE");
const char* pbe_file_suffix = getenv("IMMSV_PBE_FILE_SUFFIX");
std::string pbeFile;
+ bool pbeCorrupted = false;
if(pbe_file) {pbeFile.append(pbe_file);}
if(pbe_file_suffix) {
pbeFile.append(pbe_file_suffix);
@@ -2821,13 +2841,13 @@ int main(int argc, char* argv[])
LOG_NO("***** Loading from PBE file %s at %s *****",
pbeFile.c_str(), argv[1]);
}
- if(!loadImmFromPbe(pbeHandle, preload)) {
+ if(!loadImmFromPbe(pbeHandle, preload, &pbeCorrupted)) {
LOG_ER("Load from PBE ending ABNORMALLY dir:%s file:%s",
argv[1], pbeFile.c_str());
/* Try to prevent cyclic restart. Escalation will only work if
xmldir is writable.
*/
- if(!preload) {/* Should perhaps escalate also if preload or return
<0, 0, 0>*/
+ if(!preload && pbeCorrupted) {/* Should perhaps escalate also if
preload or return <0, 0, 0>*/
escalatePbe(xmldir, pbeFile.c_str());
}
goto err;
diff --git a/osaf/services/saf/immsv/immloadd/imm_loader.hh
b/osaf/services/saf/immsv/immloadd/imm_loader.hh
--- a/osaf/services/saf/immsv/immloadd/imm_loader.hh
+++ b/osaf/services/saf/immsv/immloadd/imm_loader.hh
@@ -58,20 +58,24 @@ void addObjectAttributeDefinition(SaImmC
bool createImmClass(SaImmHandleT immHandle,
const SaImmClassNameT className,
SaImmClassCategoryT classCategory,
- std::list<SaImmAttrDefinitionT_2>* attrDefinitions);
+ std::list<SaImmAttrDefinitionT_2>* attrDefinitions,
+ bool* pbeCorrupted = NULL);
bool createImmObject(SaImmClassNameT className,
char * objectName,
std::list<SaImmAttrValuesT_2> *attrValuesList,
SaImmCcbHandleT ccbHandle,
- std::map<std::string, SaImmAttrValuesT_2> *classRDNMap);
+ std::map<std::string, SaImmAttrValuesT_2> *classRDNMap,
+ bool* pbeCorrupted = NULL);
void escalatePbe(std::string dir, std::string file);
+bool isValidationAborted(SaImmCcbHandleT ccbHandle);
+
void* checkPbeRepositoryInit(std::string dir, std::string file);
-int loadImmFromPbe(void* pbeHandle, bool preload);
+int loadImmFromPbe(void* pbeHandle, bool preload, bool* pbeCorrupted);
void sendPreloadParams(SaImmHandleT immHandle, SaImmAdminOwnerHandleT
ownerHandle,
SaUint32T epoch, SaUint32T maxCcbId, SaUint32T maxCommitTime,
diff --git a/osaf/services/saf/immsv/immloadd/imm_pbe_load.cc
b/osaf/services/saf/immsv/immloadd/imm_pbe_load.cc
--- a/osaf/services/saf/immsv/immloadd/imm_pbe_load.cc
+++ b/osaf/services/saf/immsv/immloadd/imm_pbe_load.cc
@@ -211,7 +211,8 @@ bool loadClassFromPbe(void* pbeHandle,
const char* className,
const char* class_id,
SaImmClassCategoryT classCategory,
- ClassInfo* class_info)
+ ClassInfo* class_info,
+ bool* pbeCorrupted)
{
sqlite3* dbHandle = (sqlite3 *) pbeHandle;
sqlite3_stmt *stmt;
@@ -224,6 +225,7 @@ bool loadClassFromPbe(void* pbeHandle,
std::list<SaImmAttrDefinitionT_2>::iterator it;
TRACE_ENTER2("Loading class %s from PBE", className);
+ *pbeCorrupted = true;
stmt = preparedStmt[SQL_SEL_ATTR_DEF];
rc = sqlite3_bind_int(stmt, 1, atoi(class_id));
if(rc != SQLITE_OK) {
@@ -347,7 +349,7 @@ bool loadClassFromPbe(void* pbeHandle,
rc = sqlite3_step(stmt);
}
- if (!createImmClass(immHandle, (char *) className, classCategory,
&attrDefs)) {
+ if (!createImmClass(immHandle, (char *) className, classCategory,
&attrDefs, pbeCorrupted)) {
LOG_ER("Failed to create IMM class");
goto bailout;
}
@@ -365,7 +367,7 @@ bailout:
return false;
}
-bool loadClassesFromPbe(void* pbeHandle, SaImmHandleT immHandle, ClassInfoMap*
classInfoMap)
+bool loadClassesFromPbe(void* pbeHandle, SaImmHandleT immHandle, ClassInfoMap*
classInfoMap, bool* pbeCorrupted)
{
sqlite3* dbHandle = (sqlite3 *) pbeHandle;
const char * sql = "select * from classes";
@@ -377,6 +379,7 @@ bool loadClassesFromPbe(void* pbeHandle,
int r,c;
TRACE_ENTER();
assert(dbHandle);
+ *pbeCorrupted = true;
rc = sqlite3_get_table(dbHandle, sql, &result, &nrows, &ncols, &zErr);
if(rc) {
@@ -411,7 +414,7 @@ bool loadClassesFromPbe(void* pbeHandle,
class_info->className = std::string(class_name);
class_info->class_category = class_category;
if(!loadClassFromPbe(pbeHandle, immHandle, class_name,
- class_id, class_category, class_info))
+ class_id, class_category, class_info, pbeCorrupted))
{
sqlite3_free_table(result);
goto bailout;
@@ -431,7 +434,7 @@ bool loadClassesFromPbe(void* pbeHandle,
}
bool loadObjectFromPbe(void* pbeHandle, SaImmHandleT immHandle,
SaImmCcbHandleT ccbHandle,
- const char* object_id, ClassInfo* class_info, const char* dn)
+ const char* object_id, ClassInfo* class_info, const char* dn, bool*
pbeCorrupted)
{
sqlite3* dbHandle = (sqlite3 *) pbeHandle;
sqlite3_stmt *stmt = NULL;
@@ -449,6 +452,7 @@ bool loadObjectFromPbe(void* pbeHandle,
object_id, dn, class_info->className.c_str(),
class_info->attrInfoVector.size());
+ *pbeCorrupted = true;
/* First take care of the base tuple (single valued attributes). */
it = class_info->attrInfoVector.begin();
while(it != class_info->attrInfoVector.end()) {
@@ -665,7 +669,7 @@ bool loadObjectFromPbe(void* pbeHandle,
if(!createImmObject((char *) class_info->className.c_str(), (char *)
dn,
- &attrValuesList, ccbHandle, NULL))
+ &attrValuesList, ccbHandle, NULL, pbeCorrupted))
{
LOG_NO("Failed to create object - exiting");
goto bailout;
@@ -681,7 +685,7 @@ bailout:
}
bool loadObjectsFromPbe(void* pbeHandle, SaImmHandleT immHandle,
- SaImmCcbHandleT ccbHandle, ClassInfoMap *classInfoMap)
+ SaImmCcbHandleT ccbHandle, ClassInfoMap *classInfoMap, bool*
pbeCorrupted)
{
sqlite3* dbHandle = (sqlite3 *) pbeHandle;
const char * sql = "select * from objects";
@@ -693,6 +697,7 @@ bool loadObjectsFromPbe(void* pbeHandle,
int r,c;
TRACE_ENTER();
assert(dbHandle);
+ *pbeCorrupted = true;
rc = sqlite3_get_table(dbHandle, sql, &result, &nrows, &ncols, &zErr);
if(rc) {
@@ -727,7 +732,7 @@ bool loadObjectsFromPbe(void* pbeHandle,
class_info = (*classInfoMap)[std::string(class_id)];
if(!loadObjectFromPbe(pbeHandle, immHandle, ccbHandle,
object_id,
- class_info, dn)) {
+ class_info, dn, pbeCorrupted)) {
sqlite3_free_table(result);
goto bailout;
}
@@ -743,7 +748,7 @@ bool loadObjectsFromPbe(void* pbeHandle,
}
-int loadImmFromPbe(void* pbeHandle, bool preload)
+int loadImmFromPbe(void* pbeHandle, bool preload, bool* pbeCorrupted)
{
SaVersionT version = {'A', 2, 16};
SaImmHandleT immHandle=0LL;
@@ -759,6 +764,7 @@ int loadImmFromPbe(void* pbeHandle, bool
unsigned int retries=0;
TRACE_ENTER();
assert(dbHandle);
+ *pbeCorrupted = true;
do {
rc = sqlite3_exec(dbHandle, beginT, NULL, NULL, &execErr);
@@ -784,14 +790,15 @@ int loadImmFromPbe(void* pbeHandle, bool
The "other user" is likely to be a lingering PBE (on the
other SC) or a lingering POSIX
file lock in an NFS client cache.
*/
+ *pbeCorrupted = false;
sqlite3_close(dbHandle);
- exit(1);
}
errorCode = saImmOmInitialize(&immHandle, NULL, &version);
if (SA_AIS_OK != errorCode) {
LOG_ER("Failed to initialize the IMM OM interface (%d)",
errorCode);
+ *pbeCorrupted = false;
goto bailout;
}
@@ -799,7 +806,8 @@ int loadImmFromPbe(void* pbeHandle, bool
SA_FALSE, &ownerHandle);
if (errorCode != SA_AIS_OK) {
LOG_ER("Failed on saImmOmAdminOwnerInitialize %d", errorCode);
- exit(1);
+ *pbeCorrupted = false;
+ goto bailout;
}
if(preload) { /* Break out this into a separate function. */
@@ -959,7 +967,7 @@ int loadImmFromPbe(void* pbeHandle, bool
}
/*Fetch classes from PBE and create in IMM */
- if(!loadClassesFromPbe(pbeHandle, immHandle, &classInfoMap)) {
+ if(!loadClassesFromPbe(pbeHandle, immHandle, &classInfoMap,
pbeCorrupted)) {
goto bailout;
}
@@ -967,10 +975,11 @@ int loadImmFromPbe(void* pbeHandle, bool
errorCode = saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle);
if (errorCode != SA_AIS_OK) {
LOG_ER("Failed to initialize ImmOmCcb %d", errorCode);
- exit(1);
+ *pbeCorrupted = false;
+ goto bailout;
}
- if(!loadObjectsFromPbe(pbeHandle, immHandle, ccbHandle, &classInfoMap))
+ if(!loadObjectsFromPbe(pbeHandle, immHandle, ccbHandle, &classInfoMap,
pbeCorrupted))
{
goto bailout;
}
@@ -987,7 +996,13 @@ int loadImmFromPbe(void* pbeHandle, bool
errorCode = saImmOmCcbApply(ccbHandle);
if (errorCode != SA_AIS_OK) {
LOG_ER("Failed to APPLY ImmOmCcb %d", errorCode);
- exit(1);
+ if ((errorCode != SA_AIS_ERR_INVALID_PARAM &&
+ errorCode != SA_AIS_ERR_BAD_OPERATION &&
+ errorCode != SA_AIS_ERR_FAILED_OPERATION) ||
+ (errorCode == SA_AIS_ERR_FAILED_OPERATION &&
!isValidationAborted(ccbHandle))) {
+ *pbeCorrupted = false;
+ }
+ goto bailout;
}
TRACE_2("Successfully Applied the CCB ");
@@ -1011,6 +1026,9 @@ int loadImmFromPbe(void* pbeHandle, bool
} while((errorCode == SA_AIS_ERR_TRY_AGAIN) && (retryCount <
32));
if((errorCode != SA_AIS_OK) &&
(errorCode!=SA_AIS_ERR_NOT_EXIST)) {
+ if (errorCode != SA_AIS_ERR_BUSY) {
+ *pbeCorrupted = false;
+ }
LOG_ER("Delete of class %s FAILED with errorCode:%u",
(char *) OPENSAF_IMM_PBE_RT_CLASS_NAME,
errorCode);
goto bailout;
@@ -1025,6 +1043,7 @@ int loadImmFromPbe(void* pbeHandle, bool
if(!opensafPbeRtClassCreate(immHandle)) {
/* Error already logged. */
+ *pbeCorrupted = false; /* definition of this class is not from
pbe */
goto bailout;
}
@@ -1090,3 +1109,24 @@ void escalatePbe(std::string dir, std::s
itself generate any new journal file.
*/
}
+
+bool isValidationAborted(SaImmCcbHandleT ccbHandle) {
+ SaStringT *errorStrings = NULL;
+ SaAisErrorT errorCode = SA_AIS_OK;
+
+ errorCode = saImmOmCcbGetErrorStrings(ccbHandle, (const SaStringT **)
&errorStrings);
+
+ if (errorCode != SA_AIS_OK) {
+ return false; /* Assuming that this is a resource abort */
+ }
+
+ while (*errorStrings) {
+ TRACE("ErrorStrings: %s", *errorStrings);
+ if (!strncmp((const char *) *errorStrings, "IMM: Validation
abort: ", strlen("IMM: Validation abort: "))) {
+ return true;
+ }
+ errorStrings++;
+ }
+
+ return false;
+}
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel