When log resilient mode is enabled and timeout of saflogger is
configured larger than logResilienceTimeout , the saflogger will
be blocked forever until the underlying filesystem is responsive.
The fix is adding a timer to avoid command loop too long.
---
src/log/tools/saf_logger.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/log/tools/saf_logger.c b/src/log/tools/saf_logger.c
index e9f7e9b36..550e3c58a 100644
--- a/src/log/tools/saf_logger.c
+++ b/src/log/tools/saf_logger.c
@@ -148,7 +148,8 @@ static SaAisErrorT write_log_record(SaLogHandleT logHandle,
int i = 0;
struct pollfd fds[1];
int ret;
- unsigned int wait_time = 0;
+ int64_t start_time_us = get_current_SaTime() / 1000;
+ int64_t wait_time = 0;
i++;
@@ -166,7 +167,7 @@ retry:
if (errorCode != SA_AIS_OK) {
if (wait_time)
- fprintf(stderr, "Waited for %u seconds.\n",
+ fprintf(stderr, "Waited for %ld seconds.\n",
wait_time / 1000000);
fprintf(stderr, "saLogWriteLogAsync FAILED: %s\n",
saf_error(errorCode));
@@ -206,8 +207,9 @@ poll_retry:
return SA_AIS_ERR_BAD_OPERATION;
}
+ wait_time = (get_current_SaTime() / 1000) - start_time_us;
if (cb_error == SA_AIS_ERR_TRY_AGAIN &&
- wait_time < g_timeout*ONE_SECOND_TO_NS) {
+ wait_time < g_timeout * ONE_SECOND_TO_NS) {
usleep(HUNDRED_MS);
wait_time += HUNDRED_MS;
goto retry;
@@ -221,7 +223,7 @@ poll_retry:
if (cb_error != SA_AIS_OK) {
if (wait_time)
- fprintf(stderr, "Waited for %u seconds.\n",
+ fprintf(stderr, "Waited for %ld seconds.\n",
wait_time / 1000000);
fprintf(stderr, "logWriteLogCallbackT FAILED: %s\n",
saf_error(cb_error));
--
2.17.1
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel