apply upstream bug fixes: 4629, 5073, 5090, 5180

This commit is contained in:
jvdias 2006-07-07 23:59:07 +00:00
parent 2e1cbc6af6
commit 229df57cef
4 changed files with 271 additions and 1 deletions

144
pegasus-2.5.1-obz5073.patch Normal file
View File

@ -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; x<fields.size();x++)
- {
- fields[x].toLower();
- }
_PutRecord(os, fields);
@@ -263,10 +259,6 @@
fields.append(toClassName.getString());
fields.append(toPropertyName.getString());
- for (Uint16 x=0; x<fields.size();x++)
- {
- fields[x].toLower();
- }
_PutRecord(os, fields);
@@ -428,11 +420,6 @@
// For each line in the associations table:
while (_GetRecord(is, fields))
{
- // The cache key is always expected to be in lowercase
- // While new association records are added in lowercase,
- // the following line is required for compatibility
- // with old repositories.
- fields[FROM_CLASS_NAME_INDEX].toLower();
cache->addRecord(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 <records.size(); rx++)
--- pegasus/src/Pegasus/Repository/AssocClassCache.h.obz5073 2006-01-30 11:18:20.000000000 -0500
+++ pegasus/src/Pegasus/Repository/AssocClassCache.h 2006-06-12 13:13:18.000000000 -0400
@@ -63,24 +63,24 @@
/** Retrieve an entry for an association class through direct
* access via the from class name.
*/
- Boolean getAssocClassEntry(const String& lowerCaseFromClassName,
+ Boolean getAssocClassEntry(const String& fromClassName,
Array< Array<String> >& entryList);
/** Add a new entry to the association cache.
*/
- Boolean addRecord(const String& lowerCaseFromClassName,
+ Boolean addRecord(const String& fromClassName,
Array<String> 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<String> >& 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<String> assocClassRecord)
{
Array< Array<String> > 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<String> > 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)

View File

@ -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)
{

View File

@ -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<CIMResponseMessage*> _responseList;
Mutex _appendResponseMutex;
+ Mutex _enqueueResponseMutex;
CIMRequestMessage* _request;
Uint32 _totalIssued;
Uint32 _magicNumber;

View File

@ -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 <jvdias@redhat.com> - 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 <jvdias@redhat.com> - 2:2.5.1-8
- Fix bug 192754: remove multilib conflicts
- More upstream 2.5.2_APPROVED bug fixes: