2

For the last couple years I have been using the Cruise Control .NET continuous integration server, and it has worked well. Recently, I have started receiving this error after starting WebDashboard. Does anyone have any suggestions on how to resolve this error? Did I make some error in the ccnet.cong? TIA.

INTERNAL ERROR: Item has already been added. Key in dictionary: 'tmp' Key being added: 'tmp'
System.ArgumentException: Item has already been added. Key in dictionary: 'tmp'  Key being added: 'tmp'
   at System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add)
   at System.Collections.Specialized.StringDictionary.Add(String key, String value)
   at System.CodeDom.Compiler.Executor.ExecWaitWithCaptureUnimpersonated(SafeUserTokenHandle userToken, String cmd, String currentDir, TempFileCollection tempFiles, String& outputName, String& errorName, String trueCmdLine)
   at System.CodeDom.Compiler.Executor.ExecWaitWithCapture(SafeUserTokenHandle userToken, String cmd, String currentDir, TempFileCollection tempFiles, String& outputName, String& errorName, String trueCmdLine)
   at Microsoft.CSharp.CSharpCodeGenerator.Compile(CompilerParameters options, String compilerDirectory, String compilerExe, String arguments, String& outputFile, Int32& nativeReturnValue, String trueArgs)
   at Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch(CompilerParameters options, String[] fileNames)
   at Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters options, String[] sources)
   at Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options, String[] sources)
   at System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource(CompilerParameters options, String[] sources)
   at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence)
   at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters parameters, Assembly assembly, Hashtable assemblies)
   at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence)
   at System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace)
   at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
   at System.Xml.Serialization.XmlSerializer..ctor(Type type)
   at ThoughtWorks.CruiseControl.Core.State.FileStateManager.LoadState(TextReader stateFileReader) in C:\Tools\CruiseControl.NET-1.9.1.0.source\project\core\state\FileStateManager.cs:line 111
   at ThoughtWorks.CruiseControl.Core.State.FileStateManager.LoadState(String project) in C:\Tools\CruiseControl.NET-1.9.1.0.source\project\core\state\FileStateManager.cs:line 95
   at ThoughtWorks.CruiseControl.Core.IntegrationResultManager.get_CurrentIntegration() in C:\Tools\CruiseControl.NET-1.9.1.0.source\project\core\IntegrationResultManager.cs:line 76
   at ThoughtWorks.CruiseControl.Core.IntegrationResultManager.get_LastIntegrationResult() in C:\Tools\CruiseControl.NET-1.9.1.0.source\project\core\IntegrationResultManager.cs:line 41
   at ThoughtWorks.CruiseControl.Core.IntegrationResultManager.get_LastIntegration() in C:\Tools\CruiseControl.NET-1.9.1.0.source\project\core\IntegrationResultManager.cs:line 58
   at ThoughtWorks.CruiseControl.Core.Project.get_LastIntegration() in C:\Tools\CruiseControl.NET-1.9.1.0.source\project\core\Project.cs:line 1367
   at ThoughtWorks.CruiseControl.Core.Project.CreateProjectStatus(IProjectIntegrator integrator) in C:\Tools\CruiseControl.NET-1.9.1.0.source\project\core\Project.cs:line 1332
   at ThoughtWorks.CruiseControl.Core.IntegrationQueueManager.GetProjectStatuses() in C:\Tools\CruiseControl.NET-1.9.1.0.source\project\core\IntegrationQueueManager.cs:line 111
   at ThoughtWorks.CruiseControl.Core.CruiseServer.<>c__DisplayClasse.<GetProjectStatus>b__d(ServerRequest ) in C:\Tools\CruiseControl.NET1.9.1.0.source\project\core\CruiseServer.cs:line 475
   at ThoughtWorks.CruiseControl.Core.CruiseServer.RunServerRequest(ServerRequest request, Nullable`1 permission, Nullable`1 eventType, Action`1 action) in C:\Tools\CruiseControl.NET-1.9.1.0.source\project\core\CruiseServer.cs:line 1512

UPDATE: Here is the code I am working on--"action(request);" is CruiseServer.cs line 1512:

    /// <summary>
    /// Encapsulates the code to process a request.
    /// </summary>
    /// <param name="request"></param>
    /// <param name="permission"></param>
    /// <param name="eventType"></param>
    /// <param name="action"></param>
    /// <returns></returns>
    private Response RunServerRequest(ServerRequest request,
        SecurityPermission? permission,
        SecurityEvent? eventType,
        Action<ServerRequest> action)
    {
        Response response = new Response(request);
        try
        {
            // Validate the request and check the security token
            ValidateRequest(request);
            if (permission.HasValue)
            {
                CheckSecurity(request.SessionToken,
                    null,
                    permission.Value,
                    eventType);
            }

            // Perform the actual action
            action(request);
            response.Result = ResponseResult.Success;
        }
        catch (Exception error)
        {
            // Security exceptions have already been logged, just need to log any other exception
            if (!(error is SecurityException))
            {
                Log.Warning(error);
            }

            // Tell the caller the request failed and include the error message (but not the stack trace!)
            response.Result = ResponseResult.Failure;
            response.ErrorMessages.Add(
                new ErrorMessage(
                    error.Message,
                    error.GetType().Name));
        }
        return response;
    }

This is the function it ends up going to, where I then step into the "data = integrationQueueManager...":

    /// <summary>
    /// Gets information about the last build status, current activity and project name.
    /// for all projects on a cruise server
    /// </summary>
    public virtual ProjectStatusResponse GetProjectStatus(ServerRequest request)
    {
        ProjectStatus[] data = null;
        ProjectStatusResponse response = new ProjectStatusResponse(RunServerRequest(request,
            null,
            null,
            delegate
                {
                data = integrationQueueManager.GetProjectStatuses();
                if (request.SessionToken != SecurityOverride.SessionIdentifier)
                {
                    data = this.FilterProjects(request.SessionToken, data);
                }
            }));
        if (data != null) response.Projects.AddRange(data);
        return response;
    }

Next I step into "projectStatusList.Add...":

    /// <summary>
    /// Gets the project statuses.  
    /// </summary>
    /// <returns></returns>
    /// <remarks></remarks>
    public ProjectStatus[] GetProjectStatuses()
    {
        ArrayList projectStatusList = new ArrayList();
        foreach (IProjectIntegrator integrator in projectIntegrators)
        {
            IProject project = integrator.Project;
            projectStatusList.Add(project.CreateProjectStatus(integrator));
        }
        return (ProjectStatus[]) projectStatusList.ToArray(typeof (ProjectStatus));
    }

Then finally, the application throws an exception at "var lastIntegration = this.LastIntegration;" in this function:

    /// <summary>
    /// Creates the project status. 
    /// </summary>
    /// <param name="integrator">The integrator.</param>
    /// <returns></returns>
    /// <remarks></remarks>
    public ProjectStatus CreateProjectStatus(IProjectIntegrator integrator)
    {
        var lastIntegration = this.LastIntegration;
        ProjectStatus status = new ProjectStatus(
            this.Name,
            this.Category,
            this.CurrentActivity,
            lastIntegration.Status,
            integrator.State,
            this.WebURL,
            lastIntegration.StartTime,
            lastIntegration.Label,
            lastIntegration.LastSuccessfulIntegrationLabel,
            this.Triggers.NextBuild,
            this.CurrentBuildStage(),
            this.QueueName,
            this.QueuePriority,
            this.Parameters);
        status.Description = this.Description;
        status.Messages = this.messages.ToArray();
        status.ShowForceBuildButton = this.ShowForceBuildButton;
        status.ShowStartStopButton = this.ShowStartStopButton;
        return status;
    }

When I hover my mouse cursor over "var lastIntegration = this.LastIntegration" it says "this.LastIntegration = 'this.LastIntegration' threw an exception of type 'System.ArgumentException'". Thank you so much for your feedback!

user8128167
  • 6,929
  • 6
  • 66
  • 79
  • Roger can you show the code that you have for the Dictionary where the error is happening.. if you don't know where the error is being thrown I would also suggest `Debugging` the code and then paste the code here so someone can help.. `When using a Dictionary , you are getting the error because there is already a duplicate Key that was added to the Key Value Pair` – MethodMan Feb 15 '13 at 17:04

1 Answers1

2

I had the same problem with installation of my program at one user. It turned out that the problem was caused by Cygwin installation and not my program. Here is the link.

https://github.com/git-tfs/git-tfs/issues/135

Rusty Horse
  • 2,388
  • 7
  • 26
  • 38
  • Thank you for the suggestion. I'm running on windows, and don't have any control over environment variables on my workstation. One used to be able to set the environment in visual studio (http://stackoverflow.com/questions/100543/how-do-i-set-specific-environment-variables-when-debugging-in-visual-studio), however, I can't see how to do that in visual studio 2010. – user8128167 Aug 13 '13 at 18:24