Skip to content

Concurrency issue accessing analysis dictionary #4031

Description

@MikhailArkhipov

Occasional AF in Debug.Assert(_count < buckets.Length);

Two threads access unprotected objects

>	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.AnalysisDictionary<string, Microsoft.PythonTools.Analysis.VariableDef>.AddWorker(Microsoft.PythonTools.Analysis.AnalysisDictionary<string, Microsoft.PythonTools.Analysis.VariableDef>.Bucket[] buckets, string key, Microsoft.PythonTools.Analysis.VariableDef value, int hc, bool throwIfExists) Line 199	C#
 	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.AnalysisDictionary<string, Microsoft.PythonTools.Analysis.VariableDef>.Add(Microsoft.PythonTools.Analysis.AnalysisDictionary<string, Microsoft.PythonTools.Analysis.VariableDef>.Bucket[] buckets, string key, Microsoft.PythonTools.Analysis.VariableDef value, bool throwIfExists) Line 189	C#
 	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.AnalysisDictionary<string, Microsoft.PythonTools.Analysis.VariableDef>.AddOne(string key, Microsoft.PythonTools.Analysis.VariableDef value, bool throwIfExists) Line 112	C#
 	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.AnalysisDictionary<string, Microsoft.PythonTools.Analysis.VariableDef>.this[string].set(string key, Microsoft.PythonTools.Analysis.VariableDef value) Line 549	C#
 	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.Analyzer.InterpreterScope.AddVariable(string name, Microsoft.PythonTools.Analysis.VariableDef variable) Line 259	C#
 	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.Analyzer.InterpreterScope.CreateVariable(Microsoft.PythonTools.Parsing.Ast.Node node, Microsoft.PythonTools.Analysis.AnalysisUnit unit, string name, bool addRef) Line 235	C#
 	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.Analyzer.ModuleScope.SetModuleVariable(string name, Microsoft.PythonTools.Analysis.IAnalysisSet value) Line 33	C#
 	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.Values.ModuleInfo.EnsureModuleVariables(Microsoft.PythonTools.Analysis.PythonAnalyzer state) Line 68	C#
 	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.PythonAnalyzer.ReloadModulesAsync() Line 193	C#
 	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.LanguageServer.Server.DidChangeConfiguration(Microsoft.PythonTools.Analysis.LanguageServer.DidChangeConfigurationParams params) Line 317	C#
 	[Resuming Async Method]	
 	[External Code]	
Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.LanguageServer.Server.Initialize.AnonymousMethod__0(System.Threading.Tasks.Task<Microsoft.PythonTools.Analysis.PythonAnalyzer> t) Line 108	C#

and

>	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.AnalysisDictionary<string, Microsoft.PythonTools.Analysis.VariableDef>.AddOne(string key, Microsoft.PythonTools.Analysis.VariableDef value, bool throwIfExists) Line 112	C#
 	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.AnalysisDictionary<string, Microsoft.PythonTools.Analysis.VariableDef>.this[string].set(string key, Microsoft.PythonTools.Analysis.VariableDef value) Line 549	C#
 	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.Analyzer.InterpreterScope.AddVariable(string name, Microsoft.PythonTools.Analysis.VariableDef variable) Line 259	C#
 	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.Analyzer.InterpreterScope.CreateVariable(Microsoft.PythonTools.Parsing.Ast.Node node, Microsoft.PythonTools.Analysis.AnalysisUnit unit, string name, bool addRef) Line 235	C#
 	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.Analyzer.ModuleScope.SetModuleVariable(string name, Microsoft.PythonTools.Analysis.IAnalysisSet value) Line 33	C#
 	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.Values.ModuleInfo.EnsureModuleVariables(Microsoft.PythonTools.Analysis.PythonAnalyzer state) Line 68	C#
 	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.ProjectEntry.Parse(bool enqueueOnly, System.Threading.CancellationToken cancel) Line 228	C#
 	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Analysis.ProjectEntry.Analyze(System.Threading.CancellationToken cancel, bool enqueueOnly) Line 175	C#
 	Microsoft.Python.Analysis.Engine.dll!Microsoft.PythonTools.Intellisense.AnalysisQueue.Worker(object threadStarted) Line 233	C#

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions