Hi Canh, Nice bug. Ack. One minor comment inline:
> -----Original Message----- > From: Canh Truong [mailto:canh.v.tru...@dektech.com.au] > Sent: Thursday, March 17, 2016 8:30 AM > To: lennart.l...@ericsson.com; anders.wid...@ericsson.com; Mathivanan > Naickan Palanivelu; vu.m.ngu...@dektech.com.au > Cc: opensaf-devel@lists.sourceforge.net > Subject: [PATCH 1 of 1] log: fix trouble when the number app streams reachs > limitation [#1446] > Please change the commit message to "log: check for max app streams limit during streamOpen and in completed callback [#1446]" Thanks, Mathi. > 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=278785471&iu=/4140 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel