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

Reply via email to