Hi,

With this patch, the lowest value for `logMaxLogrecsize` in the validation
is set to `256`.
But in logsv class definition, the default value of `
saLogStreamFixedLogRecordSize` is set to `150`.

I think the lowest value for ` logMaxLogrecsize` should be changed to `150`
instead.

Regards,
Vu


>-----Original Message-----
>From: Lennart Lund [mailto:lennart.l...@ericsson.com]
>Sent: Tuesday, August 25, 2015 8:27 PM
>To: mathi.naic...@oracle.com; vu.m.ngu...@dektech.com.au;
>giang.t...@dektech.com.au
>Cc: opensaf-devel@lists.sourceforge.net
>Subject: [PATCH 1 of 1] log: Make more configuration attributes possible to
>change in runtime [#1288]
>
> osaf/services/saf/logsv/README           |   21 +
> osaf/services/saf/logsv/lgs/lgs_config.c |   50 +-
> osaf/services/saf/logsv/lgs/lgs_config.h |    1 +
> osaf/services/saf/logsv/lgs/lgs_file.c   |    1 +
> osaf/services/saf/logsv/lgs/lgs_imm.c    |  224 +++++---
> tests/logsv/logtest.c                    |    2 +-
> tests/logsv/tet_LogOiOps.c               |  714
+++++++++++++++++++++++++++++-
> 7 files changed, 867 insertions(+), 146 deletions(-)
>
>
>More log service configuration attributes can be changed in runtime
>including logMaxLogrecsize
>
>diff --git a/osaf/services/saf/logsv/README
b/osaf/services/saf/logsv/README
>--- a/osaf/services/saf/logsv/README
>+++ b/osaf/services/saf/logsv/README
>@@ -212,6 +212,8 @@ The following attributes can be changed
>    Can be changed to an existing path.
>
>  - logStreamFileFormat
>+ - logMaxLogrecsize
>+ - logFileIoTimeout
>
>  - logStreamSystemHighLimit
>    logStreamSystemLowLimit
>@@ -500,6 +502,8 @@ in the same way as checkpointing is done
> Configuration changes are now checkpointed using a variable length buffer
> containing a cfgupd list.
>
>+With this change, when attributes are check pointed,
>+the list is always updated with all check pointed values.
>
> CONTRIBUTORS/MAINTAINERS
> ========================
>@@ -711,3 +715,20 @@ of second from log timestamp (@Ck, @Nk).
> - @Nk: for alarm and notification log stream.
>
> Preceding and trailing zeros (0) if needed should exist.
>+
>+
>+2. Log record size could be up to 32Kb (#1288)
>+----------------------------------------------
>+With this ticket, logMaxLogrecsize and logFileIoTimeout attributes
>+could be possible to change in runtime.
>+
>+logMaxLogrecsize attribute value could be up to 32768 (32Kb).
>+
>+logFileIoTimeout, this attribute defines the time period for
>+which the main thread has to wait for the file IO operation to complete.
>+The value is in milliseconds. In default, the main thread waits up to
500ms
>+for file handling thread complete file IO operation.
>+
>+If user suffers the timeout when sending a big record size (e.g: 32Kb),
>+He can adjust the waiting time by updating logFileIoTimeout attribute
value
>up to 5000ms.
>+
>diff --git a/osaf/services/saf/logsv/lgs/lgs_config.c
>b/osaf/services/saf/logsv/lgs/lgs_config.c
>--- a/osaf/services/saf/logsv/lgs/lgs_config.c
>+++ b/osaf/services/saf/logsv/lgs/lgs_config.c
>@@ -120,24 +120,22 @@ static struct {
>       SaUint32T logStreamSystemLowLimit;
>       SaUint32T logStreamAppHighLimit;
>       SaUint32T logStreamAppLowLimit;
>-
>-      /* Not runtime configurable */
>       SaUint32T logMaxLogrecsize;
>       SaUint32T logMaxApplicationStreams;
>       SaUint32T logFileIoTimeout;
>       SaUint32T logFileSysConfig;
> } lgs_conf_def = {
>-      PKGLOGDIR,      /*logRootDirectory*/
>-      "",             /*logDataGroupname*/
>-      DEFAULT_APP_SYS_FORMAT_EXP, /* logStreamFileFormat */
>-      1024,           /*logMaxLogrecsize*/
>-      0,              /*logStreamSystemHighLimit*/
>-      0,              /*logStreamSystemLowLimit*/
>-      0,              /*logStreamAppHighLimit*/
>-      0,              /*logStreamAppLowLimit*/
>-      64,             /*logMaxApplicationStreams*/
>-      500,            /*logFileIoTimeout*/
>-      1,              /*logFileSysConfig*/
>+      .logRootDirectory = PKGLOGDIR,  /*logRootDirectory*/
>+      .logDataGroupname = "",         /*logDataGroupname*/
>+      .logStreamFileFormat = DEFAULT_APP_SYS_FORMAT_EXP, /*
>logStreamFileFormat */
>+      .logStreamSystemHighLimit = 0,  /*logStreamSystemHighLimit*/
>+      .logStreamSystemLowLimit = 0,   /*logStreamSystemLowLimit*/
>+      .logStreamAppHighLimit = 0,     /*logStreamAppHighLimit*/
>+      .logStreamAppLowLimit = 0,      /*logStreamAppLowLimit*/
>+      .logMaxLogrecsize = 1024,       /*logMaxLogrecsize*/
>+      .logMaxApplicationStreams = 64, /*logMaxApplicationStreams*/
>+      .logFileIoTimeout = 500,        /*logFileIoTimeout*/
>+      .logFileSysConfig = 1,          /*logFileSysConfig*/
> };
>
> static lgs_conf_t lgs_conf = {
>@@ -544,9 +542,8 @@ int lgs_cfg_verify_log_file_format(const
> /**
>  * Verify logMaxLogrecsize; Max size of a log record including header
>  * Rules:
>- * - Because of an incorrect declaration in the server (uint16_t) that
shall be
>- *   uint32_t the max value cannot be set > 2^15-1 (32767)
>- * - Must be > 256
>+ * - Must be >= 256
>+ * - Must not larger than 65535 (UINT16_MAX)
>  *
>  * @param max_logrecsize_in[in]
>  * @return -1 on error
>@@ -554,8 +551,7 @@ int lgs_cfg_verify_log_file_format(const
> int lgs_cfg_verify_max_logrecsize(uint32_t max_logrecsize_in)
> {
>       int rc = 0;
>-
>-      if ((max_logrecsize_in > 32767) || (max_logrecsize_in < 256)) {
>+      if ((max_logrecsize_in > 65535) || (max_logrecsize_in < 256)) {
>               LOG_NO("verify_max_logrecsize Fail");
>               rc = -1;
>       }
>@@ -609,14 +605,24 @@ int lgs_cfg_verify_max_application_strea
>
> /**
>  * Verify logFileIoTimeout
>- * Rules: No rules defined will always return 0 (ok)
>- *
>+ * Rules: timeout must not be larger than 15s as it will impact on amf
>healthcheck.
>+ *        - Maximum value is less than 5s
>+ *        - Minimum timeout is not less than 500ms
>+ * NOTE: This range has not been measured in real system yet.
>  * @param log_file_io_timeout[in]
>  * @return -1 on error
>  */
>-static int lgs_cfg_verify_file_io_timeout(uint32_t log_file_io_timeout)
>+int lgs_cfg_verify_file_io_timeout(uint32_t log_file_io_timeout)
> {
>-      return 0;
>+      int rc = 0;
>+
>+      if ((log_file_io_timeout < 500) || (log_file_io_timeout > 5000)) {
>+              LOG_NO("logFileIoTimeout has invalid value = %u",
>+                         log_file_io_timeout);
>+              rc = -1;
>+      }
>+
>+      return rc;
> }
>
> /**
>diff --git a/osaf/services/saf/logsv/lgs/lgs_config.h
>b/osaf/services/saf/logsv/lgs/lgs_config.h
>--- a/osaf/services/saf/logsv/lgs/lgs_config.h
>+++ b/osaf/services/saf/logsv/lgs/lgs_config.h
>@@ -97,6 +97,7 @@ int lgs_cfg_verify_log_file_format(const
> int lgs_cfg_verify_max_logrecsize(uint32_t max_logrecsize_in);
> int lgs_cfg_verify_mbox_limit(uint32_t high, uint32_t low);
> int lgs_cfg_verify_max_application_streams(uint32_t max_app_streams);
>+int lgs_cfg_verify_file_io_timeout(uint32_t log_file_io_timeout);
>
> /*
>  * Handle runtime object for showing actual configuration
>diff --git a/osaf/services/saf/logsv/lgs/lgs_file.c
>b/osaf/services/saf/logsv/lgs/lgs_file.c
>--- a/osaf/services/saf/logsv/lgs/lgs_file.c
>+++ b/osaf/services/saf/logsv/lgs/lgs_file.c
>@@ -428,6 +428,7 @@ lgsf_retcode_t log_file_api(lgsf_apipar_
>       if (rc != 0) osaf_abort(rc);
>
>       /* Wait for an answer */
>+      max_waittime_ms = *(SaUint32T *)
>lgs_cfg_get(LGS_IMM_FILEHDL_TIMEOUT);
>       get_timeout_time(&timeout_time, max_waittime_ms);
>
>       while (lgs_com_data.answer_f == false) {
>diff --git a/osaf/services/saf/logsv/lgs/lgs_imm.c
>b/osaf/services/saf/logsv/lgs/lgs_imm.c
>--- a/osaf/services/saf/logsv/lgs/lgs_imm.c
>+++ b/osaf/services/saf/logsv/lgs/lgs_imm.c
>@@ -772,9 +772,15 @@ static SaAisErrorT config_ccb_completed_
>                       TRACE("%s value is accepted", logFileFormat);
>                       goto done;
>               } else if (!strcmp(attribute->attrName, LOG_MAX_LOGRECSIZE))
>{
>-                      report_oi_error(immOiHandle, opdata->ccbId,
>-                                      "%s cannot be changed", attribute-
>>attrName);
>-                      ais_rc = SA_AIS_ERR_FAILED_OPERATION;
>+                      SaUint32T maxLogRecordSize = *((SaUint32T *)value);
>+                      rc =
lgs_cfg_verify_max_logrecsize(maxLogRecordSize);
>+                      if (rc == -1) {
>+                              report_oi_error(immOiHandle, opdata->ccbId,
>+                                              "%s value is NOT accepted",
>attribute->attrName);
>+                              ais_rc = SA_AIS_ERR_INVALID_PARAM;
>+                              goto done;
>+                      }
>+                      TRACE("%s is accepted", attribute->attrName);
>                       goto done;
>               } else if (!strcmp(attribute->attrName,
>LOG_STREAM_SYSTEM_HIGH_LIMIT)) {
>                       vattr_v3.logStreamSystemHighLimit = *((SaUint32T
>*)value);
>@@ -802,9 +808,15 @@ static SaAisErrorT config_ccb_completed_
>                       ais_rc = SA_AIS_ERR_FAILED_OPERATION;
>                       goto done;
>               } else if (!strcmp(attribute->attrName,
LOG_FILE_IO_TIMEOUT))
>{
>-                      report_oi_error(immOiHandle, opdata->ccbId,
>-                                      "%s cannot be changed", attribute-
>>attrName);
>-                      ais_rc = SA_AIS_ERR_FAILED_OPERATION;
>+                      SaUint32T logFileIoTimeout = *((SaUint32T *) value);
>+                      rc =
lgs_cfg_verify_file_io_timeout(logFileIoTimeout);
>+                      if (rc == -1) {
>+                              report_oi_error(immOiHandle, opdata->ccbId,
>+                                      "%s value is NOT accepted",
attribute-
>>attrName);
>+                              ais_rc = SA_AIS_ERR_INVALID_PARAM;
>+                              goto done;
>+                      }
>+                      TRACE("%d value is accepted", logFileIoTimeout);
>                       goto done;
>               } else if (!strcmp(attribute->attrName,
LOG_FILE_SYS_CONFIG))
>{
>                       report_oi_error(immOiHandle, opdata->ccbId,
>@@ -1063,35 +1075,36 @@ bool chk_filepath_stream_exist(
> /**
>  * Verify fixedLogRecordSize and maxLogFileSize.
>  * Rules:
>- *  - fixedLogRecordSize must be less than maxLogFileSize
>- *  - fixedLogRecordSize must be less than or equal to logMaxLogrecsize
>- *  - fixedLogRecordSize can be 0. Means variable record size
>- *  - maxLogFileSize must be bigger than 0. No limit is not supported
>- *  - maxLogFileSize must be bigger than logMaxLogrecsize
>+ * 1 - saLogStreamFixedLogRecordSize must be less than
>saLogStreamMaxLogFileSize
>+ * 2 - saLogStreamFixedLogRecordSize must be less than or equal to
>logMaxLogrecsize
>+ * 3 - saLogStreamFixedLogRecordSize can be 0. Means variable record size
>+ * 4 - saLogStreamMaxLogFileSize must be bigger than 0. No limit is not
>supported
>+ * 5 - saLogStreamMaxLogFileSize must be bigger than logMaxLogrecsize
>+ * 6 - saLogStreamMaxLogFileSize must be bigger than
>saLogStreamFixedLogRecordSize
>  *
>- * The ..._flag variable == true means that the corresponding attribute is
>- * changed.
>+ * The ..._mod variable == true means that the corresponding attribute is
>+ * modified.
>  *
>- * @param immOiHandle
>- * @param maxLogFileSize
>- * @param maxLogFileSize_flag
>- * @param fixedLogRecordSize
>- * @param fixedLogRecordSize_flag
>- * @param stream
>- * @param operationType
>+ * @param immOiHandle[in]
>+ * @param streamMaxLogFileSize[in]
>+ * @param streamMaxLogFileSize_mod[in]
>+ * @param streamFixedLogRecordSize[in]
>+ * @param streamFixedLogRecordSize_mod[in]
>+ * @param stream[in]
>+ * @param operationType[in]
>  * @return false if error
>  */
> static bool chk_max_filesize_recordsize_compatible(SaImmOiHandleT
>immOiHandle,
>-              SaUint64T maxLogFileSize,
>-              bool maxLogFileSize_mod,
>-              SaUint32T fixedLogRecordSize,
>-              bool fixedLogRecordSize_mod,
>+              SaUint64T streamMaxLogFileSize,
>+              bool streamMaxLogFileSize_mod,
>+              SaUint32T streamFixedLogRecordSize,
>+              bool streamFixedLogRecordSize_mod,
>               log_stream_t *stream,
>               enum CcbUtilOperationType operationType,
>               SaImmOiCcbIdT ccbId)
> {
>-      SaUint64T i_maxLogFileSize = 0;
>-      SaUint32T i_fixedLogRecordSize = 0;
>+      SaUint64T i_streamMaxLogFileSize = 0;
>+      SaUint32T i_streamFixedLogRecordSize = 0;
>       SaUint32T i_logMaxLogrecsize = 0;
>       lgs_stream_defval_t *stream_default;
>
>@@ -1117,77 +1130,98 @@ static bool chk_max_filesize_recordsize_
>                       LOG_ER("448 %s stream == NULL", __FUNCTION__);
>                       osafassert(0);
>               }
>-              if (fixedLogRecordSize_mod == false) {
>-                      /* fixedLogRecordSize is not given. Get from stream
*/
>-                      i_fixedLogRecordSize = stream->fixedLogRecordSize;
>-                      TRACE("\t448 Get from stream, fixedLogRecordSize =
>%d",
>-                                      i_fixedLogRecordSize);
>+              if (streamFixedLogRecordSize_mod == false) {
>+                      /* streamFixedLogRecordSize is not given. Get from
>stream */
>+                      i_streamFixedLogRecordSize = stream-
>>fixedLogRecordSize;
>+                      TRACE("\t448 Get from stream,
>streamFixedLogRecordSize = %d",
>+                                      i_streamFixedLogRecordSize);
>               } else {
>-                      i_fixedLogRecordSize = fixedLogRecordSize;
>+                      i_streamFixedLogRecordSize =
>streamFixedLogRecordSize;
>               }
>
>-              if (maxLogFileSize_mod == false) {
>-                      /* maxLogFileSize is not given. Get from stream */
>-                      i_maxLogFileSize = stream->maxLogFileSize;
>-                      TRACE("\t448 Get from stream, maxLogFileSize =
%lld",
>-                                      i_maxLogFileSize);
>+              if (streamMaxLogFileSize_mod == false) {
>+                      /* streamMaxLogFileSize is not given. Get from
stream
>*/
>+                      i_streamMaxLogFileSize = stream->maxLogFileSize;
>+                      TRACE("\t448 Get from stream, streamMaxLogFileSize =
>%lld",
>+                                      i_streamMaxLogFileSize);
>               } else {
>-                      i_maxLogFileSize = maxLogFileSize;
>-                      TRACE("\t448 Modified maxLogFileSize = %lld",
>i_maxLogFileSize);
>+                      i_streamMaxLogFileSize = streamMaxLogFileSize;
>+                      TRACE("\t448 Modified streamMaxLogFileSize = %lld",
>i_streamMaxLogFileSize);
>               }
>       } else if (operationType == CCBUTIL_CREATE) {
>               TRACE("\t448 operationType == CCBUTIL_CREATE");
>               /* The stream does not yet exist
>                */
>-              if (fixedLogRecordSize_mod == false) {
>-                      /* fixedLogRecordSize is not given. Use default */
>-                      i_fixedLogRecordSize = stream_default-
>>saLogStreamFixedLogRecordSize;
>-                      TRACE("\t448 Get default, fixedLogRecordSize = %d",
>-                                      i_fixedLogRecordSize);
>+              if (streamFixedLogRecordSize_mod == false) {
>+                      /* streamFixedLogRecordSize is not given. Use
default
>*/
>+                      i_streamFixedLogRecordSize = stream_default-
>>saLogStreamFixedLogRecordSize;
>+                      TRACE("\t448 Get default, streamFixedLogRecordSize =
>%d",
>+                                      i_streamFixedLogRecordSize);
>               } else {
>-                      i_fixedLogRecordSize = fixedLogRecordSize;
>+                      i_streamFixedLogRecordSize =
>streamFixedLogRecordSize;
>               }
>
>-              if (maxLogFileSize_mod == false) {
>-                      /* maxLogFileSize is not given. Use default */
>-                      i_maxLogFileSize = stream_default-
>>saLogStreamMaxLogFileSize;
>-                      TRACE("\t448 Get default, maxLogFileSize = %lld",
>-                                      i_maxLogFileSize);
>+              if (streamMaxLogFileSize_mod == false) {
>+                      /* streamMaxLogFileSize is not given. Use default */
>+                      i_streamMaxLogFileSize = stream_default-
>>saLogStreamMaxLogFileSize;
>+                      TRACE("\t448 Get default, streamMaxLogFileSize =
>%lld",
>+                                      i_streamMaxLogFileSize);
>               } else {
>-                      i_maxLogFileSize = maxLogFileSize;
>+                      i_streamMaxLogFileSize = streamMaxLogFileSize;
>               }
>       } else {
>               /* Unknown operationType */
>               LOG_ER("%s Unknown operationType", __FUNCTION__);
>               osafassert(0);
>       }
>-
>-      /** Do the verification **/
>-      if (i_maxLogFileSize <= i_logMaxLogrecsize) {
>-              /* maxLogFileSize must be bigger than logMaxLogrecsize */
>-              report_oi_error(immOiHandle, ccbId,
>-                                      "maxLogFileSize out of range");
>-              TRACE("\t448 i_maxLogFileSize (%lld) <= i_logMaxLogrecsize
>(%d)",
>-                              i_maxLogFileSize, i_logMaxLogrecsize);
>-              rc = false;
>-      } else if (i_fixedLogRecordSize == 0) {
>-              /* fixedLogRecordSize can be 0. Means variable record size
*/
>-              TRACE("\t448 fixedLogRecordSize = 0");
>-              rc = true;
>-      } else if (i_fixedLogRecordSize >= i_maxLogFileSize) {
>-              /* fixedLogRecordSize must be less than maxLogFileSize */
>-              report_oi_error(immOiHandle, ccbId,
>-                              "fixedLogRecordSize out of range");
>-              TRACE("\t448 i_fixedLogRecordSize >= i_maxLogFileSize");
>-              rc = false;
>-      } else if (i_fixedLogRecordSize > i_logMaxLogrecsize) {
>-              /* fixedLogRecordSize must be less than maxLogFileSize */
>-              report_oi_error(immOiHandle, ccbId,
>-                              "fixedLogRecordSize out of range");
>-              TRACE("\t448 i_fixedLogRecordSize > i_logMaxLogrecsize");
>-              rc = false;
>+
>+
>+      /*
>+       * Do verification
>+       */
>+      if (streamMaxLogFileSize_mod == true) {
>+              if (i_streamMaxLogFileSize <= i_logMaxLogrecsize) {
>+                      /* streamMaxLogFileSize must be bigger than
>logMaxLogrecsize */
>+                      report_oi_error(immOiHandle, ccbId,
>+
"streamMaxLogFileSize
>out of range");
>+                      TRACE("\t448 i_streamMaxLogFileSize (%lld) <=
>i_logMaxLogrecsize (%d)",
>+                                i_streamMaxLogFileSize,
i_logMaxLogrecsize);
>+                      rc = false;
>+                      goto done;
>+              } else if (i_streamMaxLogFileSize <=
>i_streamFixedLogRecordSize) {
>+                      /* streamMaxLogFileSize must be bigger than
>streamFixedLogRecordSize */
>+                      report_oi_error(immOiHandle, ccbId,
>+
"streamMaxLogFileSize
>out of range");
>+                      TRACE("\t448 i_streamMaxLogFileSize (%lld) <=
>i_streamFixedLogRecordSize (%d)",
>+                                i_streamMaxLogFileSize,
>i_streamFixedLogRecordSize);
>+                      rc = false;
>+                      goto done;
>+              }
>       }
>-
>+
>+      if (streamFixedLogRecordSize_mod == true) {
>+              if (i_streamFixedLogRecordSize == 0) {
>+                      /* streamFixedLogRecordSize can be 0. Means variable
>record size */
>+                      TRACE("\t448 streamFixedLogRecordSize = 0");
>+                      rc = true;
>+              } else if (i_streamFixedLogRecordSize >=
>i_streamMaxLogFileSize) {
>+                      /* streamFixedLogRecordSize must be less than
>streamMaxLogFileSize */
>+                      report_oi_error(immOiHandle, ccbId,
>+
>       "streamFixedLogRecordSize out of range");
>+                      TRACE("\t448 i_streamFixedLogRecordSize (%d) >=
>i_streamMaxLogFileSize (%lld)",
>+                                i_streamFixedLogRecordSize,
>i_streamMaxLogFileSize);
>+                      rc = false;
>+              } else if (i_streamFixedLogRecordSize > i_logMaxLogrecsize)
{
>+                      /* streamFixedLogRecordSize must be less than
>streamMaxLogFileSize */
>+                      report_oi_error(immOiHandle, ccbId,
>+
>       "streamFixedLogRecordSize out of range");
>+                      TRACE("\t448 i_streamFixedLogRecordSize (%d) >
>i_logMaxLogrecsize (%d)",
>+                                i_streamFixedLogRecordSize,
>i_logMaxLogrecsize);
>+                      rc = false;
>+              }
>+      }
>+
>+done:
>       TRACE_LEAVE2("448 rc = %d", rc);
>       return rc;
> }
>@@ -1218,10 +1252,10 @@ static SaAisErrorT check_attr_validity(S
>       char *i_pathName = NULL;
>       bool i_pathName_mod = false;
>       /* Modification flag -> true if modified */
>-      SaUint32T i_fixedLogRecordSize = 0;
>-      bool i_fixedLogRecordSize_mod = false;
>-      SaUint64T i_maxLogFileSize = 0;
>-      bool i_maxLogFileSize_mod = false;
>+      SaUint32T i_streamFixedLogRecordSize = 0;
>+      bool i_streamFixedLogRecordSize_mod = false;
>+      SaUint64T i_streamMaxLogFileSize = 0;
>+      bool i_streamMaxLogFileSize_mod = false;
>       SaUint32T i_logFullAction = 0;
>       bool i_logFullAction_mod = false;
>       char *i_logFileFormat = NULL;
>@@ -1322,16 +1356,16 @@ static SaAisErrorT check_attr_validity(S
>                       /* Save and compare with FixedLogRecordSize after
all
>attributes
>                        * are read. Must be bigger than FixedLogRecordSize
>                        */
>-                      i_maxLogFileSize = *((SaUint64T *) value);
>-                      i_maxLogFileSize_mod = true;
>+                      i_streamMaxLogFileSize = *((SaUint64T *) value);
>+                      i_streamMaxLogFileSize_mod = true;
>                       TRACE("\t448 Saved attribute \"%s\"", attribute-
>>attrName);
>
>               } else if (!strcmp(attribute->attrName,
>"saLogStreamFixedLogRecordSize")) {
>                       /* Save and compare with MaxLogFileSize after all
>attributes
>                        * are read. Must be smaller than MaxLogFileSize
>                        */
>-                      i_fixedLogRecordSize = *((SaUint64T *) value);
>-                      i_fixedLogRecordSize_mod = true;
>+                      i_streamFixedLogRecordSize = *((SaUint64T *) value);
>+                      i_streamFixedLogRecordSize_mod = true;
>                       TRACE("\t448 Saved attribute \"%s\"", attribute-
>>attrName);
>
>               } else if (!strcmp(attribute->attrName,
>"saLogStreamLogFullAction")) {
>@@ -1436,14 +1470,14 @@ static SaAisErrorT check_attr_validity(S
>               /* saLogStreamMaxLogFileSize or
>saLogStreamFixedLogRecordSize
>                * See chk_max_filesize_recordsize_compatible() for rules
>                */
>-              if (i_maxLogFileSize_mod || i_fixedLogRecordSize_mod) {
>+              if (i_streamMaxLogFileSize_mod ||
>i_streamFixedLogRecordSize_mod) {
>                       TRACE("\t448 Check saLogStreamMaxLogFileSize,"
>                                       " saLogStreamFixedLogRecordSize");
>                       if
>(chk_max_filesize_recordsize_compatible(immOiHandle,
>-                                      i_maxLogFileSize,
>-                                      i_maxLogFileSize_mod,
>-                                      i_fixedLogRecordSize,
>-                                      i_fixedLogRecordSize_mod,
>+                                      i_streamMaxLogFileSize,
>+                                      i_streamMaxLogFileSize_mod,
>+                                      i_streamFixedLogRecordSize,
>+                                      i_streamFixedLogRecordSize_mod,
>                                       stream,
>                                       opdata->operationType,
>                                       opdata->ccbId) == false) {
>@@ -1966,6 +2000,16 @@ static void config_ccb_apply_modify(cons
>                       mailbox_lim_upd = true;
>                       lgs_cfgupd_list_create(LOG_STREAM_APP_LOW_LIMIT,
>                               uint32_str, &config_data);
>+              } else if (!strcmp(attribute->attrName, LOG_MAX_LOGRECSIZE))
>{
>+                      uint32_val = *(SaUint32T *) value;
>+                      snprintf(uint32_str, 20, "%u", uint32_val);
>+                      lgs_cfgupd_list_create(LOG_MAX_LOGRECSIZE,
>+                               uint32_str, &config_data);
>+              } else if (!strcmp(attribute->attrName,
LOG_FILE_IO_TIMEOUT))
>{
>+                      uint32_val = *(SaUint32T *) value;
>+                      snprintf(uint32_str, 20, "%u", uint32_val);
>+                      lgs_cfgupd_list_create(LOG_FILE_IO_TIMEOUT,
>+                         uint32_str, &config_data);
>               }
>
>               attrMod = opdata->param.modify.attrMods[i++];
>diff --git a/tests/logsv/logtest.c b/tests/logsv/logtest.c
>--- a/tests/logsv/logtest.c
>+++ b/tests/logsv/logtest.c
>@@ -190,7 +190,7 @@ void init_logrootpath(void)
>
>
> /**
>- * Get attribute value in string from IMM
>+ * Get attribute value from IMM
>  * @param inObjname Distinguished Name
>  * @param inAttr Attribute to search for value
>  * @param outNume The holder for the output for number data type
>attribute
>diff --git a/tests/logsv/tet_LogOiOps.c b/tests/logsv/tet_LogOiOps.c
>--- a/tests/logsv/tet_LogOiOps.c
>+++ b/tests/logsv/tet_LogOiOps.c
>@@ -28,6 +28,24 @@
> #define opensaf_user "opensaf"
> #define data_group "log-data"
>
>+/**
>+ * Due to the ticket #1443, if creating/deleting conf obj class
continuously,
>+ * logsv will be crashed or deleting action gets failed.
>+ *
>+ * For now, until the ticket is fixed, adding some delay b/w
creating/deleting
>+ * as a workaround to avoid impact on testing that frequently encounter
>+ * when running whole test suite in one go.
>+ *
>+ */
>+
>+/* Add delay 10ms. Once the #1443 is done, undefine following macro */
>+#define __ADD_SLEEP__
>+#ifdef __ADD_SLEEP__
>+static void delay_ms(void) { usleep (10*1000); }
>+#else
>+static void delay_ms(void) {};
>+#endif // __ADD_SLEEP__
>+
> static SaLogFileCreateAttributesT_2 appStreamLogFileCreateAttributes =
> {
>     .logFilePathName = DEFAULT_APP_FILE_PATH_NAME,
>@@ -1061,21 +1079,6 @@ void saLogOi_81(void)
> }
>
> /**
>- * CCB Object Modify, logMaxLogrecsize. Not allowed
>- * Result, Reject
>- */
>-void saLogOi_53(void)
>-{
>-    int rc;
>-    char command[256];
>-
>-    sprintf(command, "immcfg -a logMaxLogrecsize=%d "
>-                      "logConfig=1,safApp=safLogService 2>
/dev/null",1025);
>-    rc = system(command);
>-    rc_validate(WEXITSTATUS(rc), 1);
>-}
>-
>-/**
>  * CCB Object Modify, logStreamSystemHighLimit > logStreamSystemLowLimit.
>OK
>  * Result OK
>  */
>@@ -1211,21 +1214,6 @@ void saLogOi_62(void)
> }
>
> /**
>- * CCB Object Modify, logFileIoTimeout. Not allowed
>- * Result, Reject
>- */
>-void saLogOi_63(void)
>-{
>-    int rc;
>-    char command[256];
>-
>-    sprintf(command, "immcfg -a logFileIoTimeout=%d"
>-                      " logConfig=1,safApp=safLogService 2>
/dev/null",600);
>-    rc = system(command);
>-    rc_validate(WEXITSTATUS(rc), 1);
>-}
>-
>-/**
>  * CCB Object Modify, logFileSysConfig. Not allowed
>  * Result, Reject
>  */
>@@ -1281,6 +1269,7 @@ void saLogOi_65(void)
>       rc = system(command);
>
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>       rc_validate(WEXITSTATUS(rc), 0);
> }
>@@ -1335,6 +1324,7 @@ void saLogOi_68(void)
>       rc = system(command);
>       /* Delete the test object */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>
>       rc_validate(WEXITSTATUS(rc), 1);
>@@ -1356,6 +1346,7 @@ void saLogOi_69(void)
>       rc = system(command);
>       /* Delete the test object */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>
>       rc_validate(WEXITSTATUS(rc), 0);
>@@ -1411,6 +1402,7 @@ void saLogOi_72(void)
>       rc = system(command);
>       /* Delete the test object */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>       rc_validate(WEXITSTATUS(rc), 0);
> }
>@@ -1437,6 +1429,7 @@ void saLogOi_73(void)
>
>       /* Delete the test object */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       rc = tet_system(command);
>       if (rc != 0) {
>               fprintf(stderr, "%s Fail rc=%d\n", command, rc);
>@@ -1468,6 +1461,7 @@ void saLogOi_74(void)
>       }
>       /* Delete the test object */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       rc = tet_system(command);
>       if (rc != 0) {
>               fprintf(stderr, "'%s' Fail rc=%d\n", command, rc);
>@@ -1510,6 +1504,7 @@ void saLogOi_76(void)
>       rc = system(command);
>       /* Delete the test object */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>       rc_validate(WEXITSTATUS(rc), 0);
> }
>@@ -1587,6 +1582,7 @@ void saLogOi_100(void)
>       rc = system(command);
>       /* Delete */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>
>       rc_validate(WEXITSTATUS(rc), 0);
>@@ -1615,6 +1611,7 @@ void saLogOi_101(void)
>       rc = system(command);
>       /* Delete */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>
>       rc_validate(WEXITSTATUS(rc), 1);
>@@ -1643,6 +1640,7 @@ void saLogOi_102(void)
>       rc = system(command);
>       /* Delete */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>
>       rc_validate(WEXITSTATUS(rc), 1);
>@@ -1671,6 +1669,7 @@ void saLogOi_103(void)
>       rc = system(command);
>       /* Delete */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>
>       rc_validate(WEXITSTATUS(rc), 1);
>@@ -1705,8 +1704,10 @@ void saLogOi_104(void)
>
>       /* Delete */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>       sprintf(command,"immcfg -d safLgStrCfg=str6a,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>       rc_validate(WEXITSTATUS(rc), 0);
> }
>@@ -1733,6 +1734,7 @@ void saLogOi_105(void)
>       rc = system(command);
>       /* Delete */
>       sprintf(command,"immcfg -d safLgStrCfg=str6a,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>
>       rc_validate(WEXITSTATUS(rc), 0);
>@@ -1760,6 +1762,7 @@ void saLogOi_106(void)
>       rc = system(command);
>       /* Delete */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>
>       rc_validate(WEXITSTATUS(rc), 0);
>@@ -1788,6 +1791,7 @@ void saLogOi_107(void)
>       rc = system(command);
>       /* Delete */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>
>       rc_validate(WEXITSTATUS(rc), 1);
>@@ -1816,6 +1820,7 @@ void saLogOi_108(void)
>       rc = system(command);
>       /* Delete */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>
>       rc_validate(WEXITSTATUS(rc), 1);
>@@ -1844,6 +1849,7 @@ void saLogOi_109(void)
>       rc = system(command);
>       /* Delete */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>
>       rc_validate(WEXITSTATUS(rc), 0);
>@@ -1872,6 +1878,7 @@ void saLogOi_110(void)
>       rc = system(command);
>       /* Delete */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>
>       rc_validate(WEXITSTATUS(rc), 0);
>@@ -1900,6 +1907,7 @@ void saLogOi_111(void)
>       rc = system(command);
>       /* Delete */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>
>       rc_validate(WEXITSTATUS(rc), 0);
>@@ -1928,6 +1936,7 @@ void saLogOi_112(void)
>       rc = system(command);
>       /* Delete */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>
>       rc_validate(WEXITSTATUS(rc), 1);
>@@ -1956,6 +1965,7 @@ void saLogOi_113(void)
>       rc = system(command);
>       /* Delete */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>
>       rc_validate(WEXITSTATUS(rc), 0);
>@@ -1984,6 +1994,7 @@ void saLogOi_114(void)
>       rc = system(command);
>       /* Delete */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>
>       rc_validate(WEXITSTATUS(rc), 1);
>@@ -2012,6 +2023,7 @@ void saLogOi_115(void)
>       rc = system(command);
>       /* Delete */
>       sprintf(command,"immcfg -d safLgStrCfg=str6,safApp=safLogService");
>+      delay_ms();
>       safassert(system(command),0);
>
>       rc_validate(WEXITSTATUS(rc), 1);
>@@ -2471,6 +2483,627 @@ void verDefaultLogFileFmt(void)
>
> #undef MAX_LOGRECSIZE
>
>+/**
>+ * Add test cases for ticket #1288
>+ * - logFileIoTimeout is changeable in runtime
>+ * - logMaxLogrecsize is changeable in runtime
>+ * - Max log record is up to 65535
>+ */
>+
>+#define MAX_LOGRECSIZE (65535)
>+
>+/**
>+ * CCB Object Modify, logFileIoTimeout.
>+ * Verify it is possible to change the value
>+ */
>+void verLogFileIoTimeout(void)
>+{
>+    int rc;
>+    char command[256];
>+      uint32_t val = 0;
>+      uint32_t *tmp = &val;
>+
>+      /* Get current value of logMaxApplicationStreams */
>+      rc = get_attr_value(&configurationObject, "logFileIoTimeout",
>+                                              (void **)&tmp, NULL);
>+      if (rc == -1) {
>+              /* if failed, use default value */
>+              fprintf(stderr, "Failed to get attribute value from IMM
\n");
>+              val = 500;
>+      } else {
>+              val = *tmp;
>+      }
>+
>+    sprintf(command, "immcfg -a logFileIoTimeout=%d"
>+                      " logConfig=1,safApp=safLogService 2> /dev/null",
600);
>+    rc = system(command);
>+      rc_validate(WEXITSTATUS(rc), 0);
>+
>+      /* If perform the command succesfully, restore to previous value. */
>+      if (WEXITSTATUS(rc) == 0) {
>+              sprintf(command, "immcfg -a logFileIoTimeout=%u"
>+                              " logConfig=1,safApp=safLogService 2>
>/dev/null", val);
>+              rc = system(command);
>+      }
>+}
>+
>+/**
>+ * CCB Object Modify, logFileIoTimeout < 500. Not allowed
>+ * Result, Reject
>+ */
>+void verLogFileIoTimeout_Err_01(void)
>+{
>+    int rc;
>+    char command[256];
>+
>+    sprintf(command, "immcfg -a logFileIoTimeout=%d"
>+                      " logConfig=1,safApp=safLogService 2> /dev/null",
400);
>+    rc = system(command);
>+    rc_validate(WEXITSTATUS(rc), 1);
>+}
>+
>+/**
>+ * CCB Object Modify, logFileIoTimeout > 5000. Not allowed
>+ * Result, Reject
>+ */
>+void verLogFileIoTimeout_Err_02(void)
>+{
>+    int rc;
>+    char command[256];
>+
>+    sprintf(command, "immcfg -a logFileIoTimeout=%d"
>+                      " logConfig=1,safApp=safLogService 2> /dev/null",
>6000);
>+    rc = system(command);
>+    rc_validate(WEXITSTATUS(rc), 1);
>+}
>+
>+/**
>+ * CCB Object Modify, valid logMaxLogrecsize value is in range [256 -
65535].
>+ */
>+void verLogMaxLogrecsize(void)
>+{
>+    int rc;
>+    char command[256];
>+      uint32_t logMaxRec = 0;
>+      uint32_t *tmp = &logMaxRec;
>+
>+    /* Get current value of the attribute, use default value if failed
(-1) */
>+    rc = get_attr_value(&configurationObject, "logMaxLogrecsize", (void
>**)&tmp,
>+                                              NULL);
>+    if (rc == -1) {
>+              /* Failed, use default one */
>+              fprintf(stderr, "Failed to get attribute value from IMM\n");
>+              logMaxRec = 1024;
>+    } else {
>+              logMaxRec = *tmp;
>+      }
>+
>+    sprintf(command, "immcfg -a logMaxLogrecsize=%d "
>+                      "logConfig=1,safApp=safLogService 2> /dev/null",
>MAX_LOGRECSIZE);
>+    rc = system(command);
>+    rc_validate(WEXITSTATUS(rc), 0);
>+
>+      /* Restore logMaxLogrecsize to previous value */
>+      sprintf(command, "immcfg -a logMaxLogrecsize=%d "
>+                      "logConfig=1,safApp=safLogService 2> /dev/null",
>logMaxRec);
>+    rc = system(command);
>+}
>+
>+/**
>+ * CCB Object Modify, verify the rule:
>+ * saLogStreamMaxLogFileSize > logMaxLogrecsize >=
>saLogStreamFixedLogRecordSize
>+ */
>+void verLogMaxLogrecsize_dep(void)
>+{
>+    int rc;
>+    char command[256];
>+      uint32_t logMaxRec = 0;
>+      uint32_t *tmp = &logMaxRec;
>+
>+    /* Get current value of the attribute, use default value if failed
(-1) */
>+    rc = get_attr_value(&configurationObject, "logMaxLogrecsize", (void
>**)&tmp,
>+                                              NULL);
>+    if (rc == -1) {
>+              /* Failed, use default one */
>+              fprintf(stderr, "Failed to get attribute value from IMM\n");
>+              logMaxRec = 1024;
>+    } else {
>+              logMaxRec = *tmp;
>+      }
>+
>+      /* Change the logMaxLogrecsize */
>+    sprintf(command, "immcfg -a logMaxLogrecsize=%d "
>+                      "logConfig=1,safApp=safLogService 2> /dev/null",
>1000);
>+    rc = system(command);
>+      if (WEXITSTATUS(rc)) {
>+              /* Failed to perform command. Report test failed */
>+              fprintf(stderr, "Failed to perfom command - %s \n",
command);
>+              rc_validate(WEXITSTATUS(rc), 0);
>+              return;
>+      }
>+
>+      /* Create an stream with valid values */
>+      sprintf(command, "immcfg -c SaLogStreamConfig
>safLgStrCfg=Test,safApp=safLogService"
>+                      " -a saLogStreamFileName=Test -a
>saLogStreamPathName=Test"
>+                      " -a saLogStreamFixedLogRecordSize=1000 "
>+                      " -a saLogStreamMaxLogFileSize=5000");
>+    rc = system(command);
>+      if (WEXITSTATUS(rc)) {
>+              /* Failed to perform command. Report test failed */
>+              fprintf(stderr, "Failed to perfom command - %s \n",
command);
>+              rc_validate(WEXITSTATUS(rc), 0);
>+              goto done;
>+      }
>+
>+      /* Change the logMaxLogrecsize to value less than above
>fixedLogRecordSize */
>+    sprintf(command, "immcfg -a logMaxLogrecsize=%d "
>+                      "logConfig=1,safApp=safLogService 2> /dev/null",
500);
>+    rc = system(command);
>+      if (WEXITSTATUS(rc)) {
>+              /* Failed to perform command. Report test failed */
>+              fprintf(stderr, "Failed to perfom command - %s \n",
command);
>+              rc_validate(WEXITSTATUS(rc), 0);
>+              goto free_class;
>+      }
>+
>+      /*
>+       * Change the saLogStreamMaxLogFileSize to valid value.
>+       * Verify that the command performs succesfully.
>+       */
>+    sprintf(command, "immcfg -a saLogStreamMaxLogFileSize=%d "
>+                      "safLgStrCfg=Test,safApp=safLogService 2>
/dev/null",
>6000);
>+    rc = system(command);
>+      rc_validate(WEXITSTATUS(rc), 0);
>+
>+free_class:
>+      /* Delete created obj class */
>+      sprintf(command, "immcfg -d safLgStrCfg=Test,safApp=safLogService "
>+                      "2> /dev/null");
>+    rc = system(command);
>+
>+done:
>+      /* Restore logMaxLogrecsize to previous value */
>+      sprintf(command, "immcfg -a logMaxLogrecsize=%d "
>+                      "logConfig=1,safApp=safLogService 2> /dev/null",
>logMaxRec);
>+    rc = system(command);
>+}
>+
>+/**
>+ * CCB Object Modify, logMaxLogrecsize < 256. Not allowed.
>+ */
>+void verLogMaxLogrecsize_Err_01(void)
>+{
>+    int rc;
>+    char command[256];
>+
>+    sprintf(command, "immcfg -a logMaxLogrecsize=%d "
>+                      "logConfig=1,safApp=safLogService 2> /dev/null",
255);
>+    rc = system(command);
>+    rc_validate(WEXITSTATUS(rc), 1);
>+}
>+
>+/**
>+ * CCB Object Modify, logMaxLogrecsize > 65535. Not allowed.
>+ */
>+void verLogMaxLogrecsize_Err_02(void)
>+{
>+    int rc;
>+    char command[256];
>+
>+    sprintf(command, "immcfg -a logMaxLogrecsize=%d "
>+                      "logConfig=1,safApp=safLogService 2> /dev/null",
>MAX_LOGRECSIZE + 1);
>+    rc = system(command);
>+    rc_validate(WEXITSTATUS(rc), 1);
>+}
>+
>+/**
>+ * Also add test cases to verify the rules:
>+ * ---------------------------------------
>+ * 1 - saLogStreamFixedLogRecordSize must be less than
>saLogStreamMaxLogFileSize
>+ * 2 - saLogStreamFixedLogRecordSize must be less than or equal to
>logMaxLogrecsize
>+ * 3 - saLogStreamFixedLogRecordSize can be 0. Means variable record size
>+ * 4 - saLogStreamMaxLogFileSize must be bigger than 0. No limit is not
>supported
>+ * 5 - saLogStreamMaxLogFileSize must be bigger than logMaxLogrecsize
>+ * 6 - saLogStreamMaxLogFileSize must be bigger than
>saLogStreamFixedLogRecordSize
>+ * ----------------------------------------
>+ *
>+ * For rules #2, #3, #5, test cases are already added above.
>+ */
>+
>+/**
>+ * CCB Object modify, verify rule #1/#6
>+ * saLogStreamFixedLogRecordSize < saLogStreamMaxLogFileSize. Allowed.
>+ */
>+void verFixLogRec_MaxFileSize(void)
>+{
>+    int rc;
>+    char command[256];
>+      uint32_t fixLogRec = 0;
>+      uint32_t *tmpFix = &fixLogRec;
>+      uint32_t maxFileSize = 0;
>+      uint32_t *tmpMax = &maxFileSize;
>+      uint32_t logMaxRec = 0;
>+      uint32_t *tmp = &logMaxRec;
>+
>+    /* Get current value of logMaxLogrecsize attribute, use default value
if
>failed (-1) */
>+    rc = get_attr_value(&configurationObject, "logMaxLogrecsize", (void
>**)&tmp,
>+                                              NULL);
>+    if (rc == -1) {
>+              /* Failed, use default one */
>+              fprintf(stderr, "Failed to get attribute value from IMM\n");
>+              logMaxRec = 1024;
>+    } else {
>+              logMaxRec = *tmp;
>+      }
>+
>+      /* Get current value of saLogStreamFixedLogRecordSize */
>+      rc = get_attr_value(&alarmStreamName,
>"saLogStreamFixedLogRecordSize",
>+                                              (void **)&tmpFix, NULL);
>+      if (rc == -1) {
>+              /* Report test failed and exit if getting value failed */
>+              fprintf(stderr, "Failed to get attribute value from IMM
\n");
>+              test_validate(rc, 0);
>+              return;
>+      }
>+
>+      /* Backup the current saLogStreamFixedLogRecordSize value */
>+      fixLogRec = *tmpFix;
>+
>+      /* Get current value of saLogStreamMaxLogFileSize */
>+      rc = get_attr_value(&alarmStreamName, "saLogStreamMaxLogFileSize",
>+                                              (void **)&tmpMax, NULL);
>+      if (rc == -1) {
>+              /* Report test failed and exit if getting value failed */
>+              fprintf(stderr, "Failed to get attribute value from IMM
\n");
>+              test_validate(rc, 0);
>+              return;
>+      }
>+
>+      /* Backup the current saLogStreamMaxLogFileSize value */
>+      maxFileSize = *tmpMax;
>+
>+      /* Allow to set saLogStreamMaxLogFileSize >
>saLogStreamFixedLogRecordSize */
>+      sprintf(command, "immcfg -a saLogStreamMaxLogFileSize=%d "
>+                      "-a saLogStreamFixedLogRecordSize=%d %s 2>
>/dev/null",
>+                      logMaxRec + 1, logMaxRec, SA_LOG_STREAM_ALARM);
>+    rc = system(command);
>+      rc_validate(WEXITSTATUS(rc), 0);
>+
>+      /* Restore the changed value */
>+      if (WEXITSTATUS(rc) == 0) {
>+              sprintf(command, "immcfg -a saLogStreamMaxLogFileSize=%d "
>+                              " -a saLogStreamFixedLogRecordSize=%d %s 2>
>/dev/null",
>+                              maxFileSize, fixLogRec,
>SA_LOG_STREAM_ALARM);
>+              rc = system(command);
>+      }
>+}
>+
>+/**
>+ * CCB Object modify, verify rule #1/#6
>+ * saLogStreamFixedLogRecordSize > saLogStreamMaxLogFileSize. Not allowed.
>+ */
>+void verFixLogRec_MaxFileSize_Err(void)
>+{
>+    int rc;
>+    char command[256];
>+      uint32_t fixLogRec = 0;
>+      uint32_t *tmpFix = &fixLogRec;
>+      uint32_t maxFileSize = 0;
>+      uint32_t *tmpMax = &maxFileSize;
>+
>+      /* Get current value of saLogStreamFixedLogRecordSize */
>+      rc = get_attr_value(&alarmStreamName,
>"saLogStreamFixedLogRecordSize",
>+                                              (void **)&tmpFix, NULL);
>+      if (rc == -1) {
>+              /* Report test failed and exit if getting value failed */
>+              fprintf(stderr, "Failed to get attribute value from IMM
\n");
>+              test_validate(rc, 0);
>+              return;
>+      }
>+
>+      /* Backup the current saLogStreamFixedLogRecordSize value */
>+      fixLogRec = *tmpFix;
>+
>+      /* Get current value of saLogStreamMaxLogFileSize */
>+      rc = get_attr_value(&alarmStreamName, "saLogStreamMaxLogFileSize",
>+                                              (void **)&tmpMax, NULL);
>+      if (rc == -1) {
>+              /* Report test failed and exit if getting value failed */
>+              fprintf(stderr, "Failed to get attribute value from IMM
\n");
>+              test_validate(rc, 0);
>+              return;
>+      }
>+
>+      /* Backup the current saLogStreamMaxLogFileSize value */
>+      maxFileSize = *tmpMax;
>+
>+      /* Not allow to set saLogStreamMaxLogFileSize <
>saLogStreamFixedLogRecordSize */
>+      sprintf(command, "immcfg -a saLogStreamMaxLogFileSize=%d %s 2>
>/dev/null",
>+                      fixLogRec - 1, SA_LOG_STREAM_ALARM);
>+    rc = system(command);
>+      rc_validate(WEXITSTATUS(rc), 1);
>+
>+      /* Restore the changed value */
>+      if (WEXITSTATUS(rc) == 0) {
>+              sprintf(command, "immcfg -a saLogStreamMaxLogFileSize=%d
>%s 2> /dev/null",
>+                              maxFileSize, SA_LOG_STREAM_ALARM);
>+              rc = system(command);
>+      }
>+}
>+
>+/**
>+ * CCB Object modify, verify rule #4
>+ * saLogStreamMaxLogFileSize = 0. Not allowed.
>+ */
>+void verMaxLogFileSize_Err(void)
>+{
>+    int rc;
>+    char command[256];
>+      uint32_t val = 0;
>+      uint32_t *tmp = &val;
>+
>+      /* Get current value of logMaxApplicationStreams */
>+      rc = get_attr_value(&alarmStreamName, "saLogStreamMaxLogFileSize",
>+                                              (void **)&tmp, NULL);
>+      if (rc == -1) {
>+              /* Report test failed and exit if getting value failed */
>+              fprintf(stderr, "Failed to get attribute value from IMM
\n");
>+              test_validate(rc, 0);
>+              return;
>+      }
>+
>+      /* Backup the current value */
>+      val = *tmp;
>+
>+      /* Allow to set saLogStreamMaxLogFileSize=0 */
>+      sprintf(command, "immcfg -a saLogStreamMaxLogFileSize=0 %s 2>
>/dev/null",
>+                      SA_LOG_STREAM_ALARM);
>+    rc = system(command);
>+      rc_validate(WEXITSTATUS(rc), 1);
>+
>+      /* Restore the changed value */
>+      if (WEXITSTATUS(rc) == 0) {
>+              sprintf(command, "immcfg -a saLogStreamMaxLogFileSize=%d
>%s 2> /dev/null",
>+                              val, SA_LOG_STREAM_ALARM);
>+              rc = system(command);
>+      }
>+}
>+
>+/**
>+ * Write a maximum log record to app stream.
>+ * Then, verify if it is done succesfully or not.
>+ *
>+ * Steps:
>+ *
>+ * 1. Change the logMaxLogrecsize value to maximum one.
>+ * 2. Create application stream with saLogStreamFixedLogRecordSize
>+ *    equal to logMaxLogrecsize (maximum value).
>+ * 3. Create a log record buffer with 65535 bytes.
>+ * 4. Using saflogger tool, writing that buffer to the created app stream.
>+ * 5. Get file size of the app stream log file
>+ * 6. Verify if the size of file is larger than 65535 bytes or not
>+ * 7. Delete created app class
>+ */
>+
>+void verMaxLogRecord_01(void)
>+{
>+    int rc;
>+    char command[66000];
>+      char logRecord[MAX_LOGRECSIZE];
>+      uint32_t logMaxRec = 0;
>+      uint32_t *tmp = &logMaxRec;
>+
>+    /* Get current value of the attribute, use default value if failed
(-1) */
>+    rc = get_attr_value(&configurationObject, "logMaxLogrecsize", (void
>**)&tmp,
>+                                              NULL);
>+    if (rc == -1) {
>+              /* Failed, use default one */
>+              fprintf(stderr, "Failed to get attribute value from IMM\n");
>+              logMaxRec = 1024;
>+    } else {
>+              logMaxRec = *tmp;
>+      }
>+
>+      /* Change the attribute value to maximum one */
>+      sprintf(command, "immcfg -a logMaxLogrecsize=%u"
>+                      " logConfig=1,safApp=safLogService 2> /dev/null",
>MAX_LOGRECSIZE);
>+
>+      rc = system(command);
>+      if (WEXITSTATUS(rc)) {
>+              /* Failed to set logMaxLogrecsize. Report test failed */
>+              fprintf(stderr, "Failed to perform command = %s\n",
>command);
>+              rc_validate(WEXITSTATUS(rc), 0);
>+              return;
>+      }
>+
>+      /* Set saLogStreamFixedLogRecordSize = 0, fix log record =
>maxLogRecordSize */
>+      sprintf(command, "immcfg -c SaLogStreamConfig
>safLgStrCfg=maxrecsize,safApp=safLogService"
>+                      " -a saLogStreamFileName=verMaxLogrecsize -a
>saLogStreamPathName=vermaxsize"
>+                      " -a saLogStreamFixedLogRecordSize=0");
>+
>+      rc = system(command);
>+      if (WEXITSTATUS(rc)) {
>+              /* Fail to perform the command. Report TC failed */
>+              fprintf(stderr, "Failed to perform command = %s", command);
>+              rc_validate(WEXITSTATUS(rc), 0);
>+              goto done;
>+      }
>+
>+      /* Prepare log record data */
>+      memset(logRecord, 'A', MAX_LOGRECSIZE - 2);
>+      logRecord[MAX_LOGRECSIZE - 1] = '\0';
>+
>+      sprintf(command, "saflogger -a
>safLgStrCfg=maxrecsize,safApp=safLogService \"%s\"",
>+                      logRecord);
>+
>+    rc = system(command);
>+      if (WEXITSTATUS(rc)) {
>+              /* Fail to perform command. Report test failed. */
>+              fprintf(stderr, "Failed to perform command = %s\n",
>command);
>+              rc_validate(WEXITSTATUS(rc), 0);
>+              goto free_class;
>+      }
>+      /* Write log record succesfully. Then, measure the log file size. */
>+      FILE *fp = NULL;
>+      char fileSize_c[10];
>+      uint32_t fileSize = 0;
>+
>+      /* Command to get exact app stream log file, and measure that file
>size. */
>+      sprintf(command, "find %s/vermaxsize -type f -mmin -1 "
>+                      "| egrep \"%s_([0-9]{8}_[0-9]{6}\\.log$)\" "
>+                      "| xargs wc -c | awk '{printf $1}'",
>+                      log_root_path, "verMaxLogrecsize");
>+
>+      fp = popen(command, "r");
>+
>+      if (fp == NULL) {
>+              /* Fail to read size of log file. Report test failed. */
>+              fprintf(stderr, "Failed to run command = %s\n", command);
>+              test_validate(1, 0);
>+              goto free_class;
>+      }
>+      /* Get output of the command - actually the file size in chars */
>+      while (fgets(fileSize_c, sizeof(fileSize_c) - 1, fp) != NULL) {};
>+      pclose(fp);
>+
>+      /* Convert chars to number */
>+      fileSize = atoi(fileSize_c);
>+
>+      if (fileSize < MAX_LOGRECSIZE) {
>+              fprintf(stderr, "Log file size (%u) is less than %d \n",
>+                              fileSize, MAX_LOGRECSIZE);
>+              test_validate(fileSize, MAX_LOGRECSIZE);
>+              goto free_class;
>+      } else {
>+              rc_validate(WEXITSTATUS(rc), 0);
>+      }
>+
>+free_class:
>+      /* Delete class created */
>+      (void)strcpy(command, "immcfg -d
>safLgStrCfg=maxrecsize,safApp=safLogService");
>+      rc = system(command);
>+
>+done:
>+      /* Restore logMaxLogrecsize to previous value */
>+      sprintf(command, "immcfg -a logMaxLogrecsize=%d "
>+                      "logConfig=1,safApp=safLogService 2> /dev/null",
>logMaxRec);
>+    rc = system(command);
>+}
>+
>+/**
>+ * Write a log record containing special characters.
>+ * Make sure the logsv functions normally.
>+ */
>+void verMaxLogRecord_02(void)
>+{
>+    int rc;
>+    char command[66000];
>+      char logRecord[MAX_LOGRECSIZE];
>+      uint32_t logMaxRec = 0;
>+      uint32_t *tmp = &logMaxRec;
>+
>+    /* Get current value of the attribute, use default value if failed
(-1) */
>+    rc = get_attr_value(&configurationObject, "logMaxLogrecsize", (void
>**)&tmp,
>+                                              NULL);
>+    if (rc == -1) {
>+              /* Failed, use default one */
>+              fprintf(stderr, "Failed to get attribute value from IMM\n");
>+              logMaxRec = 1024;
>+    } else {
>+              logMaxRec = *tmp;
>+      }
>+
>+      /* Change the attribute value to maximum one */
>+      sprintf(command, "immcfg -a logMaxLogrecsize=%u"
>+                      " logConfig=1,safApp=safLogService 2> /dev/null",
>MAX_LOGRECSIZE);
>+
>+      rc = system(command);
>+      if (WEXITSTATUS(rc)) {
>+              /* Failed to set logMaxLogrecsize. Report test failed */
>+              fprintf(stderr, "Failed to perform command = %s\n",
>command);
>+              rc_validate(WEXITSTATUS(rc), 0);
>+              return;
>+      }
>+      /* Set saLogStreamFixedLogRecordSize = max */
>+      sprintf(command, "immcfg -c SaLogStreamConfig
>safLgStrCfg=specialCharactor,safApp=safLogService"
>+                      " -a saLogStreamFileName=specialCharactor -a
>saLogStreamPathName=vermaxsize"
>+                      " -a saLogStreamFixedLogRecordSize=%d",
>MAX_LOGRECSIZE);
>+
>+      rc = system(command);
>+      if (WEXITSTATUS(rc)) {
>+              /* Fail to perform the command. Report TC failed */
>+              fprintf(stderr, "Failed to perform command = %s", command);
>+              rc_validate(WEXITSTATUS(rc), 0);
>+              goto done;
>+      }
>+
>+      /* Prepare log record data with special characters */
>+      memset(logRecord, 'A', MAX_LOGRECSIZE - 2);
>+      logRecord[1] = '\t';
>+      logRecord[2] = 't';
>+      logRecord[3] = '\n';
>+      logRecord[4] = 'n';
>+      logRecord[5] = ' ';
>+      logRecord[6] = 'S';
>+      logRecord[MAX_LOGRECSIZE - 1] = '\0';
>+
>+      sprintf(command, "saflogger -a
>safLgStrCfg=specialCharactor,safApp=safLogService \"%s\"",
>+                      logRecord);
>+
>+    rc = system(command);
>+      if (WEXITSTATUS(rc)) {
>+              /* Fail to perform command. Report test failed. */
>+              fprintf(stderr, "Failed to perform command = %s\n",
>command);
>+              rc_validate(WEXITSTATUS(rc), 0);
>+              goto free_class;
>+      }
>+      /* Write log record succesfully. Then, measure the log file size. */
>+      FILE *fp = NULL;
>+      char fileSize_c[10];
>+      uint32_t fileSize = 0;
>+
>+      /* Command to get exact app stream log file, and measure that file
>size. */
>+      sprintf(command, "find %s/vermaxsize -type f -mmin -1 "
>+                      "| egrep \"%s_([0-9]{8}_[0-9]{6}\\.log$)\" "
>+                      "| xargs wc -c | awk '{printf $1}'",
>+                      log_root_path, "specialCharactor");
>+
>+      fp = popen(command, "r");
>+
>+      if (fp == NULL) {
>+              /* Fail to read size of log file. Report test failed. */
>+              fprintf(stderr, "Failed to run command = %s\n", command);
>+              test_validate(1, 0);
>+              goto free_class;
>+      }
>+      /* Get output of the command - actually the file size in chars */
>+      while (fgets(fileSize_c, sizeof(fileSize_c) - 1, fp) != NULL) {};
>+      pclose(fp);
>+
>+      /* Convert chars to number */
>+      fileSize = atoi(fileSize_c);
>+
>+      if (fileSize < MAX_LOGRECSIZE) {
>+              fprintf(stderr, "Log file size (%u) is less than %d \n",
>+                              fileSize, MAX_LOGRECSIZE);
>+              test_validate(fileSize, MAX_LOGRECSIZE);
>+              goto free_class;
>+      } else {
>+              rc_validate(WEXITSTATUS(rc), 0);
>+      }
>+
>+free_class:
>+      /* Delete class created */
>+      (void)strcpy(command, "immcfg -d
>safLgStrCfg=specialCharactor,safApp=safLogService");
>+      rc = system(command);
>+
>+done:
>+      /* Restore logMaxLogrecsize to previous value */
>+      sprintf(command, "immcfg -a logMaxLogrecsize=%d "
>+                      "logConfig=1,safApp=safLogService 2> /dev/null",
>logMaxRec);
>+    rc = system(command);
>+}
>+
> __attribute__ ((constructor)) static void saOiOperations_constructor(void)
> {
>       /* Stream objects */
>@@ -2546,7 +3179,6 @@ void verDefaultLogFileFmt(void)
>     test_case_add(5, saLogOi_79, "CCB Object Modify, data group. Group
does
>not exist. Not allowed");
>     test_case_add(5, saLogOi_80, "CCB Object Modify, data group. Group
exists.
>OK");
>     test_case_add(5, saLogOi_81, "CCB Object Modify, delete data group.
OK");
>-    test_case_add(5, saLogOi_53, "CCB Object Modify, logMaxLogrecsize. Not
>allowed");
>     test_case_add(5, saLogOi_54, "CCB Object Modify,
>logStreamSystemHighLimit > logStreamSystemLowLimit. OK");
>     test_case_add(5, saLogOi_55, "CCB Object Modify,
>logStreamSystemHighLimit = logStreamSystemLowLimit, != 0. Ok");
>     test_case_add(5, saLogOi_56, "CCB Object Modify,
>logStreamSystemHighLimit < logStreamSystemLowLimit. Error");
>@@ -2556,9 +3188,17 @@ void verDefaultLogFileFmt(void)
>     test_case_add(5, saLogOi_60, "CCB Object Modify, logStreamAppHighLimit
<
>logStreamAppLowLimit. Error");
>     test_case_add(5, saLogOi_61, "CCB Object Modify, logStreamAppHighLimit
=
>logStreamAppLowLimit = 0. OK");
>     test_case_add(5, saLogOi_62, "CCB Object Modify,
>logMaxApplicationStreams. Not allowed");
>-    test_case_add(5, saLogOi_63, "CCB Object Modify, logFileIoTimeout. Not
>allowed");
>     test_case_add(5, saLogOi_64, "CCB Object Modify, logFileSysConfig. Not
>allowed");
>-
>+
>+      /* Add test cases to test #1288 */
>+      test_case_add(5, verLogFileIoTimeout, "CCB Object Modify:
>logFileIoTimeout is in range [500 - 5000], OK");
>+      test_case_add(5, verLogFileIoTimeout_Err_01, "CCB Object Modify:
>logFileIoTimeout < 500, ERR");
>+      test_case_add(5, verLogFileIoTimeout_Err_02, "CCB Object Modify:
>logFileIoTimeout > 5000, ERR");
>+      test_case_add(5, verLogMaxLogrecsize, "CCB Object Modify:
>logMaxLogrecsize is in range [256 - 65535], OK");
>+      test_case_add(5, verLogMaxLogrecsize_dep, "CCB Object Modify:
>logMaxLogrecsize dependencies, OK");
>+      test_case_add(5, verLogMaxLogrecsize_Err_01, "CCB Object Modify:
>logMaxLogrecsize < 256, ERR");
>+      test_case_add(5, verLogMaxLogrecsize_Err_02, "CCB Object Modify:
>logMaxLogrecsize > 65535, ERR");
>+
>       /* Stream configuration object */
>       /* Tests for create */
>       test_suite_add(6, "LOG OI tests, Stream configuration object
attribute
>validation");
>@@ -2586,6 +3226,9 @@ void verDefaultLogFileFmt(void)
>       test_case_add(6, saLogOi_106, "Modify: saLogStreamMaxLogFileSize >
>logMaxLogrecsize, Ok");
>       test_case_add(6, saLogOi_107, "Modify: saLogStreamMaxLogFileSize ==
>logMaxLogrecsize, ERR");
>       test_case_add(6, saLogOi_108, "Modify: saLogStreamMaxLogFileSize <
>logMaxLogrecsize, ERR");
>+      test_case_add(6, verFixLogRec_MaxFileSize, "Modify:
>saLogStreamMaxLogFileSize > saLogStreamFixedLogRecordSize, OK");
>+      test_case_add(6, verFixLogRec_MaxFileSize_Err, "Modify:
>saLogStreamMaxLogFileSize <= saLogStreamFixedLogRecordSize, ERR");
>+      test_case_add(6, verMaxLogFileSize_Err, "Modify:
>saLogStreamMaxLogFileSize == 0, ERR");
>       test_case_add(6, saLogOi_109, "Modify:
>saLogStreamFixedLogRecordSize < logMaxLogrecsize, Ok");
>       test_case_add(6, saLogOi_110, "Modify:
>saLogStreamFixedLogRecordSize == 0, Ok");
>       test_case_add(6, saLogOi_111, "Modify:
>saLogStreamFixedLogRecordSize == logMaxLogrecsize, Ok");
>@@ -2593,4 +3236,9 @@ void verDefaultLogFileFmt(void)
>       test_case_add(6, saLogOi_113, "Modify: saLogStreamMaxFilesRotated <
>128, Ok");
>       test_case_add(6, saLogOi_114, "Modify: saLogStreamMaxFilesRotated >
>128, ERR");
>       test_case_add(6, saLogOi_115, "Modify: saLogStreamMaxFilesRotated
>== 128, ERR");
>+
>+      /* Add test cases to test #1288 */
>+      test_case_add(6, verMaxLogRecord_01, "Modify:
>saLogStreamFixedLogRecordSize == 0, write a record = 65535 bytes, OK");
>+      test_case_add(6, verMaxLogRecord_02, "Modify:
>saLogStreamFixedLogRecordSize == 65535, Write a record = 65535 bytes with
>special characters, OK");
>+
> }


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

Reply via email to