Re: [devel] [PATCH 1/1] mds: Send NCSMDS_DOWN with vdest if there is no any adest [#2941]

2018-11-02 Thread Hans Nordebäck
Hi Minh,

ack, code review and mdstest run. One minor comment below. /Thanks HansN

On 10/25/18 04:40, Minh Chau wrote:
> If split brain happens and network merges back, at this point in time
> there are a few mds events coming to payloads, which are the SVC UP
> from the other controller; SVC down from services in both controllers
> due to reboot from split brain detection.
> In the ticket description, the first partition includes SC1, PL3,
> the second partition includes SC2, PL4, PL5. The amfnd on PL3 is
> missing NCSMDS_DOWN with vdest in the below scenario:
>
> - SVC up event from the other amfd (on SC2)
> - SVC down event from amfd (SC1), it's the same active adest from
> mds-PL3's view, start await_active timer, but no NCSMDS_DOWN with
> vdest is sent because the adest on SC2 exists.
> - SVC down event from amfd (SC2), it's different active adest.
>
> Because the payloads reside in different partitions so they don't
> have the same active adest view at mds level. When both SCs go down
> due to split brain detection, the same SVC down events occur and
> comes to all payloads, but they have different view so they behave
> differently to the payloads in the other partition.
>
> The patch adds an additional condition to send NCSMDS_DOWN if there is
> no actual adest existed
> ---
>   src/mds/mds_c_api.c | 80 
> ++---
>   1 file changed, 46 insertions(+), 34 deletions(-)
>
> diff --git a/src/mds/mds_c_api.c b/src/mds/mds_c_api.c
> index f5ba318..73849cc 100644
> --- a/src/mds/mds_c_api.c
> +++ b/src/mds/mds_c_api.c
> @@ -3644,13 +3644,58 @@ uint32_t mds_mcm_svc_down(PW_ENV_ID pwe_id, 
> MDS_SVC_ID svc_id, V_DEST_RL role,
>   local_svc_hdl, svc_id, vdest_id,
>   _adest, _running,
>   _result_info, true);
> -
[HansN] is this log message informative/needed?
> + m_MDS_LOG_INFO("MCM:API: svc_down: "
> +   "active_adest:%lu", active_adest);
>   /* First delete the entry */
>   mds_subtn_res_tbl_del(
>   local_svc_hdl, svc_id, vdest_id, adest,
>   vdest_policy, svc_sub_part_ver,
>   archword_type);
>   
> + MDS_SUBSCRIPTION_RESULTS_INFO *s_info = NULL;
> + bool adest_exists = false;
> +
> + /* if no adest remains for this svc
> +  * send MDS_DOWN
> +  */
> + status = mds_subtn_res_tbl_getnext_any(
> + local_svc_hdl, svc_id,
> + _info);
> +
> + while (status != NCSCC_RC_FAILURE) {
> + if (s_info->key.vdest_id !=
> + m_VDEST_ID_FOR_ADEST_ENTRY) {
> + adest_exists = true;
> + break;
> + }
> +
> + status = mds_subtn_res_tbl_getnext_any(
> + local_svc_hdl, svc_id, _info);
> + }
> +
> + if (active_adest != adest
> +   && vdest_policy == NCS_VDEST_TYPE_MxN
> + && adest_exists == false) {
> + m_MDS_LOG_INFO("MCM:API: svc_down : "
> + "svc_id = %s(%d) on DEST id = 
> %d "
> + "got NO_ACTIVE for svc_id = 
> %s(%d) "
> +"on Vdest id = %d Adest = %s, rem_svc_pvt_ver=%d",
> + get_svc_names(
> + 
> m_MDS_GET_SVC_ID_FROM_SVC_HDL(local_svc_hdl)),
> + m_MDS_GET_SVC_ID_FROM_SVC_HDL(
> + local_svc_hdl),
> + m_MDS_GET_VDEST_ID_FROM_SVC_HDL(
> + local_svc_hdl),
> + get_svc_names(svc_id), svc_id,
> + vdest_id,
> + 
> log_subtn_result_info->sub_adest_details,
> + svc_sub_part_ver);
> + status = mds_mcm_user_event_callback(
> +   local_svc_hdl, pwe_id, svc_id,
> +   role, vdest_id, 0, NCSMDS_DOWN,
> + 

Re: [devel] [PATCH 1/1] imm: fix coredump generated during roaming test [#2943]

2018-11-02 Thread Lennart Lund
Hi Vu,

Ack.

Note1: Not tested.
Note2: This function is doing too much and its dependencies is very
hard to understand so I cannot confirm that this will solve the problem
or add any new problems within the time I can use  on this review.

Thanks
Lennart


On tis, 2018-10-23 at 11:31 +0700, Vu Minh Nguyen wrote:
> The fix of ticket [#2934] was not covered the roaming SC case.
> With roaming, IMMND veteran could run on system controller node type.
> 
> Instead of going to accept_node directly in previous fix, it should
> go to
> update_node_type.
> ---
>  src/imm/immd/immd_evt.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/src/imm/immd/immd_evt.c b/src/imm/immd/immd_evt.c
> index 9cd82da64..a0f632b7e 100644
> --- a/src/imm/immd/immd_evt.c
> +++ b/src/imm/immd/immd_evt.c
> @@ -1814,7 +1814,7 @@ static uint32_t
> immd_evt_proc_immnd_intro(IMMD_CB *cb, IMMD_EVT *evt,
>      cb->ccb_id_count,
> msg->ccb_id_count,
>      cb->impl_count, msg-
> >impl_count);
>   }
> - goto accept_node;
> + goto update_node_type;
>   }
>  
>   if (cb->fevsSendCount < evt-
> >info.ctrl_msg.fevs_count) {
> @@ -1887,6 +1887,7 @@ static uint32_t
> immd_evt_proc_immnd_intro(IMMD_CB *cb, IMMD_EVT *evt,
>   }
>   }
>  
> +update_node_type:
>   /* Determine type of node. */
>   if (sinfo->dest == cb->loc_immnd_dest) {
>   node_info->isOnController = true;
___
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel


Re: [devel] [PATCH 1/1] amfd: reset snd_msg_id in LostFound state [#2952]

2018-11-02 Thread Hans Nordebäck
Ack, review only/Thanks HansN

Från: Gary Lee 
Skickat: den 2 november 2018 06:23:09
Till: nagendra @ hasolutions . in; Minh Hon Chau; Hans Nordebäck
Kopia: opensaf-devel@lists.sourceforge.net; Gary Lee
Ämne: [PATCH 1/1] amfd: reset snd_msg_id in LostFound state [#2952]

If a PL rejoins the main network partition before the node failover timer 
expires,
it is told to reboot by AMFD. AMFND thinks it has become headless and
resets rcv_msg_id to 0, and shows this when it receives the reboot msg from 
AMFD:

Rebooting OpenSAF NodeId = 0 EE Name = No EE Mapped, Reason: Message ID 
mismatch, rec xx, expected 1, OwnNodeId = xx, SupervisionTime = 60

We can avoid this by resetting snd_msg_id for this PL in AMFD in state 
LostFound,
before the reboot msg is sent.
---
 src/amf/amfd/node_state.cc | 5 +
 1 file changed, 5 insertions(+)

diff --git a/src/amf/amfd/node_state.cc b/src/amf/amfd/node_state.cc
index a8659dcf7..787ddab94 100644
--- a/src/amf/amfd/node_state.cc
+++ b/src/amf/amfd/node_state.cc
@@ -126,6 +126,11 @@ void LostFound::TimerExpired() {
   node->node_name.c_str());

   if (fsm_->Active() == true) {
+// amfnd thinks it's been headless and resets its rcv_msg_id to 0,
+// also do the same here to avoid 'Message ID mismatch' errors
+// at amfnd
+node->snd_msg_id = 0;
+
 LOG_WA("Sending node reboot order");
 avd_d2n_reboot_snd(node);

--
2.17.1


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


[devel] [PATCH 0/3] Review Request for imm: add new test cases of apitest [#2951]

2018-11-02 Thread Mohan Kanakam
Summary: imm: add new test cases of API saImmOmClassCreate_2() of apitest 
[#2951]
Review request for Ticket(s): 2951_1
Peer Reviewer(s):vu.m.nguyen, Hans Nordeb??ck 
Pull request to: *** LIST THE PERSON WITH PUSH ACCESS HERE ***
Affected branch(es): develop
Development branch: ticket-2951_1
Base revision: 39928c976dfce75f69892f717df3ea128ef835aa
Personal repository: git://git.code.sf.net/u/mohan-hasoln/review


Impacted area   Impact y/n

 Docsn
 Build systemn
 RPM/packaging   n
 Configuration files n
 Startup scripts n
 SAF servicesn
 OpenSAF servicesn
 Core libraries  n
 Samples n
 Tests   y
 Other   n

NOTE: Patch(es) contain lines longer than 80 characers

Comments (indicate scope for each "y" above):
-
*** EXPLAIN/COMMENT THE PATCH SERIES HERE ***

revision e758cddffa03f863a6d17d9b407d3bc28a2763c1
Author: Mohan Kanakam 
Date:   Fri, 2 Nov 2018 12:25:49 +0530

imm: add new test case of API saImmOmClassDelete() of apitest [#2951]



revision 6602336dcfeabaa66ef06c223aa9fe9d6c19b55e
Author: Mohan Kanakam 
Date:   Fri, 2 Nov 2018 12:15:52 +0530

imm: add new test case of API saImmOmClassDescriptionGet_2() of apitest [#2951]



revision daf9d096912e822044cbe82a65704ebed4fe8afc
Author: Mohan Kanakam 
Date:   Fri, 2 Nov 2018 12:03:23 +0530

imm: add new test cases of API saImmOmClassCreate_2() of apitest [#2951]



Complete diffstat:
--
 .../apitest/management/test_saImmOmClassCreate_2.c | 92 ++
 .../apitest/management/test_saImmOmClassDelete.c   | 19 +
 .../management/test_saImmOmClassDescriptionGet_2.c | 25 ++
 3 files changed, 136 insertions(+)


Testing Commands:
-
./immomtest 2

Testing, Expected Results:
--
19  PASSED   saImmOmClassCreate_2 - SA_AIS_ERR_BAD_HANDLE CONFIG CLASS
20  PASSED   saImmOmClassCreate_2 - SA_AIS_ERR_BAD_HANDLE CONFIG CLASS 
UNINITLIZED HANDLE
21  PASSED   saImmOmClassCreate_2 - SA_AIS_ERR_BAD_HANDLE RUNTIME CLASS 
UNINTILIZED HANDLE
22  PASSED   saImmOmClassCreate_2 - SA_AIS_ERR_BAD_HANDLE CONFIG CLASS 
FINALIZED HANDLE
23  PASSED   saImmOmClassCreate_2 - SA_AIS_ERR_BAD_HANDLE RUNTIME CLASS 
FINALLIZED HANDLE
31  PASSED   saImmOmClassDescriptionGet_2 - SA_AIS_ERR_INVALID_PARAM
39  PASSED   saImmOmClassDelete_2 - SA_AIS_ERR_NOT_EXIST

Conditions of Submission:
-
Ack from maintainers

Arch  Built StartedLinux distro
---
mipsn  n
mips64  n  n
x86 n  n
x86_64  y  y
powerpc n  n
powerpc64   n  n


Reviewer Checklist:
---
[Submitters: make sure that your review doesn't trigger any checkmarks!]


Your checkin has not passed review because (see checked entries):

___ Your RR template is generally incomplete; it has too many blank entries
that need proper data filled in.

___ You have failed to nominate the proper persons for review and push.

___ Your patches do not have proper short+long header

___ You have grammar/spelling in your header that is unacceptable.

___ You have exceeded a sensible line length in your headers/comments/text.

___ You have failed to put in a proper Trac Ticket # into your commits.

___ You have incorrectly put/left internal data in your comments/files
(i.e. internal bug tracking tool IDs, product names etc)

___ You have not given any evidence of testing beyond basic build tests.
Demonstrate some level of runtime or other sanity testing.

___ You have ^M present in some of your files. These have to be removed.

___ You have needlessly changed whitespace or added whitespace crimes
like trailing spaces, or spaces before tabs.

___ You have mixed real technical changes with whitespace and other
cosmetic code cleanup changes. These have to be separate commits.

___ You need to refactor your submission into logical chunks; there is
too much content into a single commit.

___ You have extraneous garbage in your review (merge commits etc)

___ You have giant attachments which should never have been sent;
Instead you should place your content in a public tree to be pulled.

___ You have too many commits attached to an e-mail; resend as threaded
commits, or place in a public tree for a pull.

___ You have resent this content multiple times without a clear indication
of what has changed between each re-send.

___ You have failed to adequately and individually address all of the
comments and change requests that were proposed in the initial review.

___ You have a misconfigured ~/.gitconfig file (i.e. user.name, user.email etc)

___ Your computer have a badly configured date and time; confusing the
the threaded patch review.

___ Your 

[devel] [PATCH 3/3] imm: add new test case of API saImmOmClassDelete() of apitest [#2951]

2018-11-02 Thread Mohan Kanakam
---
 .../apitest/management/test_saImmOmClassCreate_2.c|  4 
 src/imm/apitest/management/test_saImmOmClassDelete.c  | 19 +++
 2 files changed, 23 insertions(+)

diff --git a/src/imm/apitest/management/test_saImmOmClassCreate_2.c 
b/src/imm/apitest/management/test_saImmOmClassCreate_2.c
index ea4db45..d8810e9 100644
--- a/src/imm/apitest/management/test_saImmOmClassCreate_2.c
+++ b/src/imm/apitest/management/test_saImmOmClassCreate_2.c
@@ -1517,6 +1517,7 @@ extern void saImmOmClassDelete_2_01(void);
 extern void saImmOmClassDelete_2_02(void);
 extern void saImmOmClassDelete_2_03(void);
 extern void saImmOmClassDelete_2_04(void);
+extern void saImmOmClassDelete_2_05(void);
 
 __attribute__((constructor)) static void saImmOmInitialize_constructor(void)
 {
@@ -1627,6 +1628,9 @@ __attribute__((constructor)) static void 
saImmOmInitialize_constructor(void)
test_case_add(
2, saImmOmClassDelete_2_04,
"saImmOmClassDelete_2  - SA_AIS_ERR_INVALID_PARAM, Empty 
classname");
+   test_case_add(
+   2, saImmOmClassDelete_2_05,
+   "saImmOmClassDelete_2 - SA_AIS_ERR_NOT_EXIST ");
 
test_case_add(
2, saImmOmClassCreate_SchemaChange_2_01,
diff --git a/src/imm/apitest/management/test_saImmOmClassDelete.c 
b/src/imm/apitest/management/test_saImmOmClassDelete.c
index 273d192..ad36b8f 100644
--- a/src/imm/apitest/management/test_saImmOmClassDelete.c
+++ b/src/imm/apitest/management/test_saImmOmClassDelete.c
@@ -76,3 +76,22 @@ void saImmOmClassDelete_2_04(void)
test_validate(rc, SA_AIS_ERR_INVALID_PARAM);
safassert(immutil_saImmOmFinalize(immOmHandle), SA_AIS_OK);
 }
+
+void saImmOmClassDelete_2_05(void)
+{
+   const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+   SaImmAttrDefinitionT_2 attr1 = {"rdn", SA_IMM_ATTR_SANAMET,
+   SA_IMM_ATTR_CONFIG | SA_IMM_ATTR_RDN,
+   NULL};
+   const SaImmAttrDefinitionT_2 *attrDefinitions[] = {, NULL};
+
+   safassert(immutil_saImmOmInitialize(, , 
),
+   SA_AIS_OK);
+   safassert(immutil_saImmOmClassCreate_2(immOmHandle, className,
+  SA_IMM_CLASS_CONFIG, attrDefinitions),
+ SA_AIS_OK);
+   immutil_saImmOmClassDelete(immOmHandle, className);
+   rc = immutil_saImmOmClassDelete(immOmHandle, className);
+   test_validate(rc, SA_AIS_ERR_NOT_EXIST);
+   safassert(immutil_saImmOmFinalize(immOmHandle), SA_AIS_OK);
+}
-- 
2.7.4



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


[devel] [PATCH 2/3] imm: add new test case of API saImmOmClassDescriptionGet_2() of apitest [#2951]

2018-11-02 Thread Mohan Kanakam
---
 .../apitest/management/test_saImmOmClassCreate_2.c |  3 +++
 .../management/test_saImmOmClassDescriptionGet_2.c | 25 ++
 2 files changed, 28 insertions(+)

diff --git a/src/imm/apitest/management/test_saImmOmClassCreate_2.c 
b/src/imm/apitest/management/test_saImmOmClassCreate_2.c
index 9afbbe7..ea4db45 100644
--- a/src/imm/apitest/management/test_saImmOmClassCreate_2.c
+++ b/src/imm/apitest/management/test_saImmOmClassCreate_2.c
@@ -1509,6 +1509,7 @@ extern void saImmOmClassDescriptionGet_2_02(void);
 extern void saImmOmClassDescriptionGet_2_03(void);
 extern void saImmOmClassDescriptionGet_2_04(void);
 extern void saImmOmClassDescriptionGet_2_05(void);
+extern void saImmOmClassDescriptionGet_2_06(void);
 extern void saImmOmClassDescriptionMemoryFree_2_01(void);
 extern void saImmOmClassDescriptionMemoryFree_2_02(void);
 
@@ -1604,6 +1605,8 @@ __attribute__((constructor)) static void 
saImmOmInitialize_constructor(void)
test_case_add(
2, saImmOmClassDescriptionGet_2_05,
"saImmOmClassDescriptionGet_2 - SA_AIS_OK, Fetch includes 
SA_IMM_ATTR_NO_DANGLING");
+   test_case_add(2, saImmOmClassDescriptionGet_2_06,
+ "saImmOmClassDescriptionGet_2 - 
SA_AIS_ERR_INVALID_PARAM");
 
test_case_add(2, saImmOmClassDescriptionMemoryFree_2_01,
  "saImmOmClassDescriptionMemoryFree_2 - SA_AIS_OK");
diff --git a/src/imm/apitest/management/test_saImmOmClassDescriptionGet_2.c 
b/src/imm/apitest/management/test_saImmOmClassDescriptionGet_2.c
index ecf7ceb..bada265 100644
--- a/src/imm/apitest/management/test_saImmOmClassDescriptionGet_2.c
+++ b/src/imm/apitest/management/test_saImmOmClassDescriptionGet_2.c
@@ -175,3 +175,28 @@ void saImmOmClassDescriptionGet_2_05(void)
safassert(immutil_saImmOmClassDelete(immOmHandle, className), 
SA_AIS_OK);
safassert(immutil_saImmOmFinalize(immOmHandle), SA_AIS_OK);
 }
+
+void saImmOmClassDescriptionGet_2_06(void)
+{
+   const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+   SaImmAttrDefinitionT_2 attr1 = {
+   "rdn", SA_IMM_ATTR_SANAMET,
+   SA_IMM_ATTR_RUNTIME | SA_IMM_ATTR_RDN | SA_IMM_ATTR_CACHED, NULL};
+   const SaImmAttrDefinitionT_2 *attrDefinitionsIn[] = {, NULL};
+   SaImmClassCategoryT classCategory;
+   SaImmAttrDefinitionT_2 **attrDefinitionsOut;
+
+   safassert(immutil_saImmOmInitialize(, , 
),
+ SA_AIS_OK);
+   safassert(immutil_saImmOmClassCreate_2(immOmHandle, className,
+  SA_IMM_CLASS_RUNTIME, attrDefinitionsIn),
+ SA_AIS_OK);
+   rc = immutil_saImmOmClassDescriptionGet_2(immOmHandle, NULL,
+ , );
+   test_validate(rc, SA_AIS_ERR_INVALID_PARAM);
+   safassert(immutil_saImmOmClassDescriptionMemoryFree_2(immOmHandle,
+ attrDefinitionsOut),
+ SA_AIS_OK);
+   safassert(immutil_saImmOmClassDelete(immOmHandle, className), 
SA_AIS_OK);
+   safassert(immutil_saImmOmFinalize(immOmHandle), SA_AIS_OK);
+}
-- 
2.7.4



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


[devel] [PATCH 1/3] imm: add new test cases of API saImmOmClassCreate_2() of apitest [#2951]

2018-11-02 Thread Mohan Kanakam
---
 .../apitest/management/test_saImmOmClassCreate_2.c | 85 ++
 1 file changed, 85 insertions(+)

diff --git a/src/imm/apitest/management/test_saImmOmClassCreate_2.c 
b/src/imm/apitest/management/test_saImmOmClassCreate_2.c
index 4f25f8b..9afbbe7 100644
--- a/src/imm/apitest/management/test_saImmOmClassCreate_2.c
+++ b/src/imm/apitest/management/test_saImmOmClassCreate_2.c
@@ -426,6 +426,80 @@ void saImmOmClassCreate_2_19(void)
safassert(immutil_saImmOmFinalize(immOmHandle), SA_AIS_OK);
 }
 
+void saImmOmClassCreate_2_20(void)
+{
+   const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+   SaImmAttrDefinitionT_2 attr1 = {"rdn", SA_IMM_ATTR_SANAMET,
+   SA_IMM_ATTR_CONFIG | SA_IMM_ATTR_RDN,
+   NULL};
+   const SaImmAttrDefinitionT_2 *attrDefinitions[] = {, NULL};
+
+   safassert(immutil_saImmOmInitialize(, , 
),
+ SA_AIS_OK);
+   rc = immutil_saImmOmClassCreate_2(-1, className, SA_IMM_CLASS_CONFIG,
+ attrDefinitions);
+   test_validate(rc, SA_AIS_ERR_BAD_HANDLE);
+   safassert(immutil_saImmOmFinalize(immOmHandle), SA_AIS_OK);
+}
+
+void saImmOmClassCreate_2_21(void)
+{
+   const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+   SaImmAttrDefinitionT_2 attr1 = {"rdn", SA_IMM_ATTR_SANAMET,
+   SA_IMM_ATTR_CONFIG | SA_IMM_ATTR_RDN,
+   NULL};
+   const SaImmAttrDefinitionT_2 *attrDefinitions[] = {, NULL};
+
+   rc = immutil_saImmOmClassCreate_2(immOmHandle, className, 
SA_IMM_CLASS_CONFIG,
+ attrDefinitions);
+   test_validate(rc, SA_AIS_ERR_BAD_HANDLE);
+}
+
+void saImmOmClassCreate_2_22(void)
+{
+   const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+   SaImmAttrDefinitionT_2 attr1 = {
+   "rdn", SA_IMM_ATTR_SANAMET,
+   SA_IMM_ATTR_RUNTIME | SA_IMM_ATTR_RDN | SA_IMM_ATTR_CACHED, NULL};
+   const SaImmAttrDefinitionT_2 *attrDefinitions[] = {, NULL};
+
+   rc = immutil_saImmOmClassCreate_2(immOmHandle, className, 
SA_IMM_CLASS_RUNTIME,
+ attrDefinitions);
+   test_validate(rc, SA_AIS_ERR_BAD_HANDLE);
+}
+
+void saImmOmClassCreate_2_23(void)
+{
+   const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+   SaImmAttrDefinitionT_2 attr1 = {"rdn", SA_IMM_ATTR_SANAMET,
+   SA_IMM_ATTR_CONFIG | SA_IMM_ATTR_RDN,
+   NULL};
+   const SaImmAttrDefinitionT_2 *attrDefinitions[] = {, NULL};
+
+   safassert(immutil_saImmOmInitialize(, , 
),
+ SA_AIS_OK);
+   immutil_saImmOmFinalize(immOmHandle);
+   rc = immutil_saImmOmClassCreate_2(immOmHandle, className, 
SA_IMM_CLASS_CONFIG,
+ attrDefinitions);
+   test_validate(rc, SA_AIS_ERR_BAD_HANDLE);
+}
+
+void saImmOmClassCreate_2_24(void)
+{
+   const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+   SaImmAttrDefinitionT_2 attr1 = {
+   "rdn", SA_IMM_ATTR_SANAMET,
+   SA_IMM_ATTR_RUNTIME | SA_IMM_ATTR_RDN | SA_IMM_ATTR_CACHED, NULL};
+   const SaImmAttrDefinitionT_2 *attrDefinitions[] = {, NULL};
+
+   safassert(immutil_saImmOmInitialize(, , 
),
+ SA_AIS_OK);
+   immutil_saImmOmFinalize(immOmHandle);
+   rc = immutil_saImmOmClassCreate_2(immOmHandle, className, 
SA_IMM_CLASS_RUNTIME,
+ attrDefinitions);
+   test_validate(rc, SA_AIS_ERR_BAD_HANDLE);
+}
+
 /*
   Verify it is not allowed to create IMM object class with reserved name.
   NOTE: As the list of reserved class names is read from the environment
@@ -1497,6 +1571,17 @@ __attribute__((constructor)) static void 
saImmOmInitialize_constructor(void)
test_case_add(
2, saImmOmClassCreate_2_19,
"saImmOmClassCreate_2 - SA_AIS_OK, Create a class that has 
STRONG_DEFAULT flag without having default value");
+   test_case_add(2, saImmOmClassCreate_2_20,
+ "saImmOmClassCreate_2 - SA_AIS_ERR_BAD_HANDLE CONFIG 
CLASS");
+   test_case_add(2, saImmOmClassCreate_2_21,
+ "saImmOmClassCreate_2 - SA_AIS_ERR_BAD_HANDLE CONFIG 
CLASS UNINITLIZED HANDLE");
+   test_case_add(2, saImmOmClassCreate_2_22,
+ "saImmOmClassCreate_2 - SA_AIS_ERR_BAD_HANDLE RUNTIME 
CLASS UNINTILIZED HANDLE");
+   test_case_add(2, saImmOmClassCreate_2_23,
+ "saImmOmClassCreate_2 - SA_AIS_ERR_BAD_HANDLE CONFIG 
CLASS FINALIZED HANDLE");
+   test_case_add(2, saImmOmClassCreate_2_24,
+ "saImmOmClassCreate_2 - SA_AIS_ERR_BAD_HANDLE RUNTIME 
CLASS FINALLIZED HANDLE");
+
test_case_add(
2, saImmOmClassCreate_with_reserved_name_01,