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