[Mono-dev] Deadlock in System.Web.Caching.Cache class

Ivan Radovanovic rivanr at gmail.com
Sat Nov 7 09:04:13 EST 2009


Hello, I am experiencing weird deadlock in .net applications running 
latest release version of mono (2.4.2.3) on FreeBSD (I don't think it is 
OS specific, and it doesn't show all the times, but still often enough 
so I can trace it)

Stack from thread 1:
    at 
System.Web.Compilation.BuildManager.RemoveVirtualPathFromCaches(System.Web.VirtualPath 
virtualPath)
    at 
System.Web.Compilation.BuildManager.OnVirtualPathChanged(System.String 
key, System.Object value, CacheItemRemovedReason removedReason)
    at System.Web.Caching.Cache.InvokePrivateCallbacks()
    at System.Web.HttpRuntime.ShutdownAppDomain(System.Object args)
====================================================================
Stack from thread 2:
    at System.Web.Caching.Cache.Add(System.String key, System.Object 
value, System.Web.Caching.CacheDependency dependencies, DateTime 
absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority 
priority, System.Web.Caching.CacheItemRemovedCallback onRemoveCallback)
    at System.Web.Compilation.BuildManager.AddToCache(System.String 
virtualPath, System.Web.Compilation.BuildProvider bp)
    at 
System.Web.Compilation.BuildManager.GenerateAssembly(System.Web.Compilation.AssemblyBuilder 
abuilder, System.Collections.Generic.List`1 buildItems, 
System.Web.VirtualPath virtualPath, BuildKind buildKind)
    at 
System.Web.Compilation.BuildManager.BuildAssembly(System.Web.VirtualPath 
virtualPath)
    at System.Web.Compilation.BuildManager.GetCompiledType(System.String 
virtualPath)
    at System.Web.Compilation.AspComponentFoundry+TagNameFoundry.LoadType()
    at 
System.Web.Compilation.AspComponentFoundry+TagNameFoundry.GetType(System.String 
componentName, System.String ByRef source, System.String ByRef ns)
    at 
System.Web.Compilation.AspComponentFoundry.CreateComponent(System.Web.Compilation.Foundry 
foundry, System.String tagName, System.String prefix, System.String tag)
    at 
System.Web.Compilation.AspComponentFoundry.GetComponent(System.String 
tagName)
    at System.Web.UI.RootBuilder.GetChildControlType(System.String 
tagName, IDictionary attribs)
    at System.Web.UI.ControlBuilder.CreateSubBuilder(System.String 
tagid, System.Collections.Hashtable atts, System.Type childType, 
System.Web.UI.TemplateParser parser, ILocation location)
    at System.Web.Compilation.AspGenerator.ProcessTag(ILocation 
location, System.String tagid, System.Web.Compilation.TagAttributes 
atts, TagType tagtype, Boolean ByRef ignored)
    at System.Web.Compilation.AspGenerator.TagParsed(ILocation location, 
TagType tagtype, System.String tagid, 
System.Web.Compilation.TagAttributes attributes)
    at System.Web.Compilation.AspParser.OnTagParsed(TagType tagtype, 
System.String id, System.Web.Compilation.TagAttributes attributes)
    at System.Web.Compilation.AspParser.Parse()
    at System.Web.Compilation.AspGenerator.Parse(System.IO.TextReader 
reader, System.String filename, Boolean doInitParser)
    at System.Web.Compilation.GenericBuildProvider`1.Parse()
    at System.Web.Compilation.GenericBuildProvider`1.get_CodeCompilerType()
    at 
System.Web.Compilation.BuildManager.GetCodeDomProviderType(System.Web.Compilation.BuildProvider 
provider)
    at 
System.Web.Compilation.BuildManager+BuildItem..ctor(System.Web.Compilation.BuildProvider 
provider)
    at 
System.Web.Compilation.BuildManager.LoadBuildProviders(System.Web.VirtualPath 
virtualPath, System.String virtualDir, 
System.Collections.Generic.Dictionary`2 vpCache, BuildKind ByRef kind, 
System.String ByRef assemblyBaseName)
    at 
System.Web.Compilation.BuildManager.BuildAssembly(System.Web.VirtualPath 
virtualPath)
    at System.Web.Compilation.BuildManager.GetCompiledType(System.String 
virtualPath)
    at System.Web.Compilation.AspComponentFoundry+TagNameFoundry.LoadType()
    at 
System.Web.Compilation.AspComponentFoundry+TagNameFoundry.GetType(System.String 
componentName, System.String ByRef source, System.String ByRef ns)
    at 
