osaf/services/saf/logsv/lgs/lgs_evt.c     |    3 -
 osaf/services/saf/logsv/lgs/lgs_file.c    |    2 +-
 osaf/services/saf/logsv/lgs/lgs_filehdl.c |    2 +-
 osaf/services/saf/logsv/lgs/lgs_imm.c     |    1 -
 osaf/services/saf/logsv/lgs/lgs_mbcsv.c   |    7 -
 osaf/services/saf/logsv/lgs/lgs_mbcsv.h   |    3 -
 osaf/services/saf/logsv/lgs/lgs_stream.c  |  111 +++++++++++------------------
 osaf/services/saf/logsv/lgs/lgs_stream.h  |    1 -
 8 files changed, 43 insertions(+), 87 deletions(-)


- Always reinitialize/reopen log files if a write operation fails,
  timeout of file thread (hanging file system) included.
- Handle synchronization between nodes when log files cannot be created before
  a switch over without using any new flag that has to be checkpointed
  (remove "files_initialized" flag)
- Incorrect handling of "partial write" is fixed. See #536

diff --git a/osaf/services/saf/logsv/lgs/lgs_evt.c 
b/osaf/services/saf/logsv/lgs/lgs_evt.c
--- a/osaf/services/saf/logsv/lgs/lgs_evt.c
+++ b/osaf/services/saf/logsv/lgs/lgs_evt.c
@@ -707,8 +707,6 @@ static uint32_t lgs_ckpt_stream_open(lgs
 
                ckpt.ckpt_rec.stream_open.streamType = logStream->streamType;
                ckpt.ckpt_rec.stream_open.logRecordId = logStream->logRecordId;
-               
-               ckpt.ckpt_rec.stream_open.files_initiated = 
logStream->files_initiated;
 
                async_rc = lgs_ckpt_send_async(cb, &ckpt, NCS_MBCSV_ACT_ADD);
                if (async_rc == NCSCC_RC_SUCCESS) {
@@ -1088,7 +1086,6 @@ static uint32_t proc_write_log_async_msg
                ckpt.ckpt_rec.write_log.streamId = stream->streamId;
                ckpt.ckpt_rec.write_log.curFileSize = stream->curFileSize;
                ckpt.ckpt_rec.write_log.logFileCurrent = stream->logFileCurrent;
-               ckpt.ckpt_rec.write_log.files_initiated = 
stream->files_initiated;
 
                (void)lgs_ckpt_send_async(cb, &ckpt, NCS_MBCSV_ACT_ADD);
        }
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
@@ -159,7 +159,7 @@ static void *file_hndl_thread(void *nopa
 //#define LLD_DELAY_TST
 #ifdef LLD_DELAY_TST /* Make "file system" hang for n sec after start */
        static bool lld_start_f = true;
-       const unsigned int lld_sleep_sec = 60;
+       const unsigned int lld_sleep_sec = 10;
 #endif
        
        TRACE("%s - is started",__FUNCTION__);
diff --git a/osaf/services/saf/logsv/lgs/lgs_filehdl.c 
b/osaf/services/saf/logsv/lgs/lgs_filehdl.c
--- a/osaf/services/saf/logsv/lgs/lgs_filehdl.c
+++ b/osaf/services/saf/logsv/lgs/lgs_filehdl.c
@@ -251,7 +251,7 @@ int write_log_record_hdl(void *indata, v
        } else {
                /* Handle partial writes */
                bytes_written += rc;
-               if (bytes_written < params_in->fixedLogRecordSize)
+               if (bytes_written < params_in->record_size)
                        goto retry;
        }
  
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
@@ -150,7 +150,6 @@ static uint32_t ckpt_stream(log_stream_t
        ckpt.ckpt_rec.stream_cfg.logFileFormat = stream->logFileFormat;
        ckpt.ckpt_rec.stream_cfg.severityFilter = stream->severityFilter;
        ckpt.ckpt_rec.stream_cfg.logFileCurrent = stream->logFileCurrent;
-       ckpt.ckpt_rec.stream_cfg.files_initiated = stream->files_initiated;
 
        rc = lgs_ckpt_send_async(lgs_cb, &ckpt, NCS_MBCSV_ACT_ADD);
 
diff --git a/osaf/services/saf/logsv/lgs/lgs_mbcsv.c 
b/osaf/services/saf/logsv/lgs/lgs_mbcsv.c
--- a/osaf/services/saf/logsv/lgs/lgs_mbcsv.c
+++ b/osaf/services/saf/logsv/lgs/lgs_mbcsv.c
@@ -449,7 +449,6 @@ uint32_t lgs_ckpt_stream_open_set(log_st
        stream_open->numOpeners = logStream->numOpeners;
        stream_open->streamType = logStream->streamType;
        stream_open->logRecordId = logStream->logRecordId;
-       stream_open->files_initiated = logStream->files_initiated;
 
        return NCSCC_RC_SUCCESS;
 }
@@ -1094,7 +1093,6 @@ static uint32_t ckpt_proc_log_write(lgs_
        stream->logRecordId = param->recordId;
        stream->curFileSize = param->curFileSize;
        strcpy(stream->logFileCurrent, param->logFileCurrent);
-       stream->files_initiated = param->files_initiated;
 
  done:
        free_edu_mem(param->logFileCurrent);
@@ -1196,7 +1194,6 @@ uint32_t ckpt_proc_open_stream(lgs_cb_t 
                stream->numOpeners = param->numOpeners;
                stream->creationTimeStamp = param->creationTimeStamp;
                strcpy(stream->logFileCurrent, param->logFileCurrent);
-               stream->files_initiated = param->files_initiated;
        }
 
        log_stream_print(stream);
@@ -1320,7 +1317,6 @@ static uint32_t ckpt_proc_cfg_stream(lgs
        strcpy(stream->logFileFormat, param->logFileFormat);
        stream->severityFilter = param->severityFilter;
        strcpy(stream->logFileCurrent, param->logFileCurrent);
-       stream->files_initiated = param->files_initiated;
 
  done:
        /* Free strings allocated by the EDU encoder */
@@ -1569,7 +1565,6 @@ static uint32_t edp_ed_write_rec(EDU_HDL
                {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, 
(long)&((lgs_ckpt_write_log_t *)0)->streamId, 0, NULL},
                {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, 
(long)&((lgs_ckpt_write_log_t *)0)->curFileSize, 0, NULL},
                {EDU_EXEC, ncs_edp_string, 0, 0, 0, 
(long)&((lgs_ckpt_write_log_t *)0)->logFileCurrent, 0, NULL},
-               {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, 
(long)&((lgs_ckpt_write_log_t *)0)->files_initiated, 0, NULL},
                {EDU_END, 0, 0, 0, 0, 0, 0, NULL},
        };
 
@@ -1636,7 +1631,6 @@ static uint32_t edp_ed_open_stream_rec(E
                {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, 
(long)&((lgs_ckpt_stream_open_t *)0)->numOpeners, 0, NULL},
                {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, 
(long)&((lgs_ckpt_stream_open_t *)0)->streamType, 0, NULL},
                {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, 
(long)&((lgs_ckpt_stream_open_t *)0)->logRecordId, 0, NULL},
-               {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, 
(long)&((lgs_ckpt_stream_open_t *)0)->files_initiated, 0, NULL},
                {EDU_END, 0, 0, 0, 0, 0, 0, NULL},
        };
 
@@ -1804,7 +1798,6 @@ static uint32_t edp_ed_cfg_stream_rec(ED
                {EDU_EXEC, ncs_edp_string, 0, 0, 0, 
(long)&((lgs_ckpt_stream_cfg_t *)0)->logFileFormat, 0, NULL},
                {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, 
(long)&((lgs_ckpt_stream_cfg_t *)0)->severityFilter, 0, NULL},
                {EDU_EXEC, ncs_edp_string, 0, 0, 0, 
(long)&((lgs_ckpt_stream_cfg_t *)0)->logFileCurrent, 0, NULL},
-               {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, 
(long)&((lgs_ckpt_stream_cfg_t *)0)->files_initiated , 0, NULL},
                {EDU_END, 0, 0, 0, 0, 0, 0, NULL},
        };
 
diff --git a/osaf/services/saf/logsv/lgs/lgs_mbcsv.h 
b/osaf/services/saf/logsv/lgs/lgs_mbcsv.h
--- a/osaf/services/saf/logsv/lgs/lgs_mbcsv.h
+++ b/osaf/services/saf/logsv/lgs/lgs_mbcsv.h
@@ -60,7 +60,6 @@ typedef struct {
        uint32_t recordId;
        uint32_t curFileSize;
        char *logFileCurrent;
-       bool files_initiated;
 } lgs_ckpt_write_log_t;
 
 typedef struct {
@@ -81,7 +80,6 @@ typedef struct {
        char *logFileCurrent;
        logStreamTypeT streamType;
        uint32_t logRecordId;   /* log record indentifier increased for each 
record */
-       bool files_initiated;
 } lgs_ckpt_stream_open_t;
 
 typedef struct {
@@ -111,7 +109,6 @@ typedef struct {
        char *logFileFormat;
        SaUint32T severityFilter;
        char *logFileCurrent;
-       bool files_initiated;
 } lgs_ckpt_stream_cfg_t;
 
 typedef struct {
diff --git a/osaf/services/saf/logsv/lgs/lgs_stream.c 
b/osaf/services/saf/logsv/lgs/lgs_stream.c
--- a/osaf/services/saf/logsv/lgs/lgs_stream.c
+++ b/osaf/services/saf/logsv/lgs/lgs_stream.c
@@ -277,12 +277,7 @@ static uint32_t log_stream_remove(const 
 }
 
 /**
- * Initiate the files belonging to a stream if they are not already initiated.
- * The stream->files_initiated flag is set when the files are initiated.
- * If the files could not be initiated e.g. the file system is not working, the
- * files_initiated flag will not be set.
- * This function should be used when a stream is opened and every time a log
- * record is written.
+ * Initiate the files belonging to a stream
  * 
  * @param stream
  */
@@ -291,41 +286,35 @@ static void log_initiate_stream_files(lo
        int errno_save;
        
        TRACE_ENTER();
-       TRACE_2("%s - stream->files_initiated = 
%d",__FUNCTION__,stream->files_initiated);
        
-       if (stream->files_initiated == false) {
-               
-               /* Delete to get counting right. It might not exist. */
-               (void)delete_config_file(stream);
+       /* Initiate stream file descriptor to flag that no valid descriptor 
exist */
+       stream->fd = -1;
+       
+       /* Delete to get counting right. It might not exist. */
+       (void)delete_config_file(stream);
 
-               /* Save what filename that shall be the current log file */
-               snprintf(stream->logFileCurrent, NAME_MAX, "%s_%s", 
stream->fileName, lgs_get_time());
+       /* Remove files from a previous life if needed */
+       if (rotate_if_needed(stream) == -1) {
+               TRACE("%s - rotate_if_needed() FAIL",__FUNCTION__);
+               goto done;
+       }
 
-               /* Remove files from a previous life if needed */
-               if (rotate_if_needed(stream) == -1) {
-                       TRACE("%s - rotate_if_needed() FAIL",__FUNCTION__);
-                       goto done;
-               }
+       if (lgs_make_reldir_h(stream->pathName) != 0){
+               TRACE("%s - lgs_make_dir_h() FAIL",__FUNCTION__);
+               goto done;
+       }
 
-               if (lgs_make_reldir_h(stream->pathName) != 0){
-                       TRACE("%s - lgs_make_dir_h() FAIL",__FUNCTION__);
-                       goto done;
-               }
+       if (lgs_create_config_file_h(stream) != 0) {
+               TRACE("%s - lgs_create_config_file_h() FAIL",__FUNCTION__);
+               goto done;
+       }
 
-               if (lgs_create_config_file_h(stream) != 0) {
-                       TRACE("%s - lgs_create_config_file_h() 
FAIL",__FUNCTION__);
-                       goto done;
-               }
+       if ((stream->fd = log_file_open(stream, &errno_save)) == -1) {
+               TRACE("%s - Could not open '%s' - %s",__FUNCTION__,
+                               stream->logFileCurrent, strerror(errno_save));
+               goto done;
+       }
 
-               if ((stream->fd = log_file_open(stream, &errno_save)) == -1) {
-                       TRACE("%s - Could not open '%s' - %s",__FUNCTION__,
-                                       stream->logFileCurrent, 
strerror(errno_save));
-                       goto done;
-               }
-               
-               stream->files_initiated = true;
-       }
-       
 done:
        TRACE_LEAVE();
 }
@@ -728,12 +717,9 @@ SaAisErrorT log_stream_open(log_stream_t
 
        /* first time open? */
        if (stream->numOpeners == 0) {
+               /* Create and save current log file name */
+               snprintf(stream->logFileCurrent, NAME_MAX, "%s_%s", 
stream->fileName, lgs_get_time());
                log_initiate_stream_files(stream);
-       } else {
-               /* Second or more open on a stream */
-               if (stream->fd == -1) {
-                       log_initiate_stream_files(stream);
-               }
        }
        
        /* Opening a stream will always succeed. If file system problem a new
@@ -914,26 +900,17 @@ int log_stream_write_h(log_stream_t *str
        /* Open files on demand e.g. on new active after fail/switch-over. This
         * enables LOG to cope with temporary file system problems. */
        if (stream->fd == -1) {
-               /* Creating directory of given path to store log and cfg files,
-                * if not using shared file system. */
-               if (lgs_make_reldir_h(stream->pathName) != 0) {
-                       LOG_NO("Create directory '%s/%s' failed", 
lgs_cb->logsv_root_dir, stream->pathName);
-                       rc = -1;
-                       goto done;
+               /* Create directory and log files if they were not created at
+                * stream open or reopen files if bad file descriptor.
+                */
+               log_initiate_stream_files(stream);
+               
+               if (stream->fd == -1) {
+                       TRACE("%s - Initiating stream files \"%s\" Failed", 
__FUNCTION__,
+                                       stream->name);
+               } else {
+                       TRACE("%s - stream files initiated", __FUNCTION__);
                }
-               /* Creating config file on new ACTIVE */
-               if (lgs_create_config_file_h(stream) != 0) {
-                       TRACE("Creating config file failed");
-                       rc = -1;
-                       goto done;
-               }
-               TRACE("stream: %s not opened, opening it now", stream->name);
-               stream->fd = log_file_open(stream, NULL);
-               if (stream->fd == -1) {
-                       rc = -1;
-                       goto done;
-               }
-               TRACE("stream %s now opened", stream->name);
        }
        
        TRACE("%s - stream->fd = %d",__FUNCTION__,stream->fd);
@@ -972,25 +949,19 @@ int log_stream_write_h(log_stream_t *str
        free(params_in);
        /* End write the log record */  
        
-       if (rc == -1) {
-               /* If writing failed because of invalid file descriptor then 
invalidate
-                * the stream file descriptor.
+       if ((rc == -1) || (rc == -2)) {
+               /* If writing failed always invalidate the stream file 
descriptor.
                 */
                /* Careful with log level here to avoid syslog flooding */
                LOG_IN("write '%s' failed \"%s\"", stream->logFileCurrent,
                                strerror(write_errno));
                
-               /* If writing failed because of invalid file descriptor or
-                * staled NFS handle then invalidate the stream file descriptor.
-                * This will result in reopening of stream files.
-                */
-               if ((write_errno == EBADF) || (write_errno == ESTALE)) {
-                       stream->fd = -1;
-                       TRACE("Recovery because of \"%s\" 
initiated",strerror(write_errno));
-               }
+               stream->fd = -1;
                goto done;
        }
  
+       /* Handle file size and rotate if needed
+        */
        rc = 0;
        stream->curFileSize += count;
 
diff --git a/osaf/services/saf/logsv/lgs/lgs_stream.h 
b/osaf/services/saf/logsv/lgs/lgs_stream.h
--- a/osaf/services/saf/logsv/lgs/lgs_stream.h
+++ b/osaf/services/saf/logsv/lgs/lgs_stream.h
@@ -47,7 +47,6 @@ typedef struct log_stream {
        SaUint64T filtered;     /* discarded by server due to filtering */
        /* --- end correspond to IMM Class --- */
 
-       bool files_initiated; /* True when all files belonging to stream are 
initiated */
        uint32_t streamId;      /* The unique stream id for this stream */
        int32_t fd;             /* The stream file descriptor */
        char logFileCurrent[NAME_MAX];  /* Current file name */

------------------------------------------------------------------------------
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to