when saflogtest write log records and get error TRY_AGAIN in ack message, it will handle to re-write until the error is not TRY_AGAIN. There is no limited timeout to handle try-again. The patch add timeout 10s for handling try-again. --- src/log/apitest/saflogtest.c | 86 ++++++++++++++++++++++++++++++------------ src/log/apitest/tet_LogOiOps.c | 48 +++++++++++------------ 2 files changed, 82 insertions(+), 52 deletions(-)
diff --git a/src/log/apitest/saflogtest.c b/src/log/apitest/saflogtest.c index e6db5e104..160cc3b74 100644 --- a/src/log/apitest/saflogtest.c +++ b/src/log/apitest/saflogtest.c @@ -21,7 +21,7 @@ * This file contains a command line test utility to write to the SAF LOG. * * The main purpose of the utility is to send a burst of log messages, by - * default not waiting for ack for each message. + * default waiting for ack for each message. */ #include <stdio.h> @@ -42,6 +42,7 @@ #include <poll.h> #include <unistd.h> #include <limits.h> +#include "base/osaf_time.h" #include "base/saf_error.h" #include <saAis.h> @@ -55,10 +56,12 @@ #define MAX_NUM_STREAM 4 +const uint64_t kWaitTime = 10*1000; // Wait for timeout is 10 seconds +const SaVersionT KLogVersion = {'A', 0x02, 0x03}; + static void logWriteLogCallbackT(SaInvocationT invocation, SaAisErrorT error); static SaLogCallbacksT logCallbacks = {0, 0, logWriteLogCallbackT}; -static SaVersionT logVersion = {'A', 0x02, 0x03}; static char *progname = "saflogtest"; static SaInvocationT cb_invocation; @@ -154,15 +157,21 @@ static SaAisErrorT write_log_record(SaLogHandleT logHandle, static int i = 0; int try_agains = 0; SaLogAckFlagsT ackflags; + struct timespec timeout_time; if (wait_for_ack) ackflags = SA_LOG_RECORD_WRITE_ACK; else ackflags = 0; - retry: - errorCode = saLogWriteLogAsync(logStreamHandle, invocation, ackflags, - logRecord); + osaf_set_millis_timeout(kWaitTime, &timeout_time); + while (!osaf_is_timeout(&timeout_time)) { + + errorCode = saLogWriteLogAsync(logStreamHandle, invocation, + ackflags, logRecord); + if (errorCode != SA_AIS_ERR_TRY_AGAIN) break; + osaf_nanosleep(&kHundredMilliseconds); + } if (errorCode != SA_AIS_OK) { fprintf(stderr, "saLogWriteLogAsync FAILED: %s\n", @@ -202,9 +211,8 @@ retry: } if (cb_invocation != invocation) { - fprintf( - stderr, - "logWriteLogCallbackT FAILED: wrong invocation\n"); + fprintf(stderr, "logWriteLogCallbackT FAILED:" + " wrong invocation\n"); return SA_AIS_ERR_BAD_OPERATION; } @@ -215,17 +223,16 @@ retry: return cb_error; } - if (cb_error == SA_AIS_ERR_TRY_AGAIN) { - usleep(100000); /* 100 ms */ + if (cb_error == SA_AIS_ERR_TRY_AGAIN && + !osaf_is_timeout(&timeout_time)) { + osaf_nanosleep(&kHundredMilliseconds); try_agains++; goto retry; } if (try_agains > 0) { - fprintf( - stderr, - "\tgot %u SA_AIS_ERR_TRY_AGAIN, waited %u secs\n", - try_agains, try_agains / 10); + fprintf(stderr, "\tgot %u SA_AIS_ERR_TRY_AGAIN\n", + try_agains); } } @@ -545,7 +552,14 @@ int main(int argc, char *argv[]) } } - error = saLogInitialize(&logHandle, &logCallbacks, &logVersion); + struct timespec timeout_time; + osaf_set_millis_timeout(kWaitTime, &timeout_time); + while(!osaf_is_timeout(&timeout_time)) { + SaVersionT version = KLogVersion; + error = saLogInitialize(&logHandle, &logCallbacks, &version); + if (error != SA_AIS_ERR_TRY_AGAIN) break; + osaf_nanosleep(&kHundredMilliseconds); + } if (error != SA_AIS_OK) { fprintf(stderr, "saLogInitialize FAILED: %s\n", saf_error(error)); @@ -573,10 +587,17 @@ int main(int argc, char *argv[]) logFileCreateAttributes_ptr = NULL; } - error = saLogStreamOpen_2( - logHandle, &stream_info[j].logStreamName, - logFileCreateAttributes_ptr, logStreamOpenFlags, - SA_TIME_ONE_SECOND, &logStreamHandle); + osaf_set_millis_timeout(kWaitTime, &timeout_time); + while(!osaf_is_timeout(&timeout_time)) { + error = saLogStreamOpen_2( + logHandle, &stream_info[j].logStreamName, + logFileCreateAttributes_ptr, + logStreamOpenFlags, + SA_TIME_ONE_SECOND, &logStreamHandle); + if (error != SA_AIS_ERR_TRY_AGAIN) break; + osaf_nanosleep(&kHundredMilliseconds); + } + if (error != SA_AIS_OK) { fprintf(stderr, "saLogStreamOpen_2 FAILED: %s\n", saf_error(error)); @@ -589,8 +610,13 @@ int main(int argc, char *argv[]) write_log_record( logHandle, logStreamHandle, selectionObject, &stream_info[j].logRecord, wait_for_ack); - if (interval > 0) - usleep(interval); + if (interval > 0) { + struct timespec sleep_time; + sleep_time.tv_sec = interval / 1000000; + sleep_time.tv_nsec = + (interval % 1000000) * 1000; + osaf_nanosleep(&sleep_time); + } } } @@ -617,16 +643,26 @@ int main(int argc, char *argv[]) * closed automatically) */ if (stream_cnt == 1) { - error = saLogStreamClose(logStreamHandle); - if (SA_AIS_OK != error) { + osaf_set_millis_timeout(kWaitTime, &timeout_time); + while(!osaf_is_timeout(&timeout_time)) { + error = saLogStreamClose(logStreamHandle); + if (error != SA_AIS_ERR_TRY_AGAIN) break; + osaf_nanosleep(&kHundredMilliseconds); + } + if (error != SA_AIS_OK) { fprintf(stderr, "saLogStreamClose FAILED: %s\n", saf_error(error)); exit(EXIT_FAILURE); } } - error = saLogFinalize(logHandle); - if (SA_AIS_OK != error) { + osaf_set_millis_timeout(kWaitTime, &timeout_time); + while(!osaf_is_timeout(&timeout_time)) { + error = saLogFinalize(logHandle); + if (error != SA_AIS_ERR_TRY_AGAIN) break; + osaf_nanosleep(&kHundredMilliseconds); + } + if (error != SA_AIS_OK) { fprintf(stderr, "saLogFinalize FAILED: %s\n", saf_error(error)); exit(EXIT_FAILURE); } diff --git a/src/log/apitest/tet_LogOiOps.c b/src/log/apitest/tet_LogOiOps.c index 0ee8078ad..896e993e4 100644 --- a/src/log/apitest/tet_LogOiOps.c +++ b/src/log/apitest/tet_LogOiOps.c @@ -793,36 +793,32 @@ void saLogOi_28() return; } - sprintf( - command, - "immcfg -a saLogStreamMaxLogFileSize=2001 safLgStrCfg=strA,safApp=safLogService"); + sprintf(command, "immcfg -a saLogStreamMaxLogFileSize=2001 " + "safLgStrCfg=strA,safApp=safLogService"); rc = systemCall(command); if (rc != 0) goto done; - sprintf( - command, - "immcfg -a saLogStreamMaxFilesRotated=1 safLgStrCfg=strA,safApp=safLogService"); + sprintf(command, "immcfg -a saLogStreamMaxFilesRotated=1 " + "safLgStrCfg=strA,safApp=safLogService"); rc = systemCall(command); if (rc != 0) goto done; - sprintf( - command, - "saflogtest -b strA --count=1000 --interval=5000 \"saflogtest (1000,5000) strA\""); + sprintf(command, "saflogtest -b strA --count=100 --interval=5000 " + "\"saflogtest (100,5000) strA\""); rc = systemCall(command); if (rc != 0) goto done; - sprintf( - command, - "immcfg -a saLogStreamMaxFilesRotated=3 safLgStrCfg=strA,safApp=safLogService"); + sprintf(command, "immcfg -a saLogStreamMaxFilesRotated=3 " + "safLgStrCfg=strA,safApp=safLogService"); rc = systemCall(command); done: /* Delete object strA */ - sprintf(command, - "immcfg -d safLgStrCfg=strA,safApp=safLogService 2> /dev/null"); + sprintf(command, "immcfg -d safLgStrCfg=strA,safApp=safLogService " + "2> /dev/null"); delay_ms(); systemCall(command); rc_validate(rc, 0); @@ -1041,21 +1037,20 @@ void saLogOi_34() if (rc != 0) goto done; - sprintf( - command, - "saflogtest -b strA --count=10 --interval=10000 \"saflogtest (10,10000) strA\""); + sprintf(command, "saflogtest -b strA --count=10 --interval=10000 " + "\"saflogtest (10,10000) strA\""); rc = systemCall(command); if (rc != 0) goto done; - sprintf( - command, - "saflogtest -b strB --count=500 --interval=5 \"saflogtest (500,5) strB\""); + sprintf(command, "saflogtest -b strB --count=20 --interval=5 " + "\"saflogtest (20,5) strB\""); + rc = systemCall(command); if (rc != 0) goto done; - sprintf( - command, - "saflogtest -b strC --count=700 --interval=5 \"saflogtest (700,5) strC\""); + sprintf(command, "saflogtest -b strC --count=30 --interval=5" + " \"saflogtest (30,5) strC\""); + rc = systemCall(command); if (rc != 0) goto done; @@ -1299,9 +1294,8 @@ void saLogOi_44() if (rc != 0) goto delete_object; - sprintf( - command, - "saflogtest -b strD --count=500 --interval=5 \"saflogtest (500,5) strD\""); + sprintf(command, "saflogtest -b strD --count=50 --interval=5 " + "\"saflogtest (50,5) strD\""); rc = systemCall(command); delete_object: @@ -1428,7 +1422,7 @@ void saLogOi_50() while (noTimes--) { sprintf(command, - "saflogtest -a appTest --count=100 --interval=1 " + "saflogtest -a appTest --count=10 --interval=1 " "\"saflogtest (100,1,%d) appTest\"", noTimes); rc = system(command); -- 2.15.1 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel