Es wurde versucht, einen Mutex freizugeben, der nicht im Besitz des Aufrufers war.

Neulich habe ich in einem SharePoint 2007 (MOSS) folgende Fehlermeldung erhalten.“Es wurde versucht, einen Mutex freizugeben, der nicht im Besitz des Aufrufers war. (Ausnahme von HRESULT:0x00000120)“.

Zunächst betrachten wir einmal, was ein Mutex überhaupt ist. Dazu ein schneller Blick in die MSDN Dokumentation:

„Wenn zwei oder mehr Threads gleichzeitig auf eine gemeinsam genutzte Ressource zugreifen müssen, benötigt das System einen Synchronisierungsmechanismus, der sicherstellt, dass die Ressource von jeweils nur einem Thread verwendet wird. Mutex
ist ein primitiver Synchronisierungstyp, der jeweils nur einem Thread exklusiven Zugriff auf die gemeinsam genutzte Ressource gewährt. Wenn ein Thread einen Mutex erhält, wird ein zweiter Thread, der diesen Mutex abruft, so lange angehalten, bis der erste Thread den Mutex freigibt.“

Auf den ersten Schock folgten die ersten Rettungsversuche. Zunächst habe ich den IIS des Servers sowie den Server selbst neu gestartet, beides ohne Erfolg. Als Ursache konnte ich auch den SQL Server des Portals ausschließen. Die Anzahl der Workerprozesse des IIS haben ebenfalls keinen Einfluss.

Nach einiger Suche bin ich im Blog MsSharePointTip auf diesen Eintrag von Joshua Fuente gestoßen.

Die Ursache liegt im Ausgabecache der Site Collection. Dieser unterstützt maximal 10.000 ACL (Access Control Lists). Wird dieses Limit bei aktivem Output Cache überschritten, erscheint der hier beschriebene Fehler.

Einen entsprechenden Hinweis findet sich auch in diesem Technet Artikel. Hier wird auch die Funktionsweise des Output Cache beschrieben.

Nachdem wir nun wissen, wie das Problem entsteht können wir uns an die Lösung begeben.

Schnelle Lösung

Der Ausgabecache der Site Collection muss deaktiviert werden. Dazu rufen wir die Websiteeinstellungen der Root Site Collection auf (http://<MyPortal>/_layouts/settings.aspx). Im Bereich Websitesammlungsverwaltung kann der Ausgabecache der Websitesammlung ausgeschaltet werden.

MuTex Fehlermeldung

Die Seiten sind anschließend sofort wieder erreichbar. Allerdings werden nicht alle Elemente korrekt angezeigt (Bilder fehlen auf den Seiten). Im Eventlog finden sich diese Fehlermeldungen:

Die Lösung ist also noch nicht zufriedenstellend.

Endgültige Lösung

Da der Output Cache deutliche Performance Verbesserung verspricht, indem hier alle großen Objekte, die häufig angefragt werden, zwischengespeichert werden, sollte dieser wieder aktiviert werden. Es muss also ermittelt werden, wie viele Access Control Lists verwendet werden und wo diese zur Anwendung kommen. Nur so kann die Anzahl der ACLs reduziert werden.

Mittels diesem SQL Statement kann ermittelt werden, wie viele ACL’s es gibt:

Hiermit lässt sich ermitteln, in welcher Website die meisten ACLs hinterlegt sind:

Ist die Website bekannt, kann das Query so angepasst werden, dass nur eine bestimmte Website angezeigt wird:

In meinem Fall lag es an einer Liste, die über zahlreiche Listenelemente (einige tausend) verfügte. Jedes Listenelement hatte dabei eigene Berechtigungsinformationen. Nachdem die Anzahl der Listenelemente mit eigener Berechtigung reduziert wurde, war der Spuk auch schon vorbei.