osaf/services/saf/logsv/lgs/lgs_filehdl.c | 17 ++++++++++++-----
osaf/services/saf/logsv/lgs/lgs_stream.c | 19 +++++++++++++++----
2 files changed, 27 insertions(+), 9 deletions(-)
- Open log files with O_NONBLOCK. Answer client with AIS_ERR_TIMEOUT
if EWOULDBLOCK/EAGAIN (record may be parially written)
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
@@ -379,7 +379,13 @@ done:
}
/**
- * Open/create a file for append
+ * Open/create a file for append in non blocking mode.
+ * Note: The file is opened in NONBLOCK mode directly. This makes it possible
+ * that the open succeeds but the following write will fail. To avoid
+ * this the file can be opened without the O_NONBLOCK flag and set this
+ * flag using fcntl(). But write handling is done so that if a write
+ * fails the log file will always be reopened.
+ *
* @param indata[in], Null-terminated string containing filename to open
* @param outdata[out], int errno, 0 if no error
* @param max_outsize[in], always sizeof(int)
@@ -387,18 +393,19 @@ done:
*/
int fileopen_hdl(void *indata, void *outdata, size_t max_outsize)
{
- int fd_out;
int errno_save = 0;
char *filepath = (char *) indata;
int *errno_out_p = (int *) outdata;
+ int fd;
TRACE_ENTER();
TRACE("%s - filepath \"%s\"",__FUNCTION__,filepath);
open_retry:
- fd_out = open(filepath, O_CREAT | O_RDWR | O_APPEND, S_IRUSR | S_IWUSR
| S_IRGRP);
+ fd = open(filepath, O_CREAT | O_RDWR | O_APPEND | O_NONBLOCK,
+ S_IRUSR | S_IWUSR |
S_IRGRP);
- if (fd_out == -1) {
+ if (fd == -1) {
if (errno == EINTR)
goto open_retry;
/* save errno for caller logging */
@@ -410,7 +417,7 @@ open_retry:
*errno_out_p = errno_save;
TRACE_LEAVE();
- return fd_out;
+ return fd;
}
/**
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
@@ -48,7 +48,7 @@ static int lgs_stream_array_remove(int i
static int get_number_of_log_files_h(log_stream_t *logStream, char
*oldest_file);
/**
- * Open/Create a file
+ * Open/create a file for append in non blocking mode.
* @param filepath[in]
* @param errno_save[out], errno if error
* @return File descriptor or -1 if error
@@ -674,7 +674,8 @@ log_stream_t *log_stream_new_2(SaNameT *
}
/**
- * Open file associated with stream
+ * Open log file associated with stream
+ * The file is opened in non blocking mode.
* @param stream
* @param errno_save - errno from open() returned here if supplied
*
@@ -881,7 +882,7 @@ done:
*
* @return int 0 No error
* -1 on error
- * -2 Write failed because of write timeout
+ * -2 Write failed because of write timeout or EWOULDBLOCK/EAGAIN
*/
int log_stream_write_h(log_stream_t *stream, const char *buf, size_t count)
{
@@ -956,7 +957,17 @@ int log_stream_write_h(log_stream_t *str
LOG_IN("write '%s' failed \"%s\"", stream->logFileCurrent,
strerror(write_errno));
- stream->fd = -1;
+ if (stream->fd != -1) {
+ /* Try to close the file and invalidate the stream fd */
+ fileclose_h(stream->fd);
+ stream->fd = -1;
+ }
+
+ if ((write_errno == EAGAIN) || (write_errno == EWOULDBLOCK)) {
+ /* Change return code to timeout if EAGAIN (would
block) */
+ TRACE("Write would block");
+ rc = -2;
+ }
goto done;
}
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel