Hi Mahesh,

I added one comment in "PATCH 0 of 1", telling reason why not using ha
state.
Here it is.
//>
 Previous fix is not correct as ha state in cb is not changed
 when entering QUIESED state. So, basing on ha_state variable
 is not correct. Using is_quiesced_set flag instead.
//<

Regards, Vu

> -----Original Message-----
> From: A V Mahesh [mailto:mahesh.va...@oracle.com]
> Sent: Wednesday, October 12, 2016 2:10 PM
> To: Vu Minh Nguyen <vu.m.ngu...@dektech.com.au>;
> lennart.l...@ericsson.com
> Cc: opensaf-devel@lists.sourceforge.net
> Subject: Re: [PATCH 1 of 1] log: fix saLogStreamOpen_2 returns
> SA_AIS_ERR_BAD_OPERATION during si-swap [#2093]
> 
> Hi Vu,
> 
> Can we use  (cb->ha_state != SA_AMF_HA_ACTIVE) instead of
> `cb->is_quiesced_set == true`
> as if this is a agent response, so it will have more readability .
> 
> -AVM
> 
> On 10/11/2016 10:36 AM, Vu Minh Nguyen wrote:
> >   osaf/services/saf/logsv/lgs/lgs_evt.cc |   12 +++-
> >   tests/logsv/tet_saLogStreamOpen_2.c    |  101
> +++++++++++++++++++++++++++++++++
> >   2 files changed, 111 insertions(+), 2 deletions(-)
> >
> >
> > During si-swap, old active logd will enter QUEISED HA state, then
> STANDBY.
> > In QUEISED state, IMM OI implementer will be cleared.
> > If opening a new application stream or closing an app stream while
> > the HA state is in QUEISED, log client will get BAD_OPERATION error.
> >
> > In such transition state, logsv should return TRY_AGAIN to clients.
> > Once the transition is completely done, above requests will be served.
> >
> > 02 test cases are created to verify the fix, test case 53 & 54 of suite
#2.
> >
> > diff --git a/osaf/services/saf/logsv/lgs/lgs_evt.cc
> b/osaf/services/saf/logsv/lgs/lgs_evt.cc
> > --- a/osaf/services/saf/logsv/lgs/lgs_evt.cc
> > +++ b/osaf/services/saf/logsv/lgs/lgs_evt.cc
> > @@ -1021,7 +1021,11 @@ static uint32_t proc_stream_open_msg(lgs
> >       }
> >     } else {
> >       /* Stream does not exist */
> > -    if (cb->immOiHandle == 0) {
> > +
> > +    // Client should try again when role changes is in transition
(queued).
> > +    // This check is to avoid the client getting SA_AIS_BAD_OPERATION
> > +    // as there is no IMM OI implementer set.
> > +    if (cb->immOiHandle == 0 || cb->is_quiesced_set == true) {
> >         TRACE("IMM service unavailable, open stream failed");
> >         ais_rv = SA_AIS_ERR_TRY_AGAIN;
> >         goto snd_rsp;
> > @@ -1153,7 +1157,11 @@ static uint32_t proc_stream_close_msg(lg
> >       goto snd_rsp;
> >     }
> >
> > -  if ((stream->streamType == STREAM_TYPE_APPLICATION) && (cb-
> >immOiHandle == 0)) {
> > +  // Client should try again when role changes is in transition
(queued).
> > +  // This check is to avoid the client getting SA_AIS_BAD_OPERATION
> > +  // as there is no IMM OI implementer set.
> > +  if ((stream->streamType == STREAM_TYPE_APPLICATION) &&
> > +      (cb->immOiHandle == 0 || cb->is_quiesced_set == true)) {
> >       TRACE("IMM service unavailable, close stream failed");
> >       ais_rc = SA_AIS_ERR_TRY_AGAIN;
> >       goto snd_rsp;
> > diff --git a/tests/logsv/tet_saLogStreamOpen_2.c
> b/tests/logsv/tet_saLogStreamOpen_2.c
> > --- a/tests/logsv/tet_saLogStreamOpen_2.c
> > +++ b/tests/logsv/tet_saLogStreamOpen_2.c
> > @@ -795,6 +795,105 @@ void saLogMultiThreadMultiInit(void)
> >     test_validate(rc, SA_AIS_OK);
> >   }
> >
> > +//
> > +// This test to verify Open call gets BAD_OPERATION or not during
si-swap
> > +//
> > +void saLogStreamOpen_BadOp(void)
> > +{
> > +   SaAisErrorT rc;
> > +   char command[1000];
> > +   int loop;
> > +
> > +
> > +   rc = saLogInitialize(&logHandle, &logCallbacks, &logVersion);
> > +   if (rc != SA_AIS_OK) {
> > +           fprintf(stderr, "Failed at saLogInitialize: %d \n",
(int)rc);
> > +           test_validate(rc, SA_AIS_OK);
> > +           return;
> > +   }
> > +
> > +   // Perform si-swap in background
> > +   sprintf(command, "amf-adm si-swap safSi=SC-2N,safApp=OpenSAF
> &");
> > +   loop = system(command);
> > +
> > +   // To make Open probably processed righ after logsv HA is set to
> QUEISED state.
> > +   // This test is created to reproduce the issue reported in ticket
#2093
> > +   usleep(100*1000);
> > +
> > +   loop = 100;
> > +tryagain:
> > +   rc = saLogStreamOpen_2(logHandle, &app1StreamName,
> &appStream1LogFileCreateAttributes,
> > +                          SA_LOG_STREAM_CREATE, SA_TIME_ONE_SECOND,
> &logStreamHandle);
> > +   if (rc == SA_AIS_ERR_TRY_AGAIN && loop--) {
> > +           usleep(100*1000);
> > +           goto tryagain;
> > +   }
> > +
> > +   test_validate(rc, SA_AIS_OK);
> > +
> > +   rc = saLogFinalize(logHandle);
> > +   if (rc != SA_AIS_OK) {
> > +           fprintf(stderr, "Failed to call salogFinalize: %d \n", (int)
rc);
> > +   }
> > +}
> > +
> > +//
> > +// This test to verify Close call gets BAD_OPERATION in syslog or not
> during si-swap
> > +//
> > +void saLogStreamClose_BadOp(void)
> > +{
> > +   SaAisErrorT rc;
> > +   char command[1000];
> > +   int loop;
> > +
> > +   rc = saLogInitialize(&logHandle, &logCallbacks, &logVersion);
> > +   if (rc != SA_AIS_OK) {
> > +           fprintf(stderr, "Failed at saLogInitialize: %d \n",
(int)rc);
> > +           test_validate(rc, SA_AIS_OK);
> > +           return;
> > +   }
> > +
> > +
> > +   loop = 100;
> > +tryagain:
> > +   rc = saLogStreamOpen_2(logHandle, &app1StreamName,
> &appStream1LogFileCreateAttributes,
> > +                          SA_LOG_STREAM_CREATE, SA_TIME_ONE_SECOND,
> &logStreamHandle);
> > +   if (rc == SA_AIS_ERR_TRY_AGAIN && loop--) {
> > +           usleep(100*1000);
> > +           goto tryagain;
> > +   }
> > +
> > +   if (rc != SA_AIS_OK) {
> > +           fprintf(stderr, "Failed to open stream (%d)\n", rc);
> > +           test_validate(rc, SA_AIS_OK);
> > +           goto done;
> > +   }
> > +
> > +   // Perform si-swap in background
> > +   sprintf(command, "amf-adm si-swap safSi=SC-2N,safApp=OpenSAF
> &");
> > +   loop = system(command);
> > +
> > +   // To make Close probably processed righ after logsv HA is set to
> QUEISED state.
> > +   // This test is created to reproduce the issue reported in ticket
#2093
> > +   usleep(100*1000);
> > +
> > +   loop = 100;
> > +tryagain_2:
> > +   rc = saLogStreamClose(logStreamHandle);
> > +   if (rc == SA_AIS_ERR_TRY_AGAIN && loop--) {
> > +           usleep(100*1000);
> > +           goto tryagain_2;
> > +   }
> > +
> > +   test_validate(rc, SA_AIS_OK);
> > +
> > +done:
> > +   rc = saLogFinalize(logHandle);
> > +   if (rc != SA_AIS_OK) {
> > +           fprintf(stderr, "Failed to call salogFinalize: %d \n", (int)
rc);
> > +   }
> > +}
> > +
> >   extern void saLogStreamOpenAsync_2_01(void);
> >   extern void saLogStreamOpenCallbackT_01(void);
> >   extern void saLogWriteLog_01(void);
> > @@ -885,5 +984,7 @@ extern void saLogStreamClose_01(void);
> >       test_case_add(2, saLogStreamOpen_2_50, "saLogStreamOpen_2 with
> stream number out of the limitation, ERR");
> >       test_case_add(2, saLogMultipleInitialize, "saLogInitialize() then
> saLogFinalize() multiple times. keep MDS connection, OK");
> >       test_case_add(2, saLogMultiThreadMultiInit, "saLogInitialize()
then
> saLogFinalize() multiple times in multiple threads, OK");
> > +    test_case_add(2, saLogStreamOpen_BadOp, "saLogStreamOpen_2
> while si-swap");
> > +    test_case_add(2, saLogStreamClose_BadOp, "saLogStreamClose while
> si-swap");
> >   }
> >



------------------------------------------------------------------------------
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