System.Web.Compilation.AspComponentFoundry.CreateComponent(System.Web.Compilation.Foundry 
foundry, System.String tagName, System.String prefix, System.String tag)
    at 
System.Web.Compilation.AspComponentFoundry.GetComponent(System.String 
tagName)
    at System.Web.UI.RootBuilder.GetChildControlType(System.String 
tagName, IDictionary attribs)
    at System.Web.UI.ControlBuilder.CreateSubBuilder(System.String 
tagid, System.Collections.Hashtable atts, System.Type childType, 
System.Web.UI.TemplateParser parser, ILocation location)
    at System.Web.Compilation.AspGenerator.ProcessTag(ILocation 
location, System.String tagid, System.Web.Compilation.TagAttributes 
atts, TagType tagtype, Boolean ByRef ignored)
    at System.Web.Compilation.AspGenerator.TagParsed(ILocation location, 
TagType tagtype, System.String tagid, 
System.Web.Compilation.TagAttributes attributes)
    at System.Web.Compilation.AspParser.OnTagParsed(TagType tagtype, 
System.String id, System.Web.Compilation.TagAttributes attributes)
    at System.Web.Compilation.AspParser.Parse()
    at System.Web.Compilation.AspGenerator.Parse(System.IO.TextReader 
reader, System.String filename, Boolean doInitParser)
    at System.Web.Compilation.GenericBuildProvider`1.Parse()
    at System.Web.Compilation.GenericBuildProvider`1.get_CodeCompilerType()
    at 
System.Web.Compilation.BuildManager.GetCodeDomProviderType(System.Web.Compilation.BuildProvider 
provider)
    at 
System.Web.Compilation.BuildManager+BuildItem..ctor(System.Web.Compilation.BuildProvider 
provider)
    at 
System.Web.Compilation.BuildManager.LoadBuildProviders(System.Web.VirtualPath 
virtualPath, System.String virtualDir, 
System.Collections.Generic.Dictionary`2 vpCache, BuildKind ByRef kind, 
System.String ByRef assemblyBaseName)
    at 
System.Web.Compilation.BuildManager.BuildAssembly(System.Web.VirtualPath 
virtualPath)
    at System.Web.Compilation.BuildManager.GetCompiledType(System.String 
virtualPath)
    at 
System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(System.String 
virtualPath, System.Type requiredBaseType)
    at System.Web.UI.PageParser.GetCompiledPageInstance(System.String 
virtualPath, System.String inputFile, System.Web.HttpContext context)
    at 
System.Web.UI.PageHandlerFactory.GetHandler(System.Web.HttpContext 
context, System.String requestType, System.String url, System.String path)
    at System.Web.HttpApplication.GetHandler(System.Web.HttpContext 
context, System.String url, Boolean ignoreContextHandler)
    at System.Web.HttpApplication.GetHandler(System.Web.HttpContext 
context, System.String url)
    at System.Web.HttpApplication+<Pipeline>c__Iterator2.MoveNext()
    at System.Web.HttpApplication.Tick()
    at System.Web.HttpApplication.Start(System.Object x)
    at 
System.Web.HttpApplication.System.Web.IHttpHandler.ProcessRequest(System.Web.HttpContext 
context)
    at System.Web.HttpRuntime.Process(System.Web.HttpWorkerRequest req)
    at System.Web.HttpRuntime.RealProcessRequest(System.Object o)
    at 
System.Web.HttpRuntime.ProcessRequest(System.Web.HttpWorkerRequest wr)
    at Mono.WebServer.MonoWorkerRequest.ProcessRequest()
    at 
Mono.WebServer.BaseApplicationHost.ProcessRequest(Mono.WebServer.MonoWorkerRequest 
mwr)
    at Mono.WebServer.XSPApplicationHost.ProcessRequest(Int32 reqId, 
Int64 localEPAddr, Int32 localEPPort, Int64 remoteEPAdds, Int32 
remoteEPPort, System.String verb, System.String path, System.String 
queryString, System.String protocol, System.Byte[] inputBuffer, 
System.String redirect, IntPtr socket, Mono.WebServer.SslInformations ssl)
    at Mono.WebServer.XSPWorker.RunInternal(System.Object state)
===============================================================================

As you can see there is deadlock between 
System.Web.Compilation.BuildManager.AddToCache (thread 2, second item) 
and System.Web.Compilation.BuildManager.GenerateAssembly (both using 
lock (buildCacheLock)) and between System.Web.Caching.Cache.Add and 
System.Web.Caching.Cache.InvokePrivateCallbacks() (both using lock(cache))

I am curious if someone is working on this bug (is this known bug?) or I 
should try to fix it myself?

Best regards,
Ivan


More information about the Mono-devel-list mailing list