osaf/services/saf/logsv/lgs/lgs_evt.cc | 6 ++ osaf/services/saf/logsv/lgs/lgs_imm.cc | 7 ++- osaf/services/saf/logsv/lgs/lgs_stream.cc | 12 +++++ osaf/services/saf/logsv/lgs/lgs_stream.h | 1 + tests/logsv/tet_LogOiOps.c | 74 +++++++++++++++++++++++++++++++ tests/logsv/tet_saLogStreamOpen_2.c | 72 ++++++++++++++++++++++++++++++ 6 files changed, 171 insertions(+), 1 deletions(-)
If number of app stream has reached the limitation, logsv get failed to add this stream to stream array in ccbApplyCallback even though immsv creates object successfully. This patch help check the limitation of app stream and return the error to abort creating new app stream and new object. diff --git a/osaf/services/saf/logsv/lgs/lgs_evt.cc b/osaf/services/saf/logsv/lgs/lgs_evt.cc --- a/osaf/services/saf/logsv/lgs/lgs_evt.cc +++ b/osaf/services/saf/logsv/lgs/lgs_evt.cc @@ -1036,6 +1036,12 @@ static uint32_t proc_stream_open_msg(lgs } } + if (check_max_stream()) { + TRACE("The number of stream out of limitation"); + ais_rv = SA_AIS_ERR_NO_RESOURCES; + goto snd_rsp; + } + /* Create the stream: * - Check parameters * - Create the stream in the stream "data base" diff --git a/osaf/services/saf/logsv/lgs/lgs_imm.cc b/osaf/services/saf/logsv/lgs/lgs_imm.cc --- a/osaf/services/saf/logsv/lgs/lgs_imm.cc +++ b/osaf/services/saf/logsv/lgs/lgs_imm.cc @@ -1631,7 +1631,12 @@ static SaAisErrorT stream_ccb_completed_ SaAisErrorT rc = SA_AIS_ERR_BAD_OPERATION; TRACE_ENTER2("CCB ID %llu", opdata->ccbId); - rc = check_attr_validity(immOiHandle, opdata); + if (!check_max_stream()) { + rc = check_attr_validity(immOiHandle, opdata); + } else { + report_oi_error(immOiHandle, opdata->ccbId, + "Number of stream out of limitation"); + } TRACE_LEAVE2("%u", rc); return rc; } diff --git a/osaf/services/saf/logsv/lgs/lgs_stream.cc b/osaf/services/saf/logsv/lgs/lgs_stream.cc --- a/osaf/services/saf/logsv/lgs/lgs_stream.cc +++ b/osaf/services/saf/logsv/lgs/lgs_stream.cc @@ -1576,3 +1576,15 @@ int log_stream_config_change(bool create TRACE_LEAVE(); return rc; } + +/* + * Check if number of stream out of LOG_MAX_APPLICATION_STREAMS + * + * @return + */ +bool check_max_stream() +{ + TRACE(" Current number of streams: %u", numb_of_streams); + return (numb_of_streams < stream_array_size ? false:true); +} + 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 @@ -124,6 +124,7 @@ extern log_stream_t *log_stream_get_by_n extern log_stream_t *log_stream_getnext_by_name(const char *name); extern void log_stream_print(log_stream_t *stream); extern log_stream_t *log_stream_get_by_id(uint32_t id); +extern bool check_max_stream(); void log_free_stream_resources(log_stream_t *stream); #endif diff --git a/tests/logsv/tet_LogOiOps.c b/tests/logsv/tet_LogOiOps.c --- a/tests/logsv/tet_LogOiOps.c +++ b/tests/logsv/tet_LogOiOps.c @@ -3495,6 +3495,78 @@ restore_notif: rc = system(command); } + +/* + * Add test case for ticket #1446 + * Verify that invalid Object if number of app streams has reached the limitation + * + */ +void verStrLimit(void) +{ + SaAisErrorT rc; + char command[1000]; + uint32_t curAppCount, maxAppStream = 64; + uint32_t *tmp_to = &maxAppStream; + int num = 0; + FILE *fp = NULL; + char curAppCount_c[10]; + + /* Get current max app stream values of attributes */ + rc = get_attr_value(&configurationObject, "logMaxApplicationStreams", + (void**)&tmp_to, NULL); + if (rc != -1) { + maxAppStream = *tmp_to; + } + + /* Get current app stream */ + sprintf(command,"(immfind -c SaLogStreamConfig && immfind -c SaLogStream) | wc -l"); + fp = popen(command, "r"); + + while (fgets(curAppCount_c, sizeof(curAppCount_c) - 1, fp) != NULL) {}; + pclose(fp); + /* Convert chars to number */ + curAppCount = atoi(curAppCount_c) - 3; + + for (num = curAppCount; num < maxAppStream; num++) { + /* Create configurable app stream */ + sprintf(command,"immcfg -c SaLogStreamConfig safLgStrCfg=test%d" + " -a saLogStreamPathName=." + " -a saLogStreamFileName=test%d", + num, num); + rc = system(command); + if (WEXITSTATUS(rc)) { + /* Fail to perform the command. Report test case failed */ + fprintf(stderr, "Failed to perform command = %s\n", command); + rc_validate(WEXITSTATUS(rc), 0); + goto done; + } + } + + if (curAppCount >= maxAppStream) { + num += 1; + } + + /* Create configurable app stream while number of app stream limitation */ + sprintf(command,"immcfg -c SaLogStreamConfig safLgStrCfg=test%d" + " -a saLogStreamPathName=." + " -a saLogStreamFileName=test%d 2> /dev/null", + num, num); + rc = system(command); + rc_validate(WEXITSTATUS(rc), 1); + + if (WEXITSTATUS(rc) == 0) { + sprintf(command,"immcfg -d safLgStrCfg=test%d 2> /dev/null", num); + rc = system(command); + } + +done: + /* Delete app stream */ + for (num = curAppCount; num < maxAppStream; num++) { + sprintf(command,"immcfg -d safLgStrCfg=test%d 2> /dev/null", num); + rc = system(command); + } +} + __attribute__ ((constructor)) static void saOiOperations_constructor(void) { /* Stream objects */ @@ -3596,6 +3668,8 @@ restore_notif: test_case_add(5, verLogDataGroupName, "CCB Object Modify: delete logDataGroupname, OK"); test_case_add(5, verCCBWithValidValues, "CCB Object Modify many attributes with valid values, OK"); test_case_add(5, verCCBWithInvalidValues, "CCB Object Modify many attributes with one invalid values, ERR"); + /* Add test case to test #1446 */ + test_case_add(5, verStrLimit, "CCB Object Create: invalid Object if number of app streams has reached the limitation, ERR"); /* Stream configuration object */ /* Tests for create */ diff --git a/tests/logsv/tet_saLogStreamOpen_2.c b/tests/logsv/tet_saLogStreamOpen_2.c --- a/tests/logsv/tet_saLogStreamOpen_2.c +++ b/tests/logsv/tet_saLogStreamOpen_2.c @@ -633,6 +633,77 @@ done: } } +/* + * Add test case for ticket #1446 + * Verify that logsv failed to create app stream if number of app + * streams has reached the limitation + * + */ +void saLogStreamOpen_2_50(void) +{ + SaAisErrorT rc; + char command[1000]; + uint32_t curAppCount, maxAppStream = 64; + uint32_t *tmp_to = &maxAppStream; + int num = 0; + FILE *fp = NULL; + char curAppCount_c[10]; + + /* Get current max app stream values of attributes */ + rc = get_attr_value(&configurationObject, "logMaxApplicationStreams", + (void**)&tmp_to, NULL); + if (rc != -1) { + maxAppStream = *tmp_to; + } + + /* Get current app stream */ + sprintf(command,"(immfind -c SaLogStreamConfig && immfind -c SaLogStream) | wc -l"); + fp = popen(command, "r"); + + while (fgets(curAppCount_c, sizeof(curAppCount_c) - 1, fp) != NULL) {}; + pclose(fp); + /* Convert chars to number */ + curAppCount = atoi(curAppCount_c) - 3; + + for (num = curAppCount; num < maxAppStream; num++) { + /* Create configurable app stream */ + sprintf(command,"immcfg -c SaLogStreamConfig safLgStrCfg=test%d" + " -a saLogStreamPathName=." + " -a saLogStreamFileName=test%d", + num, num); + rc = system(command); + if (WEXITSTATUS(rc)) { + /* Fail to perform the command. Report test case failed */ + fprintf(stderr, "Failed to perform command = %s\n", command); + rc_validate(WEXITSTATUS(rc), 0); + goto done; + } + } + + rc = saLogInitialize(&logHandle, &logCallbacks, &logVersion); + if (rc != SA_AIS_OK) { + fprintf(stderr, "Failed at saLogInitialize: %d \n", (int)rc); + test_validate(rc, SA_AIS_OK); + goto done; + } + + rc = saLogStreamOpen_2(logHandle, &app1StreamName, &appStream1LogFileCreateAttributes, + SA_LOG_STREAM_CREATE, SA_TIME_ONE_SECOND, &logStreamHandle); + test_validate(rc, SA_AIS_ERR_NO_RESOURCES); + + rc = saLogFinalize(logHandle); + if (rc != SA_AIS_OK) { + fprintf(stderr, "Failed to call salogFinalize: %d \n", (int) rc); + } + +done: + /* Delete app stream */ + for (num = curAppCount; num < maxAppStream; num++) { + sprintf(command,"immcfg -d safLgStrCfg=test%d 2> /dev/null", num); + rc = system(command); + } +} + extern void saLogStreamOpenAsync_2_01(void); extern void saLogStreamOpenCallbackT_01(void); extern void saLogWriteLog_01(void); @@ -714,5 +785,6 @@ extern void saLogStreamClose_01(void); test_case_add(2, verFixLogRec_Max_Err, "saLogStreamOpen_2 with maxLogRecordSize > MAX_RECSIZE, ERR"); test_case_add(2, verFixLogRec_Min_Err, "saLogStreamOpen_2 with maxLogRecordSize < 150, ERR"); + test_case_add(2, saLogStreamOpen_2_50, "saLogStreamOpen_2 with stream number out of the limitation, ERR"); } ------------------------------------------------------------------------------ Transform Data into Opportunity. Accelerate data analysis in your applications with Intel Data Analytics Acceleration Library. Click to learn more. http://pubads.g.doubleclick.net/gampad/clk?id=278785231&iu=/4140 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel