Hi Lennart,

Other comment is, isRtStream field is used to distinguish that stream data
belongs to configurable stream or runtime stream.

With this patch, you introduce STREAM_TYPE_APPLICATION_RT/_CFG, then I think
that field may be unnecessary.

Regards, Vu

> -----Original Message-----
> From: Vu Minh Nguyen [mailto:vu.m.ngu...@dektech.com.au]
> Sent: Wednesday, February 28, 2018 2:10 PM
> To: 'Lennart Lund' <lennart.l...@ericsson.com>;
> 'canh.v.tru...@dektech.com.au' <canh.v.tru...@dektech.com.au>
> Cc: 'opensaf-devel@lists.sourceforge.net' <opensaf-
> de...@lists.sourceforge.net>
> Subject: RE: [PATCH 1/1] log: Fix cyclic crash when starting standby and
OI is
> not active [#2711]
> 
> Hi Lennart,
> 
> See my comments inline, with [Vu].
> 
> Regards, Vu
> 
> > -----Original Message-----
> > From: Lennart Lund [mailto:lennart.l...@ericsson.com]
> > Sent: Monday, February 26, 2018 8:40 PM
> > To: vu.m.ngu...@dektech.com.au; canh.v.tru...@dektech.com.au
> > Cc: opensaf-devel@lists.sourceforge.net; Lennart Lund
> > <lennart.l...@ericsson.com>
> > Subject: [PATCH 1/1] log: Fix cyclic crash when starting standby and OI
is not
> > active [#2711]
> >
> > Fix cyclic reboot caused by reading an IMM RT object when the OI is down
> > ---
> >  src/log/apitest/logtest.c  |  2 --
> >  src/log/logd/lgs_config.cc |  2 +-
> >  src/log/logd/lgs_evt.cc    | 13 ++++++-------
> >  src/log/logd/lgs_fmt.h     |  3 ++-
> >  src/log/logd/lgs_imm.cc    | 13 +++++++------
> >  src/log/logd/lgs_mbcsv.cc  | 18 ++++--------------
> >  src/log/logd/lgs_mbcsv.h   |  3 ++-
> >  src/log/logd/lgs_recov.cc  |  6 ++++--
> >  src/log/logd/lgs_stream.cc | 28 +++++++++++-----------------
> >  src/log/logd/lgs_stream.h  |  2 +-
> >  src/osaf/immutil/immutil.h |  4 +++-
> >  11 files changed, 41 insertions(+), 53 deletions(-)
> >
> > diff --git a/src/log/apitest/logtest.c b/src/log/apitest/logtest.c
> > index afa1fcf57..f8fe135cb 100644
> > --- a/src/log/apitest/logtest.c
> > +++ b/src/log/apitest/logtest.c
> > @@ -33,8 +33,6 @@
> >  #include "base/osaf_extended_name.h"
> >  #include <saAis.h>
> >
> > -#define LLDTEST
> > -
> >  SaNameT systemStreamName;
> >  SaNameT alarmStreamName;
> >  SaNameT globalConfig;
> > diff --git a/src/log/logd/lgs_config.cc b/src/log/logd/lgs_config.cc
> > index a70a2f6c6..4190e3048 100644
> > --- a/src/log/logd/lgs_config.cc
> > +++ b/src/log/logd/lgs_config.cc
> > @@ -586,7 +586,7 @@ int lgs_cfg_verify_log_file_format(const char
> > *log_file_format) {
> >    SaBoolT dummy;
> >
> >    if (!lgs_is_valid_format_expression((const SaStringT)log_file_format,
> > -                                      STREAM_TYPE_APPLICATION, &dummy))
{
> > +                                      STREAM_TYPE_APPLICATION_RT,
&dummy)) {
> >      LOG_NO("logStreamFileFormat has invalid value = %s",
log_file_format);
> >      rc = -1;
> >    }
> > diff --git a/src/log/logd/lgs_evt.cc b/src/log/logd/lgs_evt.cc
> > index b8840b436..4b735875d 100644
> > --- a/src/log/logd/lgs_evt.cc
> > +++ b/src/log/logd/lgs_evt.cc
> > @@ -877,7 +877,7 @@ SaAisErrorT
> > create_new_app_stream(lgsv_stream_open_req_t *open_sync_param,
> >
> >    /* Check the format string */
> >    if (!lgs_is_valid_format_expression(open_sync_param->logFileFmt,
> > -                                      STREAM_TYPE_APPLICATION,
> > +                                      STREAM_TYPE_APPLICATION_RT,
> >                                        &twelveHourModeFlag)) {
> >      TRACE("format expression failure");
> >      rc = SA_AIS_ERR_INVALID_PARAM;
> > @@ -947,16 +947,15 @@ SaAisErrorT
> > create_new_app_stream(lgsv_stream_open_req_t *open_sync_param,
> >        open_sync_param->logFileName, open_sync_param->logFilePathName,
> >        open_sync_param->maxLogFileSize, open_sync_param-
> > >maxLogRecordSize,
> >        open_sync_param->logFileFullAction, open_sync_param-
> > >maxFilesRotated,
> > -      open_sync_param->logFileFmt, STREAM_TYPE_APPLICATION,
> > twelveHourModeFlag,
> > -      0,
> > -      *o_stream);  // output
> > +      open_sync_param->logFileFmt, STREAM_TYPE_APPLICATION_RT,
> > +      twelveHourModeFlag, 0, *o_stream);  // output
> >    if (err == -1) {
> >      log_stream_delete(o_stream);
> >      rc = SA_AIS_ERR_NO_MEMORY;
> >      goto done;
> >    }
> >
> > -  rc = lgs_create_rt_appstream(*o_stream);
> > +  rc = lgs_create_appstream_rt_object(*o_stream);
> >    if (rc != SA_AIS_OK) log_stream_delete(o_stream);
> >
> >  done:
> > @@ -1055,7 +1054,7 @@ static uint32_t proc_stream_open_msg(lgs_cb_t
> > *cb, lgsv_lgs_evt_t *evt) {
> >    logStream = log_stream_get_by_name(name);
> >    if (logStream != nullptr) {
> >      TRACE("existing stream - id %u", logStream->streamId);
> > -    if (logStream->streamType == STREAM_TYPE_APPLICATION) {
> > +    if (logStream->streamType == STREAM_TYPE_APPLICATION_RT) {
> >        /* Verify the creation attributes for an existing appl. stream */
> >        if (open_sync_param->lstr_open_flags & SA_LOG_STREAM_CREATE) {
> >          ais_rv = file_attribute_cmp(open_sync_param, logStream);
> > @@ -1218,7 +1217,7 @@ static uint32_t proc_stream_close_msg(lgs_cb_t
> > *cb, lgsv_lgs_evt_t *evt) {
> >
> >    // 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) &&
> > +  if ((stream->streamType == STREAM_TYPE_APPLICATION_RT) &&
> >        (cb->immOiHandle == 0)) {
> >      TRACE("IMM service unavailable, close stream failed");
> >      ais_rc = SA_AIS_ERR_TRY_AGAIN;
> > diff --git a/src/log/logd/lgs_fmt.h b/src/log/logd/lgs_fmt.h
> > index f493e2c48..6a52d2986 100644
> > --- a/src/log/logd/lgs_fmt.h
> > +++ b/src/log/logd/lgs_fmt.h
> > @@ -172,7 +172,8 @@ typedef enum {
> >    STREAM_TYPE_ALARM = 0,
> >    STREAM_TYPE_NOTIFICATION = 1,
> >    STREAM_TYPE_SYSTEM = 2,
> > -  STREAM_TYPE_APPLICATION = 3
> > +  STREAM_TYPE_APPLICATION_RT = 3,
> > +  STREAM_TYPE_APPLICATION_CFG = 4
> >  } logStreamTypeT;
> >
> >  extern SaBoolT lgs_is_valid_format_expression(const SaStringT,
> > logStreamTypeT,
> > diff --git a/src/log/logd/lgs_imm.cc b/src/log/logd/lgs_imm.cc
> > index 314568133..60870fa17 100644
> > --- a/src/log/logd/lgs_imm.cc
> > +++ b/src/log/logd/lgs_imm.cc
> > @@ -399,7 +399,7 @@ static void adminOperationCallback(
> >
> >    if (opId == SA_LOG_ADMIN_CHANGE_FILTER) {
> >      /* Only allowed to update runtime objects (application streams) */
> > -    if (stream->streamType != STREAM_TYPE_APPLICATION) {
> > +    if (stream->streamType != STREAM_TYPE_APPLICATION_RT) {
> >        report_om_error(immOiHandle, invocation,
> >                        "Admin op change filter for non app stream");
> >        goto done;
> > @@ -1644,7 +1644,8 @@ static SaAisErrorT check_attr_validity(
> >        SaBoolT dummy;
> >        if (opdata->operationType == CCBUTIL_CREATE) {
> >          if (!lgs_is_valid_format_expression(i_logFileFormat,
> > -                                            STREAM_TYPE_APPLICATION,
&dummy)) {
> > +                                            STREAM_TYPE_APPLICATION_RT,
> > +                                            &dummy)) {
> >            report_oi_error(immOiHandle, opdata->ccbId,
> >                            "Invalid logFileFormat: %s",
i_logFileFormat);
> >            rc = SA_AIS_ERR_BAD_OPERATION;
> > @@ -2276,7 +2277,7 @@ static SaAisErrorT
> stream_create_and_configure1(
> >    i = 0;
> >
> >    // a configurable application stream.
> > -  (*stream)->streamType = STREAM_TYPE_APPLICATION;
> > +  (*stream)->streamType = STREAM_TYPE_APPLICATION_CFG;
> >
> >    while (ccb->param.create.attrValues[i] != NULL) {
> >      if (ccb->param.create.attrValues[i]->attrValuesNumber > 0) {
> > @@ -2775,7 +2776,7 @@ static SaAisErrorT stream_create_and_configure(
> >    else if (dn == SA_LOG_STREAM_SYSTEM)
> >      stream->streamType = STREAM_TYPE_SYSTEM;
> >    else
> > -    stream->streamType = STREAM_TYPE_APPLICATION;
> > +    stream->streamType = STREAM_TYPE_APPLICATION_CFG;
> >
> >    while ((attribute = attributes[i++]) != NULL) {
> >      void *value;
> > @@ -2815,7 +2816,7 @@ static SaAisErrorT stream_create_and_configure(
> >          LOG_WA("Invalid logFileFormat for stream %s, using default",
> >                 stream->name.c_str());
> >
> > -        if (stream->streamType == STREAM_TYPE_APPLICATION) {
> > +        if (stream->streamType == STREAM_TYPE_APPLICATION_CFG) {
> >            logFileFormat = const_cast<char *>(static_cast<const char *>(
> >                lgs_cfg_get(LGS_IMM_LOG_STREAM_FILE_FORMAT)));
> >          } else {
> > @@ -2864,7 +2865,7 @@ static SaAisErrorT stream_create_and_configure(
> >    }
> >
> >    if (stream->logFileFormat == NULL) {
> > -    if (stream->streamType == STREAM_TYPE_APPLICATION) {
> > +    if (stream->streamType == STREAM_TYPE_APPLICATION_CFG) {
> >        const char *logFileFormat = static_cast<const char *>(
> >            lgs_cfg_get(LGS_IMM_LOG_STREAM_FILE_FORMAT));
> >        stream->logFileFormat = strdup(logFileFormat);
> > diff --git a/src/log/logd/lgs_mbcsv.cc b/src/log/logd/lgs_mbcsv.cc
> > index 175858b6f..4250f7fc6 100644
> > --- a/src/log/logd/lgs_mbcsv.cc
> > +++ b/src/log/logd/lgs_mbcsv.cc
> > @@ -2037,7 +2037,6 @@ uint32_t ckpt_proc_open_stream(lgs_cb_t *cb,
> void
> > *data) {
> >    lgs_ckpt_stream_open_t *param;
> >    log_stream_t *stream;
> >    int pos = 0, err = 0;
> > -  SaNameT objectName;
> >
> >    TRACE_ENTER();
> >
> > @@ -2072,7 +2071,6 @@ uint32_t ckpt_proc_open_stream(lgs_cb_t *cb,
> void
> > *data) {
> >    } else {
> >      TRACE("\tNew stream %s, id %u", param->logStreamName, param-
> > >streamId);
> >
> > -    SaAisErrorT rc = SA_AIS_OK;
> >      stream = log_stream_new(param->logStreamName, param->streamId);
> >      if (stream == NULL) {
> >        LOG_ER("Failed to create log stream %s", param->logStreamName);
> > @@ -2092,26 +2090,18 @@ uint32_t ckpt_proc_open_stream(lgs_cb_t *cb,
> > void *data) {
> >        goto done;
> >      }
> >
> > -    rc = lgs_create_rt_appstream(stream);
> > -    if (rc != SA_AIS_OK) {
> > -      log_stream_delete(&stream);
> > -      goto done;
> > -    }
> > -
> >      stream->numOpeners = param->numOpeners;
> >      stream->creationTimeStamp = param->creationTimeStamp;
> >      stream->stb_curFileSize = 0;
> >      stream->logFileCurrent = param->logFileCurrent;
> >      stream->stb_prev_actlogFileCurrent = param->logFileCurrent;
> >      stream->stb_logFileCurrent = param->logFileCurrent;
> > -    osaf_extended_name_lend(param->logStreamName, &objectName);
> > -    SaImmClassNameT className = immutil_get_className(&objectName);
> > -    if (className != nullptr && strcmp(className, "SaLogStreamConfig")
==
> 0)
> > {
> > -      stream->isRtStream = SA_FALSE;
> > -    } else {
> > +
> > +    if (stream->streamType == STREAM_TYPE_APPLICATION_RT) {
> >        stream->isRtStream = SA_TRUE;
> > +    } else {
> > +      stream->isRtStream = SA_FALSE;
> >      }
> [Vu] We might have trouble - not able to close runtime app streams if user
> creates the streams during upgrade (standby LOGsv runs this new code and
> active runs with legacy code).
> When creating runtime application stream, stream information will be
> checkpointed to standby with default `streamType(0)` - Actually
`streamType`
> have not been checkpointed to standby.
> (refer to lgs_ckpt_stream_open @ lgs_stream.cc). Therefore, stream-
> >isRtStream is always set to SA_FALSE on standby LOGsv even the stream is
> runtime.
> 
> When standby LOGsv takes active role, request to close/delete such rt
> application stream will not be performed at LOG server side as isRtStream
=
> SA_FALSE (refer to log_stream_delete @ lgs_stream.cc).
> In other words, these streams will be leaked.
> 
> > -    if (className != nullptr) free(className);
> >
> >      // Only update destination names if peer is v6 or upper.
> >      if (lgs_is_peer_v6()) {
> > diff --git a/src/log/logd/lgs_mbcsv.h b/src/log/logd/lgs_mbcsv.h
> > index 30ee47b81..7cb4c98a5 100644
> > --- a/src/log/logd/lgs_mbcsv.h
> > +++ b/src/log/logd/lgs_mbcsv.h
> > @@ -39,9 +39,10 @@
> >  #define LGS_MBCSV_VERSION_4 4
> >  #define LGS_MBCSV_VERSION_5 5
> >  #define LGS_MBCSV_VERSION_6 6
> > +#define LGS_MBCSV_VERSION_7 7
> [Vu] Seems there is no place in this patch using this new version?
> 
> >
> >  /* Current version */
> > -#define LGS_MBCSV_VERSION 6
> > +#define LGS_MBCSV_VERSION 7
> >  #define LGS_MBCSV_VERSION_MIN 1
> >
> >  /* Checkpoint message types(Used as 'reotype' w.r.t mbcsv)  */
> > diff --git a/src/log/logd/lgs_recov.cc b/src/log/logd/lgs_recov.cc
> > index ed4a6e733..dcaad188d 100644
> > --- a/src/log/logd/lgs_recov.cc
> > +++ b/src/log/logd/lgs_recov.cc
> > @@ -524,12 +524,14 @@ int lgs_restore_one_app_stream(const std::string
> > &stream_name,
> >
> >    /* Get twelveHourModeFlag from the logFileFmt */
> >    lgs_is_valid_format_expression(open_stream_param.logFileFmt,
> > -                                 STREAM_TYPE_APPLICATION,
&twelveHourModeFlag);
> > +                                 STREAM_TYPE_APPLICATION_RT,
> > +                                 &twelveHourModeFlag);
> >    rc_out = lgs_populate_log_stream(
> >        open_stream_param.logFileName,
> > open_stream_param.logFilePathName,
> >        open_stream_param.maxLogFileSize,
> > open_stream_param.maxLogRecordSize,
> >        open_stream_param.logFileFullAction,
> > open_stream_param.maxFilesRotated,
> > -      open_stream_param.logFileFmt, STREAM_TYPE_APPLICATION,
> > twelveHourModeFlag,
> > +      open_stream_param.logFileFmt, STREAM_TYPE_APPLICATION_RT,
> > +                                    twelveHourModeFlag,
> >        0,
> >        log_stream);  // output
> >    if (rc_out == -1) {
> > diff --git a/src/log/logd/lgs_stream.cc b/src/log/logd/lgs_stream.cc
> > index 65689d658..0c83e305b 100644
> > --- a/src/log/logd/lgs_stream.cc
> > +++ b/src/log/logd/lgs_stream.cc
> > @@ -394,7 +394,7 @@ void log_stream_print(log_stream_t *stream) {
> >    TRACE_2("  pathName:             %s", stream->pathName.c_str());
> >    TRACE_2("  maxLogFileSize:       %llu", stream->maxLogFileSize);
> >    TRACE_2("  fixedLogRecordSize:   %u", stream->fixedLogRecordSize);
> > -  if (stream->streamType == STREAM_TYPE_APPLICATION)
> > +  if (stream->streamType >= STREAM_TYPE_APPLICATION_RT)
> >      TRACE_2("  haProperty:           %u", stream->haProperty);
> >    TRACE_2("  logFullAction:        %u", stream->logFullAction);
> >    TRACE_2("  logFullHaltThreshold: %u", stream->logFullHaltThreshold);
> > @@ -520,7 +520,7 @@ int lgs_populate_log_stream(
> >   * @param stream runtimem app stream
> >   * @return SaAisErrorT
> >   */
> > -SaAisErrorT lgs_create_rt_appstream(log_stream_t *const stream) {
> > +SaAisErrorT lgs_create_appstream_rt_object(log_stream_t *const stream)
> {
> >    SaAisErrorT rc = SA_AIS_OK;
> >    TRACE_ENTER2("%s, l: %zu", stream->name.c_str(),
stream->name.size());
> >
> > @@ -622,20 +622,14 @@ SaAisErrorT
> lgs_create_rt_appstream(log_stream_t
> > *const stream) {
> >          &attr_saLogStreamCreationTimestamp,
> >          NULL};
> >
> > -    {
> > -      /**
> > -       * Have to have retry for Rt creation.
> > -       * Rt update could consider removing retry to avoid blocking
> > -       */
> > -      rc = immutil_saImmOiRtObjectCreate_2(
> > -          lgs_cb->immOiHandle,
> > const_cast<SaImmClassNameT>("SaLogStream"),
> > -          parentName, attrValues);
> > -      free(dndup);
> > -
> > -      if (rc != SA_AIS_OK) {
> > -        LOG_WA("saImmOiRtObjectCreate_2 returned %u for %s, parent %s",
> > rc,
> > -               stream->name.c_str(), parent_name);
> > -      }
> > +    rc = immutil_saImmOiRtObjectCreate_2(
> > +        lgs_cb->immOiHandle,
> const_cast<SaImmClassNameT>("SaLogStream"),
> > +        parentName, attrValues);
> > +    free(dndup);
> > +
> > +    if (rc != SA_AIS_OK) {
> > +      LOG_WA("saImmOiRtObjectCreate_2 returned %u for %s, parent %s",
> rc,
> > +             stream->name.c_str(), parent_name);
> >      }
> >    }
> >
> > @@ -799,7 +793,7 @@ void log_stream_close(log_stream_t **s, time_t
> > *close_time_ptr) {
> >      /* Delete stream if last opener
> >       * Note: standard streams can never be deleted
> >       */
> > -    osafassert(stream->streamType == STREAM_TYPE_APPLICATION);
> > +    osafassert(stream->streamType >= STREAM_TYPE_APPLICATION_RT);
> >
> >      if (*stream->p_fd != -1) {
> >        /* Note: Stream fd is always initiated to -1
> > diff --git a/src/log/logd/lgs_stream.h b/src/log/logd/lgs_stream.h
> > index efc39d44f..ad8c7412f 100644
> > --- a/src/log/logd/lgs_stream.h
> > +++ b/src/log/logd/lgs_stream.h
> > @@ -109,7 +109,7 @@ extern int lgs_populate_log_stream(
> >      SaBoolT twelveHourModeFlag, uint32_t logRecordId,
> >      log_stream_t *const o_stream);
> >
> > -extern SaAisErrorT lgs_create_rt_appstream(log_stream_t *const rt);
> > +extern SaAisErrorT lgs_create_appstream_rt_object(log_stream_t *const
> rt);
> >  extern log_stream_t *log_stream_new(const std::string &name, int
> > stream_id);
> >
> >  extern void log_stream_open_fileinit(log_stream_t *stream);
> > diff --git a/src/osaf/immutil/immutil.h b/src/osaf/immutil/immutil.h
> > index 40300434d..dc6449bbf 100644
> > --- a/src/osaf/immutil/immutil.h
> > +++ b/src/osaf/immutil/immutil.h
> > @@ -361,9 +361,11 @@ EXTERN_C SaAisErrorT
> > immutil_update_one_rattr(SaImmOiHandleT immOiHandle,
> >
> >  /**
> >   * Get class name from object name.
> > + *
> >   * @param objectName
> >   *
> > - * @return SaImmClassNameT
> > + * @return SaImmClassNameT or NULL if the object does not exist
> > + * NOTE: Will segv if object does exist, is a RT object and there is no
OI
> >   */
> >  EXTERN_C SaImmClassNameT immutil_get_className(const SaNameT
> > *objectName);
> >
> > --
> > 2.16.1



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