📄 subscriptiontable.cpp
字号:
// requestor, subscription creator must also match module // user context name, to add provider to the list of // failed providers // if ((moduleContext != PG_PROVMODULE_USERCTXT_REQUESTOR) || (!authenticationEnabled) || (creator == userName)) { // // Add the provider to the list // failedProviderList.append (tableValue.providers [j]); } } // if provider module name matches } // for each subscription provider // // If there were any failed providers, add the subscription // entry to the list of affected subscriptions // if (failedProviderList.size () > 0) { ActiveSubscriptionsTableEntry subscription; subscription.subscription = tableValue.subscription; subscription.providers = failedProviderList; providerModuleSubscriptions.append (subscription); } } // // Look up and update hash table entry for each affected subscription // for (Uint32 k = 0; k < providerModuleSubscriptions.size (); k++) { // // Update the entry in the active subscriptions hash table // CIMObjectPath activeSubscriptionsKey = _generateActiveSubscriptionsKey (providerModuleSubscriptions [k].subscription.getPath ()); ActiveSubscriptionsTableEntry tableValue; if (_activeSubscriptionsTable.lookup (activeSubscriptionsKey, tableValue)) { Array <ProviderClassList> updatedProviderList; for (Uint32 l = 0; l < tableValue.providers.size (); l++) { String providerModuleName; CIMValue nameValue = tableValue.providers [l].providerModule.getProperty (tableValue.providers [l].providerModule.findProperty (PEGASUS_PROPERTYNAME_NAME)).getValue (); nameValue.get (providerModuleName); if (providerModuleName != moduleName) { // // Provider is not in the failed module // Append provider to list of providers still serving // the subscription // updatedProviderList.append (tableValue.providers [l]); } } _updateSubscriptionProviders (activeSubscriptionsKey, tableValue.subscription, updatedProviderList); } } } PEG_METHOD_EXIT (); return providerModuleSubscriptions;}CIMObjectPath SubscriptionTable::_generateActiveSubscriptionsKey ( const CIMObjectPath & subscription) const{ // // Get filter and handler object paths from subscription Filter and Handler // reference property values // Array<CIMKeyBinding> subscriptionKB = subscription.getKeyBindings (); CIMObjectPath filterPath; CIMObjectPath handlerPath; for (Uint32 i = 0; i < subscriptionKB.size (); i++) { if ((subscriptionKB [i].getName () == PEGASUS_PROPERTYNAME_FILTER) && (subscriptionKB [i].getType () == CIMKeyBinding::REFERENCE)) { filterPath = subscriptionKB [i].getValue (); } if ((subscriptionKB [i].getName () == PEGASUS_PROPERTYNAME_HANDLER) && (subscriptionKB [i].getType () == CIMKeyBinding::REFERENCE)) { handlerPath = subscriptionKB [i].getValue (); } } // // Construct subscription object name for key // filterPath.setHost (String::EMPTY); handlerPath.setHost (String::EMPTY); Array <CIMKeyBinding> kb; kb.append (CIMKeyBinding (PEGASUS_PROPERTYNAME_FILTER, CIMValue (filterPath))); kb.append (CIMKeyBinding (PEGASUS_PROPERTYNAME_HANDLER, CIMValue (handlerPath))); CIMObjectPath activeSubscriptionsKey ("", subscription.getNameSpace (), subscription.getClassName (), kb); return activeSubscriptionsKey;}Boolean SubscriptionTable::_lockedLookupActiveSubscriptionsEntry ( const CIMObjectPath & key, ActiveSubscriptionsTableEntry & tableEntry) const{ ReadLock lock(_activeSubscriptionsTableLock); return (_activeSubscriptionsTable.lookup (key, tableEntry));}void SubscriptionTable::_insertActiveSubscriptionsEntry ( const CIMInstance & subscription, const Array <ProviderClassList> & providers){ PEG_METHOD_ENTER (TRC_INDICATION_SERVICE, "SubscriptionTable::_insertActiveSubscriptionsEntry"); CIMObjectPath activeSubscriptionsKey = _generateActiveSubscriptionsKey (subscription.getPath ()); ActiveSubscriptionsTableEntry entry; entry.subscription = subscription; entry.providers = providers; // // Insert returns true on success, false if duplicate key // Boolean succeeded = _activeSubscriptionsTable.insert (activeSubscriptionsKey, entry); PEGASUS_ASSERT (succeeded);#ifdef PEGASUS_INDICATION_HASHTRACE String traceString; traceString.append (activeSubscriptionsKey); traceString.append (" Providers: "); for (Uint32 i = 0; i < providers.size (); i++) { String providerName = providers [i].provider.getProperty (providers [i].provider.findProperty (PEGASUS_PROPERTYNAME_NAME)).getValue ().toString (); traceString.append (providerName); traceString.append (" Classes: "); for (Uint32 j = 0; j < providers[i].classList.size (); j++) { traceString.append (providers[i].classList[j].getString()); traceString.append (" "); } } PEG_TRACE_STRING (TRC_INDICATION_SERVICE_INTERNAL, Tracer::LEVEL3, "INSERTED _activeSubscriptionsTable entry: " + traceString);#endif PEG_METHOD_EXIT ();}void SubscriptionTable::_removeActiveSubscriptionsEntry ( const CIMObjectPath & key){ PEG_METHOD_ENTER (TRC_INDICATION_SERVICE, "SubscriptionTable::_removeActiveSubscriptionsEntry"); // // Remove returns true on success, false if not found // Boolean succeeded = _activeSubscriptionsTable.remove (key); PEGASUS_ASSERT (succeeded);#ifdef PEGASUS_INDICATION_HASHTRACE PEG_TRACE_STRING (TRC_INDICATION_SERVICE_INTERNAL, Tracer::LEVEL3, "REMOVED _activeSubscriptionsTable entry: " + key.toString ());#endif PEG_METHOD_EXIT ();}String SubscriptionTable::_generateSubscriptionClassesKey ( const CIMName & indicationClassName, const CIMNamespaceName & sourceNamespaceName) const{ String subscriptionClassesKey; // // Append indication class name to key // subscriptionClassesKey.append (indicationClassName.getString ()); // // Append source namespace name to key // subscriptionClassesKey.append (sourceNamespaceName.getString ()); return subscriptionClassesKey;}Boolean SubscriptionTable::_lockedLookupSubscriptionClassesEntry ( const String & key, SubscriptionClassesTableEntry & tableEntry) const{ ReadLock lock(_subscriptionClassesTableLock); return (_subscriptionClassesTable.lookup (key, tableEntry));}void SubscriptionTable::_insertSubscriptionClassesEntry ( const CIMName & indicationClassName, const CIMNamespaceName & sourceNamespaceName, const Array <CIMInstance> & subscriptions){ PEG_METHOD_ENTER (TRC_INDICATION_SERVICE, "SubscriptionTable::_insertSubscriptionClassesEntry"); String subscriptionClassesKey = _generateSubscriptionClassesKey (indicationClassName, sourceNamespaceName); SubscriptionClassesTableEntry entry; entry.indicationClassName = indicationClassName; entry.sourceNamespaceName = sourceNamespaceName; entry.subscriptions = subscriptions; // // Insert returns true on success, false if duplicate key // Boolean succeeded = _subscriptionClassesTable.insert (subscriptionClassesKey, entry); PEGASUS_ASSERT (succeeded);#ifdef PEGASUS_INDICATION_HASHTRACE String traceString; traceString.append (subscriptionClassesKey); traceString.append (" Subscriptions: "); for (Uint32 i = 0; i < subscriptions.size (); i++) { traceString.append (subscriptions [i].getPath ().toString()); traceString.append (" "); } PEG_TRACE_STRING (TRC_INDICATION_SERVICE_INTERNAL, Tracer::LEVEL3, "INSERTED _subscriptionClassesTable entry: " + traceString);#endif PEG_METHOD_EXIT ();}void SubscriptionTable::_removeSubscriptionClassesEntry ( const String & key){ PEG_METHOD_ENTER (TRC_INDICATION_SERVICE, "SubscriptionTable::_removeSubscriptionClassesEntry"); // // Remove returns true on success, false if not found // Boolean succeeded = _subscriptionClassesTable.remove (key); PEGASUS_ASSERT (succeeded);#ifdef PEGASUS_INDICATION_HASHTRACE PEG_TRACE_STRING (TRC_INDICATION_SERVICE_INTERNAL, Tracer::LEVEL3, "REMOVED _subscriptionClassesTable entry: " + key);#endif PEG_METHOD_EXIT ();}void SubscriptionTable::_updateSubscriptionProviders (const CIMObjectPath & activeSubscriptionsKey, const CIMInstance & subscription, const Array <ProviderClassList> & updatedProviderList){ PEG_METHOD_ENTER (TRC_INDICATION_SERVICE, "SubscriptionTable::_updateSubscriptionProviders"); if (updatedProviderList.size () > 0) { // // At least one provider is still serving the // subscription // Update entry in Active Subscriptions table // _removeActiveSubscriptionsEntry (activeSubscriptionsKey); _insertActiveSubscriptionsEntry (subscription, updatedProviderList); } else { // // The disabled or failed provider(s) was (were) the only provider(s) // serving the subscription // Implement the subscription's On Fatal Error Policy // Boolean removedOrDisabled = _subscriptionRepository->reconcileFatalError (subscription); _removeActiveSubscriptionsEntry (activeSubscriptionsKey); if (!removedOrDisabled) { // // If subscription was not disabled or deleted // Update entry in Active Subscriptions table // Note that in this case the updatedProviderList is // empty - no providers are serving the subscription // currently // _insertActiveSubscriptionsEntry (subscription, updatedProviderList); } } PEG_METHOD_EXIT ();}void SubscriptionTable::insertSubscription ( const CIMInstance & subscription, const Array <ProviderClassList> & providers, const Array <CIMName> & indicationSubclassNames, const CIMNamespaceName & sourceNamespaceName){ PEG_METHOD_ENTER (TRC_INDICATION_SERVICE, "SubscriptionTable::insertSubscription"); // // Insert entry into active subscriptions table // { WriteLock lock(_activeSubscriptionsTableLock); _insertActiveSubscriptionsEntry (subscription, providers); } // // Insert or update entries in subscription classes table // { //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -