Such a configured non-member node will be notified only for node local changes in track callback and not cluster wide changes. This is one reason clm lock of active controller node is not allowed by CLM and AMF also rejects this in validation step.
Thanks, Praveen On 22-Jul-16 5:11 PM, Anders Widell wrote: > Ok good, so then we there is no problem calling saClmInitialize_4() and > saClmSelectionObjectGet() on a locked node. I checked > saClmClusterTrack_4() and it should also be safe according to the spec. > > I would prefer if you don't initialize the CLM and NTF handles on spare > nodes, until they actually get a STANDBY or ACTIVE assignment. One > reason is performance - initializing a handle presumably consumes > resources on both the spare controller node as well as in the CLM/NTF > server running on the active node. We (currently) don't need the handles > as long as we are running as spares, so this is a waste of resources. > But more importantly, I think it is safer to defer the initialization > until the handles are needed. Let's suppose the spare starts up and > keeps running for a very long time as a spare. Then - much later - you > become STANDBY or ACTIVE. Now you want to start using those handles that > you initialized way back in history. Who knows if the handles are still > working? A handle is essentially connection to a server running on > another node. A lot of things may have happened since we initialized it; > controller switch-overs, fail-overs, software upgrades, and headless > situations. Yes the handles ought to work - and if not, they don't they > ought to return BAD_HANDLE so that we can re-initialize them. But there > is also a small possibility that a bug causes the handle to simply not > work. A "fresh", newly initialized handle would be safer than a one-year > old handle. > > Do you think it would work if you defer creating these background > threads until we get an ACTIVE/STANDBY assignment? > > regards, > Anders Widell > > On 07/22/2016 12:20 PM, minh chau wrote: >> Hi, >> >> I think Praveen's comment on #1812 was worrying about amfd hanging >> when init with CLM, this patch does not change position of CLM >> initialization and also it's done in thread so it will be ok? >> Regarding Anders' comment: I did quick test, lock clm on standby >> controller and reboot it, when it comes up it initializes with CLM >> successfully, so it seems we won't get ERR_UNAVAILABLE on configured >> non-member node >> Thought that handling ERR_UNAVAILABLE should be removed in CLM init in >> the scope of this ticket, but would it be useful in case that amfd >> re-init CLM up on receiving BAD_HANDLE? >> >> Thanks, >> Minh >> On 20/07/16 22:06, Anders Widell wrote: >>> Regarding ticket [#1781], I think that one requires some more >>> thought. First of all, do we want to assign the STANDBY role to the >>> OpenSAF directors running on a CLM locked node? If we do want a CLM >>> locked node to become standby, then CLM ought to provide service to >>> middleware clients running on a locked node! It must differentiate >>> between middleware- and non-middleware clients. >>> >>> By the way, saClmInitialize_4() and saClmSelectionObjectGet() should >>> not return ERR_UNAVAILABLE on configured non-member nodes - they >>> shall only return ERR_UNAVAILABLE on unconfigured nodes. >>> >>> regards, >>> Anders Widell >>> >>> On 07/20/2016 12:55 PM, praveen malviya wrote: >>>> Hi Minh, >>>> >>>> For the ticket #1812 I had given one comment. >>>> It was: >>>> "In the fix of ticekt #1781, it has been suggested for spare >>>> controllers >>>> to init with CLM before become AMF role aware. Here also same >>>> problem >>>> will come. If spare is running on CLM locked node then it will never >>>> come out of avd_clm_init() as ERR_UNAVAILBLE is handled there for >>>> reinit. Also admin will not be able to unlock it until one of the >>>> controller joins. In this particular case AMFD must exit instead of >>>> indefinitely calling the CLM init API. >>>> Also this fix will cause re-init will CLM in non-headless case also. I >>>> think in non-headless case it will be good to initialize with CLM in a >>>> separate thread" >>>> >>>> I think it is valid here also or is it handled. >>>> Thanks, >>>> Praveen >>>> On 11-Jul-16 1:01 PM, Minh Hon Chau wrote: >>>>> osaf/services/saf/amf/amfd/clm.cc | 103 >>>>> ++++++++++++++++++++++++++---- >>>>> osaf/services/saf/amf/amfd/include/cb.h | 7 +- >>>>> osaf/services/saf/amf/amfd/include/clm.h | 6 +- >>>>> osaf/services/saf/amf/amfd/include/ntf.h | 3 + >>>>> osaf/services/saf/amf/amfd/main.cc | 20 ++++- >>>>> osaf/services/saf/amf/amfd/ntf.cc | 85 >>>>> +++++++++++++++++++++++++ >>>>> osaf/services/saf/amf/amfd/role.cc | 15 +--- >>>>> 7 files changed, 204 insertions(+), 35 deletions(-) >>>>> >>>>> >>>>> In new controller reallocation scenario with roaming sc feature, if >>>>> immnd >>>>> dies in the node becoming active, the circular dependencies among >>>>> Opensaf >>>>> services appear, which leads eventually to a reboot. >>>>> >>>>> The dependencies are: >>>>> .clmd can not use IMM services since immnd dies >>>>> .immnd needs restarted by amfnd >>>>> .amfnd is hanging since amfnd is calling CLM services >>>>> .amfd is also hanging since amfd is calling CLM and NTF services >>>>> .ntfd is hanging due to logd's dependencies on IMM >>>>> >>>>> The problem could be solved if: >>>>> . amfd initializes NTF, CLM handle in thread in initialization phase >>>>> . amfnd initializes CLM in thread if amfnd receives clm bad handle >>>>> >>>>> Since amfnd has already initialized CLM in thread up on receiving >>>>> clm bad >>>>> handle. This patch does initialze CLM, NTF in thread at amfd side. >>>>> Also, >>>>> threading initialization in this patch can be refactored later by >>>>> utilizing >>>>> the support of #1609 >>>>> >>>>> diff --git a/osaf/services/saf/amf/amfd/clm.cc >>>>> b/osaf/services/saf/amf/amfd/clm.cc >>>>> --- a/osaf/services/saf/amf/amfd/clm.cc >>>>> +++ b/osaf/services/saf/amf/amfd/clm.cc >>>>> @@ -386,14 +386,26 @@ static const SaClmCallbacksT_4 clm_callb >>>>> /*.saClmClusterTrackCallback =*/ clm_track_cb >>>>> }; >>>>> >>>>> -SaAisErrorT avd_clm_init(void) >>>>> +SaAisErrorT avd_clm_init(AVD_CL_CB* cb) >>>>> { >>>>> - SaAisErrorT error = SA_AIS_OK; >>>>> + SaAisErrorT error = SA_AIS_OK; >>>>> + SaClmHandleT clm_handle = 0; >>>>> + SaSelectionObjectT sel_obj = 0; >>>>> >>>>> + cb->clmHandle = 0; >>>>> + cb->clm_sel_obj = 0; >>>>> TRACE_ENTER(); >>>>> + /* >>>>> + * TODO: This CLM initialization thread can be re-factored >>>>> + * after having osaf dedicated thread, so that all APIs calls >>>>> + * to external service can be automatically retried with result >>>>> + * code (TRY_AGAIN, TIMEOUT, UNAVAILABLE), or reinitialized >>>>> within >>>>> + * BAD_HANDLE. Also, duplicated codes in initialization thread >>>>> + * will be moved to osaf dedicated thread >>>>> + */ >>>>> for (;;) { >>>>> SaVersionT Version = { 'B', 4, 1 }; >>>>> - error = saClmInitialize_4(&avd_cb->clmHandle, >>>>> &clm_callbacks, &Version); >>>>> + error = saClmInitialize_4(&clm_handle, &clm_callbacks, >>>>> &Version); >>>>> if (error == SA_AIS_ERR_TRY_AGAIN || >>>>> error == SA_AIS_ERR_TIMEOUT || >>>>> error == SA_AIS_ERR_UNAVAILABLE) { >>>>> @@ -404,15 +416,21 @@ SaAisErrorT avd_clm_init(void) >>>>> osaf_nanosleep(&kHundredMilliseconds); >>>>> continue; >>>>> } >>>>> - if (error == SA_AIS_OK) break; >>>>> - LOG_ER("Failed to Initialize with CLM: %u", error); >>>>> + if (error == SA_AIS_OK) { >>>>> + break; >>>>> + }else { >>>>> + LOG_ER("Failed to Initialize with CLM: %u", error); >>>>> + goto done; >>>>> + } >>>>> + } >>>>> + cb->clmHandle = clm_handle; >>>>> + error = saClmSelectionObjectGet(cb->clmHandle, &sel_obj); >>>>> + if (error != SA_AIS_OK) { >>>>> + LOG_ER("Failed to get selection object from CLM %u", error); >>>>> + cb->clmHandle = 0; >>>>> goto done; >>>>> } >>>>> - error = saClmSelectionObjectGet(avd_cb->clmHandle, >>>>> &avd_cb->clm_sel_obj); >>>>> - if (SA_AIS_OK != error) { >>>>> - LOG_ER("Failed to get selection object from CLM %u", error); >>>>> - goto done; >>>>> - } >>>>> + cb->clm_sel_obj = sel_obj; >>>>> >>>>> TRACE("Successfully initialized CLM"); >>>>> >>>>> @@ -428,10 +446,15 @@ SaAisErrorT avd_clm_track_start(void) >>>>> >>>>> TRACE_ENTER(); >>>>> error = saClmClusterTrack_4(avd_cb->clmHandle, trackFlags, >>>>> nullptr); >>>>> - if (SA_AIS_OK != error) >>>>> - LOG_ER("Failed to start cluster tracking %u", error); >>>>> - >>>>> - TRACE_LEAVE(); >>>>> + if (error != SA_AIS_OK) { >>>>> + if (error == SA_AIS_ERR_TRY_AGAIN || error == >>>>> SA_AIS_ERR_TIMEOUT || >>>>> + error == SA_AIS_ERR_UNAVAILABLE) { >>>>> + LOG_WA("Failed to start cluster tracking %u", error); >>>>> + } else { >>>>> + LOG_ER("Failed to start cluster tracking %u", error); >>>>> + } >>>>> + } >>>>> + TRACE_LEAVE(); >>>>> return error; >>>>> } >>>>> >>>>> @@ -468,3 +491,55 @@ void clm_node_terminate(AVD_AVND *node) >>>>> else >>>>> TRACE("Waiting for the pending SU presence state updates"); >>>>> } >>>>> + >>>>> +static void* avd_clm_init_thread(void* arg) >>>>> +{ >>>>> + TRACE_ENTER(); >>>>> + AVD_CL_CB* cb = static_cast<AVD_CL_CB*>(arg); >>>>> + SaAisErrorT error = SA_AIS_OK; >>>>> + >>>>> + if (avd_clm_init(cb) != SA_AIS_OK) { >>>>> + LOG_ER("avd_clm_init FAILED"); >>>>> + goto done; >>>>> + } >>>>> + >>>>> + if (cb->avail_state_avd == SA_AMF_HA_ACTIVE) { >>>>> + for (;;) { >>>>> + error = avd_clm_track_start(); >>>>> + if (error == SA_AIS_ERR_TRY_AGAIN || >>>>> + error == SA_AIS_ERR_TIMEOUT || >>>>> + error == SA_AIS_ERR_UNAVAILABLE) { >>>>> + osaf_nanosleep(&kHundredMilliseconds); >>>>> + continue; >>>>> + } >>>>> + if (error == SA_AIS_OK) { >>>>> + break; >>>>> + } else { >>>>> + LOG_ER("avd_clm_track_start FAILED, error: %u", >>>>> error); >>>>> + goto done; >>>>> + } >>>>> + } >>>>> + } >>>>> + >>>>> +done: >>>>> + TRACE_LEAVE(); >>>>> + return nullptr; >>>>> +} >>>>> + >>>>> +SaAisErrorT avd_start_clm_init_bg(void) >>>>> +{ >>>>> + pthread_t thread; >>>>> + pthread_attr_t attr; >>>>> + pthread_attr_init(&attr); >>>>> + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); >>>>> + >>>>> + if (pthread_create(&thread, &attr, avd_clm_init_thread, >>>>> avd_cb) != 0) { >>>>> + LOG_ER("pthread_create FAILED: %s", strerror(errno)); >>>>> + exit(EXIT_FAILURE); >>>>> + } >>>>> + >>>>> + pthread_attr_destroy(&attr); >>>>> + return SA_AIS_OK; >>>>> +} >>>>> + >>>>> + >>>>> diff --git a/osaf/services/saf/amf/amfd/include/cb.h >>>>> b/osaf/services/saf/amf/amfd/include/cb.h >>>>> --- a/osaf/services/saf/amf/amfd/include/cb.h >>>>> +++ b/osaf/services/saf/amf/amfd/include/cb.h >>>>> @@ -47,6 +47,7 @@ >>>>> >>>>> #include <list> >>>>> #include <queue> >>>>> +#include <atomic> >>>>> >>>>> class AVD_SI; >>>>> class AVD_AVND; >>>>> @@ -193,7 +194,7 @@ typedef struct cl_cb_tag { >>>>> since the cluster boot time */ >>>>> >>>>> /********** NTF related params ***********/ >>>>> - SaNtfHandleT ntfHandle; >>>>> + std::atomic<SaNtfHandleT> ntfHandle; >>>>> >>>>> /********Peer AvD related*********************/ >>>>> AVD_EXT_COMP_INFO ext_comp_info; >>>>> @@ -207,8 +208,8 @@ typedef struct cl_cb_tag { >>>>> bool is_implementer; >>>>> >>>>> /* Clm stuff */ >>>>> - SaClmHandleT clmHandle; >>>>> - SaSelectionObjectT clm_sel_obj; >>>>> + std::atomic<SaClmHandleT> clmHandle; >>>>> + std::atomic<SaSelectionObjectT> clm_sel_obj; >>>>> >>>>> bool fully_initialized; >>>>> bool swap_switch; /* true - In middle of role switch. */ >>>>> diff --git a/osaf/services/saf/amf/amfd/include/clm.h >>>>> b/osaf/services/saf/amf/amfd/include/clm.h >>>>> --- a/osaf/services/saf/amf/amfd/include/clm.h >>>>> +++ b/osaf/services/saf/amf/amfd/include/clm.h >>>>> @@ -21,10 +21,14 @@ >>>>> #ifndef _AVD_CLM_H >>>>> #define _AVD_CLM_H >>>>> >>>>> -extern SaAisErrorT avd_clm_init(void); >>>>> +struct cl_cb_tag; >>>>> + >>>>> + >>>>> +extern SaAisErrorT avd_clm_init(struct cl_cb_tag*); >>>>> extern SaAisErrorT avd_clm_track_start(void); >>>>> extern SaAisErrorT avd_clm_track_stop(void); >>>>> extern void clm_node_terminate(AVD_AVND *node); >>>>> +extern SaAisErrorT avd_start_clm_init_bg(void); >>>>> >>>>> #endif >>>>> >>>>> diff --git a/osaf/services/saf/amf/amfd/include/ntf.h >>>>> b/osaf/services/saf/amf/amfd/include/ntf.h >>>>> --- a/osaf/services/saf/amf/amfd/include/ntf.h >>>>> +++ b/osaf/services/saf/amf/amfd/include/ntf.h >>>>> @@ -105,4 +105,7 @@ void avd_alarm_clear(const SaNameT *name >>>>> >>>>> void avd_send_error_report_ntf(const SaNameT *name, >>>>> SaAmfRecommendedRecoveryT recovery); >>>>> >>>>> +extern SaAisErrorT avd_ntf_init(struct cl_cb_tag*); >>>>> +extern SaAisErrorT avd_start_ntf_init_bg(void); >>>>> + >>>>> #endif >>>>> diff --git a/osaf/services/saf/amf/amfd/main.cc >>>>> b/osaf/services/saf/amf/amfd/main.cc >>>>> --- a/osaf/services/saf/amf/amfd/main.cc >>>>> +++ b/osaf/services/saf/amf/amfd/main.cc >>>>> @@ -578,12 +578,21 @@ static uint32_t initialize(void) >>>>> >>>>> // CLM init is independent of this SC's role. Init with CLM >>>>> early. >>>>> >>>>> - if (avd_clm_init() != SA_AIS_OK) { >>>>> + cb->avail_state_avd = role; >>>>> + >>>>> + if (avd_start_clm_init_bg() != SA_AIS_OK) { >>>>> LOG_EM("avd_clm_init FAILED"); >>>>> rc = NCSCC_RC_FAILURE; >>>>> goto done; >>>>> } >>>>> >>>>> + // Initialize NTF handle in thread >>>>> + if (avd_start_ntf_init_bg() != SA_AIS_OK) { >>>>> + LOG_EM("avd_start_ntf_init_bg FAILED"); >>>>> + goto done; >>>>> + } >>>>> + >>>>> + >>>>> if ((rc = initialize_for_assignment(cb, role)) >>>>> != NCSCC_RC_SUCCESS) { >>>>> LOG_ER("initialize_for_assignment FAILED %u", (unsigned) >>>>> rc); >>>>> @@ -633,11 +642,14 @@ static void main_loop(void) >>>>> while (1) { >>>>> fds[FD_MBCSV].fd = cb->mbcsv_sel_obj; >>>>> fds[FD_MBCSV].events = POLLIN; >>>>> - fds[FD_CLM].fd = cb->clm_sel_obj; >>>>> - fds[FD_CLM].events = POLLIN; >>>>> fds[FD_IMM].fd = cb->imm_sel_obj; // IMM fd must be last >>>>> in array >>>>> fds[FD_IMM].events = POLLIN; >>>>> - >>>>> + >>>>> + if (cb->clmHandle != 0) { >>>>> + fds[FD_CLM].fd = cb->clm_sel_obj; >>>>> + fds[FD_CLM].events = POLLIN; >>>>> + } >>>>> + >>>>> if (cb->immOiHandle != 0) { >>>>> fds[FD_IMM].fd = cb->imm_sel_obj; >>>>> fds[FD_IMM].events = POLLIN; >>>>> diff --git a/osaf/services/saf/amf/amfd/ntf.cc >>>>> b/osaf/services/saf/amf/amfd/ntf.cc >>>>> --- a/osaf/services/saf/amf/amfd/ntf.cc >>>>> +++ b/osaf/services/saf/amf/amfd/ntf.cc >>>>> @@ -25,6 +25,7 @@ >>>>> #include <logtrace.h> >>>>> #include <util.h> >>>>> #include <ntf.h> >>>>> +#include "osaf_time.h" >>>>> >>>>> /***************************************************************************** >>>>> >>>>> Name : avd_send_comp_inst_failed_alarm >>>>> @@ -572,6 +573,12 @@ uint32_t sendAlarmNotificationAvd(AVD_CL >>>>> return status; >>>>> } >>>>> >>>>> + if (avd_cb->ntfHandle == 0) { >>>>> + LOG_ER("NTF handle has not been initialized, alarm >>>>> notification " >>>>> + "for (%s) will be lost", ntf_object.value); >>>>> + return status; >>>>> + } >>>>> + >>>>> if (type != 0) { >>>>> add_info_items = 1; >>>>> allocation_size = SA_NTF_ALLOC_SYSTEM_LIMIT; >>>>> @@ -660,6 +667,13 @@ uint32_t sendStateChangeNotificationAvd( >>>>> LOG_WA("State change notification lost for '%s'", >>>>> ntf_object.value); >>>>> return status; >>>>> } >>>>> + >>>>> + if (avd_cb->ntfHandle == 0) { >>>>> + LOG_WA("NTF handle has not been initialized, state change >>>>> notification " >>>>> + "for (%s) will be lost", ntf_object.value); >>>>> + return status; >>>>> + } >>>>> + >>>>> if (additional_info_is_present == true) { >>>>> add_info_items = 1; >>>>> allocation_size = SA_NTF_ALLOC_SYSTEM_LIMIT; >>>>> @@ -770,4 +784,75 @@ void avd_send_error_report_ntf(const SaN >>>>> TRACE_LEAVE(); >>>>> } >>>>> >>>>> +SaAisErrorT avd_ntf_init(AVD_CL_CB* cb) >>>>> +{ >>>>> + SaAisErrorT error = SA_AIS_OK; >>>>> + SaNtfHandleT ntf_handle; >>>>> + TRACE_ENTER(); >>>>> >>>>> + // reset handle >>>>> + cb->ntfHandle = 0; >>>>> + >>>>> + /* >>>>> + * TODO: to be re-factored as CLM initialization thread >>>>> + */ >>>>> + for (;;) { >>>>> + SaVersionT ntfVersion = { 'A', 0x01, 0x01 }; >>>>> + >>>>> + error = saNtfInitialize(&ntf_handle, NULL, &ntfVersion); >>>>> + if (error == SA_AIS_ERR_TRY_AGAIN || >>>>> + error == SA_AIS_ERR_TIMEOUT || >>>>> + error == SA_AIS_ERR_UNAVAILABLE) { >>>>> + if (error != SA_AIS_ERR_TRY_AGAIN) { >>>>> + LOG_WA("saNtfInitialize returned %u", >>>>> + (unsigned) error); >>>>> + } >>>>> + osaf_nanosleep(&kHundredMilliseconds); >>>>> + continue; >>>>> + } >>>>> + if (error == SA_AIS_OK) { >>>>> + break; >>>>> + } else { >>>>> + LOG_ER("Failed to Initialize with NTF: %u", error); >>>>> + goto done; >>>>> + } >>>>> + } >>>>> + cb->ntfHandle = ntf_handle; >>>>> + TRACE("Successfully initialized NTF"); >>>>> + >>>>> +done: >>>>> + TRACE_LEAVE(); >>>>> + return error; >>>>> +} >>>>> + >>>>> +static void* avd_ntf_init_thread(void* arg) >>>>> +{ >>>>> + TRACE_ENTER(); >>>>> + AVD_CL_CB* cb = static_cast<AVD_CL_CB*>(arg); >>>>> + >>>>> + if (avd_ntf_init(cb) != SA_AIS_OK) { >>>>> + LOG_ER("avd_clm_init FAILED"); >>>>> + goto done; >>>>> + } >>>>> + >>>>> +done: >>>>> + TRACE_LEAVE(); >>>>> + return nullptr; >>>>> +} >>>>> + >>>>> +SaAisErrorT avd_start_ntf_init_bg(void) >>>>> +{ >>>>> + pthread_t thread; >>>>> + pthread_attr_t attr; >>>>> + pthread_attr_init(&attr); >>>>> + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); >>>>> + >>>>> + if (pthread_create(&thread, &attr, avd_ntf_init_thread, >>>>> avd_cb) != 0) { >>>>> + LOG_ER("pthread_create FAILED: %s", strerror(errno)); >>>>> + exit(EXIT_FAILURE); >>>>> + } >>>>> + >>>>> + pthread_attr_destroy(&attr); >>>>> + >>>>> + return SA_AIS_OK; >>>>> +} >>>>> diff --git a/osaf/services/saf/amf/amfd/role.cc >>>>> b/osaf/services/saf/amf/amfd/role.cc >>>>> --- a/osaf/services/saf/amf/amfd/role.cc >>>>> +++ b/osaf/services/saf/amf/amfd/role.cc >>>>> @@ -174,9 +174,8 @@ void avd_role_change_evh(AVD_CL_CB *cb, >>>>> uint32_t initialize_for_assignment(cl_cb_tag* cb, SaAmfHAStateT >>>>> ha_state) >>>>> { >>>>> TRACE_ENTER2("ha_state = %d", static_cast<int>(ha_state)); >>>>> - SaVersionT ntfVersion = {'A', 0x01, 0x01}; >>>>> uint32_t rc = NCSCC_RC_SUCCESS; >>>>> - SaAisErrorT error; >>>>> + >>>>> if (cb->fully_initialized) goto done; >>>>> cb->avail_state_avd = ha_state; >>>>> if (ha_state == SA_AMF_HA_QUIESCED) { >>>>> @@ -199,12 +198,7 @@ uint32_t initialize_for_assignment(cl_cb >>>>> rc = NCSCC_RC_FAILURE; >>>>> goto done; >>>>> } >>>>> - if ((error = saNtfInitialize(&cb->ntfHandle, nullptr, >>>>> &ntfVersion)) != >>>>> - SA_AIS_OK) { >>>>> - LOG_ER("saNtfInitialize Failed (%u)", error); >>>>> - rc = NCSCC_RC_FAILURE; >>>>> - goto done; >>>>> - } >>>>> + >>>>> if ((rc = avd_mds_set_vdest_role(cb, ha_state)) != >>>>> NCSCC_RC_SUCCESS) { >>>>> LOG_ER("avd_mds_set_vdest_role FAILED"); >>>>> goto done; >>>>> @@ -273,11 +267,6 @@ uint32_t avd_active_role_initialization( >>>>> >>>>> avd_imm_update_runtime_attrs(); >>>>> >>>>> - if (avd_clm_track_start() != SA_AIS_OK) { >>>>> - LOG_ER("avd_clm_track_start FAILED"); >>>>> - goto done; >>>>> - } >>>>> - >>>>> status = NCSCC_RC_SUCCESS; >>>>> done: >>>>> TRACE_LEAVE(); >>>>> >>>> ------------------------------------------------------------------------------ >>>> >>>> What NetFlow Analyzer can do for you? Monitors network bandwidth and >>>> traffic >>>> patterns at an interface-level. Reveals which users, apps, and >>>> protocols are >>>> consuming the most bandwidth. Provides multi-vendor support for >>>> NetFlow, >>>> J-Flow, sFlow and other flows. Make informed decisions using >>>> capacity planning >>>> reports.http://sdm.link/zohodev2dev >>>> _______________________________________________ >>>> Opensaf-devel mailing list >>>> Opensaf-devel@lists.sourceforge.net >>>> https://lists.sourceforge.net/lists/listinfo/opensaf-devel >>>> >>> >>> >> > ------------------------------------------------------------------------------ What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic patterns at an interface-level. Reveals which users, apps, and protocols are consuming the most bandwidth. Provides multi-vendor support for NetFlow, J-Flow, sFlow and other flows. Make informed decisions using capacity planning reports.http://sdm.link/zohodev2dev _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel