From 229df57cef0c7f872195dc03bb1fc17e0b49a221 Mon Sep 17 00:00:00 2001 From: jvdias Date: Fri, 7 Jul 2006 23:59:07 +0000 Subject: [PATCH] apply upstream bug fixes: 4629, 5073, 5090, 5180 --- pegasus-2.5.1-obz5073.patch | 144 ++++++++++++++++++++++++++++++++++++ pegasus-2.5.1-obz5090.patch | 46 ++++++++++++ pegasus-2.5.1-obz5180.patch | 67 +++++++++++++++++ tog-pegasus.spec | 15 +++- 4 files changed, 271 insertions(+), 1 deletion(-) create mode 100644 pegasus-2.5.1-obz5073.patch create mode 100644 pegasus-2.5.1-obz5090.patch create mode 100644 pegasus-2.5.1-obz5180.patch diff --git a/pegasus-2.5.1-obz5073.patch b/pegasus-2.5.1-obz5073.patch new file mode 100644 index 0000000..2514451 --- /dev/null +++ b/pegasus-2.5.1-obz5073.patch @@ -0,0 +1,144 @@ +--- pegasus/src/Pegasus/Repository/AssocClassTable.cpp.obz5073 2006-01-30 11:18:20.000000000 -0500 ++++ pegasus/src/Pegasus/Repository/AssocClassTable.cpp 2006-06-12 13:13:18.000000000 -0400 +@@ -218,10 +218,6 @@ + fields.append(toClassName.getString()); + fields.append(toPropertyName.getString()); + +- for (Uint16 x=0; xaddRecord(fields[FROM_CLASS_NAME_INDEX], + fields); + } +@@ -483,7 +470,6 @@ + for (Uint16 idx=0; idx < classList.size(); idx++) + { + String fromClassName = classList[idx].getString(); +- fromClassName.toLower(); + if (cache->getAssocClassEntry(fromClassName, records)) + { + for (Uint16 rx=0; rx >& entryList); + + /** Add a new entry to the association cache. + */ +- Boolean addRecord(const String& lowerCaseFromClassName, ++ Boolean addRecord(const String& fromClassName, + Array assocClassEntry); + + /** Remove an entry from the association cache specified by the given + * association class name. + */ +- Boolean removeEntry(const String& lowerCaseFromClassName); ++ Boolean removeEntry(const String& fromClassName); + + /** Remove an association record from the association cache specified by the given + * from class name and association name. + */ +- Boolean removeRecord(const String& lowerCaseFromClassName, +- const String& lowerCaseAssocClassName); ++ Boolean removeRecord(const String& fromClassName, ++ const String& assocClassName); + + /** Check if the cache is loaded with objects already. + */ +--- pegasus/src/Pegasus/Repository/AssocClassCache.cpp.obz5073 2006-01-30 11:18:20.000000000 -0500 ++++ pegasus/src/Pegasus/Repository/AssocClassCache.cpp 2006-06-12 13:13:18.000000000 -0400 +@@ -86,9 +86,12 @@ + /** Retrieve the list of entries for a from class through direct + * access via the from class name. + */ +-Boolean AssocClassCache::getAssocClassEntry(const String& lowerCaseFromClassName, ++Boolean AssocClassCache::getAssocClassEntry(const String& fromClassName, + Array< Array >& entryList) + { ++ String lowerCaseFromClassName = fromClassName; ++ lowerCaseFromClassName.toLower(); ++ + return _assocClassCache->lookup(lowerCaseFromClassName,entryList); + } + +@@ -97,10 +100,12 @@ + * the new entry is appended to the old entry. Otherwise a new entry + * is added to the cache. + */ +-Boolean AssocClassCache::addRecord(const String& lowerCaseFromClassName, ++Boolean AssocClassCache::addRecord(const String& fromClassName, + Array assocClassRecord) + { + Array< Array > oldAssocClassEntryList; ++ String lowerCaseFromClassName = fromClassName; ++ lowerCaseFromClassName.toLower(); + + if (_assocClassCache->lookup(lowerCaseFromClassName, oldAssocClassEntryList)) + { +@@ -115,18 +120,24 @@ + /** Remove an entry from the association cache specified by the given + * from class name. + */ +-Boolean AssocClassCache::removeEntry(const String& lowerCaseFromClassName) ++Boolean AssocClassCache::removeEntry(const String& fromClassName) + { ++ String lowerCaseFromClassName = fromClassName; ++ lowerCaseFromClassName.toLower(); ++ + return _assocClassCache->remove(lowerCaseFromClassName); + } + + /** Remove an association record from the association cache specified by the given + * from class name and association name. + */ +-Boolean AssocClassCache::removeRecord(const String& lowerCaseFromClassName, +- const String& lowerCaseAssocClassName) ++Boolean AssocClassCache::removeRecord(const String& fromClassName, ++ const String& assocClassName) + { + Array< Array > oldAssocClassEntryList; ++ String lowerCaseFromClassName = fromClassName; ++ lowerCaseFromClassName.toLower(); ++ + if (_assocClassCache->lookup(lowerCaseFromClassName, oldAssocClassEntryList)) + { + for (Uint16 idx=0; idx < oldAssocClassEntryList.size(); idx++ ) +@@ -134,7 +145,8 @@ + // The first entry in each record is the association class + // name. Find the record for the association class and remove + // it from the cache entry. +- if (oldAssocClassEntryList[idx][ASSOC_CLASS_NAME_INDEX] == lowerCaseAssocClassName) ++ if (String::equalNoCase(oldAssocClassEntryList[idx][ASSOC_CLASS_NAME_INDEX], ++ assocClassName)) + { + _assocClassCache->remove(lowerCaseFromClassName); + if (oldAssocClassEntryList.size() > 1) diff --git a/pegasus-2.5.1-obz5090.patch b/pegasus-2.5.1-obz5090.patch new file mode 100644 index 0000000..e5fb224 --- /dev/null +++ b/pegasus-2.5.1-obz5090.patch @@ -0,0 +1,46 @@ +--- pegasus/src/Pegasus/ProviderManager2/CMPI/CMPIProvider.cpp.obz5090 2006-01-30 11:18:04.000000000 -0500 ++++ pegasus/src/Pegasus/ProviderManager2/CMPI/CMPIProvider.cpp 2006-07-07 18:20:48.000000000 -0400 +@@ -297,19 +297,6 @@ + */ + void CMPIProvider::_terminate(Boolean terminating) + { +- { +- WriteLock writeLock (broker.rwsemClassCache); +- +- if (broker.clsCache) { +- ClassCache::Iterator i=broker.clsCache->start(); +- for (; i; i++) { +- delete i.value(); +- } +- delete broker.clsCache; +- broker.clsCache=NULL; +- } +- } +- + const OperationContext opc; + CMPIStatus rc={CMPI_RC_OK,NULL}; + CMPI_ContextOnStack eCtx(opc); +@@ -350,8 +337,23 @@ + if (rc.rc==CMPI_RC_ERR_NOT_SUPPORTED) noUnload=true; + if ((rc.rc == CMPI_RC_DO_NOT_UNLOAD) || (rc.rc==CMPI_RC_NEVER_UNLOAD)) noUnload =true; + } ++ + if (noUnload == false) + { ++ // Cleanup the class cache ++ { ++ WriteLock writeLock (broker.rwsemClassCache); ++ ++ if (broker.clsCache) { ++ ClassCache::Iterator i=broker.clsCache->start(); ++ for (; i; i++) { ++ delete i.value(); ++ } ++ delete broker.clsCache; ++ broker.clsCache=NULL; ++ } ++ } ++ + // Check the thread list to make sure the thread has been de-allocated + if (_threadWatchList.size() != 0) + { diff --git a/pegasus-2.5.1-obz5180.patch b/pegasus-2.5.1-obz5180.patch new file mode 100644 index 0000000..3d153ea --- /dev/null +++ b/pegasus-2.5.1-obz5180.patch @@ -0,0 +1,67 @@ +--- pegasus/src/Pegasus/Server/CIMOperationRequestDispatcher.cpp.obz5180 2006-07-07 18:19:11.000000000 -0400 ++++ pegasus/src/Pegasus/Server/CIMOperationRequestDispatcher.cpp 2006-07-07 19:03:51.000000000 -0400 +@@ -421,7 +421,18 @@ + CIMResponseMessage *&response) + { + static const char func[] = "CIMOperationRequestDispatcher::_enqueueResponse"; +- AutoMutex autoMut(_mut); ++ // Obtain the _enqueueResponseMutex mutex for this chunked request. ++ // This mutex is used to serialize chunked responses from all incoming ++ // provider threads. It is imperative that the sequencing done by the ++ // resequenceResponse() method and the writing of the chunked response ++ // to the connection socket (done as a synchronous enqueue at the end ++ // of this method) are atomic to ensure that the chunk that is marked ++ // as isComplete for the overall response is indeed the last chunk ++ // returned to the client. See PEP 140 for details. ++ // This mutex was moved into the OperationAggregate class as part of ++ // bug 4629 because we only need to serialize on a per-request basis. ++ // This prevents serializing independent requests on separate connections. ++ AutoMutex autoMut(poA->_enqueueResponseMutex); + Boolean isComplete = false; + + try +@@ -550,13 +561,6 @@ + CIMException(CIM_ERR_FAILED, String(failMsg)); + } + +- if (isComplete == true) +- { +- // also deletes the copied request attached to it +- delete poA; +- poA = 0; +- } +- + // after sending, the response has been deleted externally + response = 0; + +@@ -1785,6 +1789,12 @@ + // the ENTIRE response to the request. + + isComplete = service->_enqueueResponse(poA, response); ++ if (isComplete) ++ { ++ // also deletes the copied request attached to it ++ delete poA; ++ poA = 0; ++ } + + PEG_METHOD_EXIT(); + } +--- pegasus/src/Pegasus/Server/CIMOperationRequestDispatcher.h.obz5180 2006-02-10 14:13:47.000000000 -0500 ++++ pegasus/src/Pegasus/Server/CIMOperationRequestDispatcher.h 2006-07-07 19:00:43.000000000 -0400 +@@ -159,6 +159,7 @@ + */ + class PEGASUS_SERVER_LINKAGE OperationAggregate + { ++ friend class CIMOperationRequestDispatcher; + public: + /* Operation Aggregate constructor. Builds an aggregate + object. +@@ -227,6 +228,7 @@ + + Array _responseList; + Mutex _appendResponseMutex; ++ Mutex _enqueueResponseMutex; + CIMRequestMessage* _request; + Uint32 _totalIssued; + Uint32 _magicNumber; diff --git a/tog-pegasus.spec b/tog-pegasus.spec index a3e0cf9..5532e50 100644 --- a/tog-pegasus.spec +++ b/tog-pegasus.spec @@ -41,7 +41,7 @@ %endif Version: 2.5.1 -Release: 8%{?LINUX_VERSION:.%{LINUX_VERSION}} +Release: 10%{?LINUX_VERSION:.%{LINUX_VERSION}} Epoch: 2 # Summary: OpenPegasus WBEM Services for Linux @@ -94,6 +94,9 @@ Patch31: pegasus-2.5.1-obz5072.patch Patch32: pegasus-2.5.1-obz5083.patch Patch33: pegasus-2.5.1-obz5115.patch Patch34: pegasus-2.5.1-obz5119.patch +Patch35: pegasus-2.5.1-obz5073.patch +Patch36: pegasus-2.5.1-obz5090.patch +Patch37: pegasus-2.5.1-obz5180.patch # Conflicts: openwbem Provides: tog-pegasus-cimserver @@ -183,6 +186,9 @@ The OpenPegasus WBEM tests for the OpenPegasus %{version} Linux rpm. %patch32 -p1 -b .obz5083 %patch33 -p1 -b .obz5115 %patch34 -p1 -b .obz5119 +%patch35 -p1 -b .obz5073 +%patch36 -p1 -b .obz5090 +%patch37 -p1 -b .obz5180 %build rm -rf ${RPM_BUILD_ROOT} || :; @@ -376,6 +382,13 @@ fi %changelog +* Fri Jul 07 2006 Jason Vas Dias - 2:2.4.1-10 +- More upstream 2.5.2_APPROVED bug fixes: + o 4629: Pegasus freezes when it is unable to send out completely, the results of a request + o 5073: Class Names on Reference, ReferenceNames, Assoc, AssocNames returned lower case + o 5090: cimserver crash on a request after attempting to unload idle CMPI providers + o 5180: OperationAggregate deleted in _enqueueResponse while member mutex held + * Fri Jun 09 2006 Jason Vas Dias - 2:2.5.1-8 - Fix bug 192754: remove multilib conflicts - More upstream 2.5.2_APPROVED bug fixes: