On Tue, Apr 13, 2010 at 1:48 PM, Deng Ching <[email protected]> wrote:
> On Tue, Apr 13, 2010 at 8:26 AM, <[email protected]> wrote: > > > > > - OverallDistributedBuildQueue overallDistributedBuildQueue = > > getOverallDistributedBuildQueueByGroup( projectGroupId ); > > - > > - if ( hasBuildagentGroup( projectsBuildDefinitionsMap ) && > > overallDistributedBuildQueue == null ) > > + OverallDistributedBuildQueue overallDistributedBuildQueue = > > getOverallDistributedBuildQueueByGroup( projectGroupId, scmRoots, > scmRootId > > ); > > + > > + if ( overallDistributedBuildQueue == null ) > > { > > - if ( !hasBuildagentInGroup( projectsBuildDefinitionsMap ) ) > > - { > > - log.warn( "No build agent configured in build agent > group. > > Not building projects." ); > > + log.info( "no overall build queue by group" ); > > > > - throw new NoBuildAgentInGroupException( "No build agent > > configured in build agent group" ); > > + if ( hasBuildagentGroup( projectsBuildDefinitionsMap ) ) > > + { > > + if ( !hasBuildagentInGroup( projectsBuildDefinitionsMap > ) > > ) > > + { > > + log.warn( "No build agent configured in build agent > > group. Not building projects." ); > > + > > + throw new NoBuildAgentInGroupException( "No build > > agent configured in build agent group" ); > > + } > > + else > > + { > > + // get overall distributed build queue from build > > agent group > > + overallDistributedBuildQueue = > > getOverallDistributedBuildQueueByAgentGroup( projectsBuildDefinitionsMap > ); > > + log.info( "got overall build queue by agent group" > ); > > + } > > } > > else > > { > > - // get overall distributed build queue from build agent > > group > > - overallDistributedBuildQueue = > > getOverallDistributedBuildQueueByAgentGroup( projectsBuildDefinitionsMap > ); > > + // project does not have build agent group > > + overallDistributedBuildQueue = > > getOverallDistributedBuildQueue(); > > + log.info( "get overall build queue in all agents" ); > > > > Can we improve the log.info logs above? It looks like these these got left > out for tracing/debugging purposes :) > > > > } > > } > > - else if ( overallDistributedBuildQueue == null ) > > - { > > - // project does not have build agent group > > - overallDistributedBuildQueue = > > getOverallDistributedBuildQueue(); > > - } > > > > if ( overallDistributedBuildQueue != null ) > > { > > @@ -329,8 +336,7 @@ public class DefaultDistributedBuildMana > > { > > if ( isAgentAvailable( buildAgentUrl ) ) > > { > > - SlaveBuildAgentTransportClient client = > > - new SlaveBuildAgentTransportClient( new URL( > > buildAgentUrl ) ); > > + SlaveBuildAgentTransportService client = > > createSlaveBuildAgentTransportClientConnection( buildAgentUrl ); > > > > List<Map<String, Object>> projects = > > client.getProjectsInPrepareBuildQueue(); > > > > @@ -353,6 +359,9 @@ public class DefaultDistributedBuildMana > > } > > } > > > > + // call reload in case we disable a build agent > > + reload(); > > + > > return map; > > } > > > > @@ -369,8 +378,7 @@ public class DefaultDistributedBuildMana > > { > > if ( isAgentAvailable( buildAgentUrl ) ) > > { > > - SlaveBuildAgentTransportClient client = > > - new SlaveBuildAgentTransportClient( new URL( > > buildAgentUrl ) ); > > + SlaveBuildAgentTransportService client = > > createSlaveBuildAgentTransportClientConnection( buildAgentUrl ); > > Map<String, Object> project = > > client.getProjectCurrentlyPreparingBuild(); > > > > if ( !project.isEmpty() ) > > @@ -389,6 +397,10 @@ public class DefaultDistributedBuildMana > > } > > } > > } > > + > > + // call reload in case we disable a build agent > > + reload(); > > + > > return map; > > } > > > > @@ -405,8 +417,7 @@ public class DefaultDistributedBuildMana > > { > > if ( isAgentAvailable( buildAgentUrl ) ) > > { > > - SlaveBuildAgentTransportClient client = > > - new SlaveBuildAgentTransportClient( new URL( > > buildAgentUrl ) ); > > + SlaveBuildAgentTransportService client = > > createSlaveBuildAgentTransportClientConnection( buildAgentUrl ); > > Map<String, Object> project = > > client.getProjectCurrentlyBuilding(); > > > > if ( !project.isEmpty() ) > > @@ -426,6 +437,9 @@ public class DefaultDistributedBuildMana > > } > > } > > > > + // call reload in case we disable a build agent > > + reload(); > > + > > return map; > > } > > > > @@ -444,8 +458,7 @@ public class DefaultDistributedBuildMana > > { > > if ( isAgentAvailable( buildAgentUrl ) ) > > { > > - SlaveBuildAgentTransportClient client = > > - new SlaveBuildAgentTransportClient( new URL( > > buildAgentUrl ) ); > > + SlaveBuildAgentTransportService client = > > createSlaveBuildAgentTransportClientConnection( buildAgentUrl ); > > List<Map<String, Object>> projects = > > client.getProjectsInBuildQueue(); > > > > for ( Map<String, Object> context : projects ) > > @@ -466,6 +479,10 @@ public class DefaultDistributedBuildMana > > } > > } > > } > > + > > + // call reload in case we disable a build agent > > + reload(); > > + > > return map; > > } > > > > @@ -494,10 +511,13 @@ public class DefaultDistributedBuildMana > > { > > if ( isAgentAvailable( buildAgentUrl ) ) > > { > > - SlaveBuildAgentTransportClient client = new > > SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) ); > > + SlaveBuildAgentTransportService client = > > createSlaveBuildAgentTransportClientConnection( buildAgentUrl ); > > > > client.cancelBuild(); > > } > > + > > + // call reload in case we disable the build agent > > + reload(); > > } > > catch ( MalformedURLException e ) > > { > > @@ -515,40 +535,40 @@ public class DefaultDistributedBuildMana > > throws ContinuumException > > { > > Map<String, Object> map = new HashMap<String, Object>(); > > - > > + > > String buildAgentUrl = getBuildAgent( projectId ); > > - > > + > > if ( buildAgentUrl == null ) > > { > > return null; > > } > > - > > + > > try > > { > > if ( isAgentAvailable( buildAgentUrl ) ) > > { > > - SlaveBuildAgentTransportClient client = new > > SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) ); > > - > > + SlaveBuildAgentTransportService client = > > createSlaveBuildAgentTransportClientConnection( buildAgentUrl ); > > + > > Map<String, Object> result = client.getBuildResult( > > projectId ); > > - > > + > > if ( result != null ) > > { > > int buildDefinitionId = > > ContinuumBuildConstant.getBuildDefinitionId( result ); > > - > > + > > Project project = > projectDao.getProjectWithAllDetails( > > projectId ); > > BuildDefinition buildDefinition = > > buildDefinitionDao.getBuildDefinition( buildDefinitionId ); > > - > > + > > BuildResult oldBuildResult = > > > > buildResultDao.getLatestBuildResultForBuildDefinition( projectId, > > buildDefinitionId ); > > - > > + > > BuildResult buildResult = > > distributedBuildUtil.convertMapToBuildResult( result ); > > buildResult.setBuildDefinition( buildDefinition ); > > buildResult.setBuildNumber( project.getBuildNumber() > + > > 1 ); > > buildResult.setModifiedDependencies( > > distributedBuildUtil.getModifiedDependencies( oldBuildResult, result ) ); > > buildResult.setScmResult( > > distributedBuildUtil.getScmResult( result ) ); > > - > > + > > String buildOutput = > > ContinuumBuildConstant.getBuildOutput( result ); > > - > > + > > map.put( ContinuumBuildConstant.KEY_BUILD_RESULT, > > buildResult ); > > map.put( ContinuumBuildConstant.KEY_BUILD_OUTPUT, > > buildOutput ); > > } > > @@ -562,7 +582,10 @@ public class DefaultDistributedBuildMana > > { > > throw new ContinuumException( "Error while retrieving build > > result for project" + projectId, e ); > > } > > - > > + > > + // call reload in case we disable the build agent > > + reload(); > > + > > return map; > > } > > > > @@ -570,15 +593,15 @@ public class DefaultDistributedBuildMana > > throws ContinuumException > > { > > List<Installation> installations = new ArrayList<Installation>(); > > - > > + > > try > > { > > if ( isAgentAvailable( buildAgentUrl ) ) > > { > > - SlaveBuildAgentTransportClient client = new > > SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) ); > > - > > + SlaveBuildAgentTransportService client = > > createSlaveBuildAgentTransportClientConnection( buildAgentUrl ); > > + > > List<Map<String, String>> installationsList = > > client.getAvailableInstallations(); > > - > > + > > for ( Map context : installationsList ) > > { > > Installation installation = new Installation(); > > @@ -589,6 +612,10 @@ public class DefaultDistributedBuildMana > > installations.add( installation ); > > } > > } > > + > > + // call reload in case we disable the build agent > > + reload(); > > + > > return installations; > > } > > catch ( Exception e ) > > @@ -601,26 +628,26 @@ public class DefaultDistributedBuildMana > > throws ContinuumException > > { > > BuildResult buildResult = > > buildResultDao.getLatestBuildResultForProject( projectId ); > > - > > + > > if ( buildResult != null ) > > { > > String buildAgentUrl = buildResult.getBuildUrl(); > > - > > + > > if ( buildAgentUrl == null ) > > { > > return ""; > > } > > - > > + > > try > > { > > if ( directory == null ) > > { > > directory = ""; > > } > > - > > + > > if ( isAgentAvailable( buildAgentUrl ) ) > > { > > - SlaveBuildAgentTransportClient client = new > > SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) ); > > + SlaveBuildAgentTransportService client = > > createSlaveBuildAgentTransportClientConnection( buildAgentUrl ); > > return client.generateWorkingCopyContent( projectId, > > directory, baseUrl, imageBaseUrl ); > > } > > } > > @@ -633,6 +660,10 @@ public class DefaultDistributedBuildMana > > log.error( "Error while generating working copy content > > from build agent " + buildAgentUrl, e ); > > } > > } > > + > > + // call reload in case we disable the build agent > > + reload(); > > + > > return ""; > > } > > > > @@ -640,21 +671,21 @@ public class DefaultDistributedBuildMana > > throws ContinuumException > > { > > BuildResult buildResult = > > buildResultDao.getLatestBuildResultForProject( projectId ); > > - > > + > > if ( buildResult != null ) > > { > > String buildAgentUrl = buildResult.getBuildUrl(); > > - > > + > > if ( buildAgentUrl == null ) > > { > > return ""; > > } > > - > > + > > try > > { > > if ( isAgentAvailable( buildAgentUrl ) ) > > { > > - SlaveBuildAgentTransportClient client = new > > SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) ); > > + SlaveBuildAgentTransportService client = > > createSlaveBuildAgentTransportClientConnection( buildAgentUrl ); > > return client.getProjectFileContent( projectId, > > directory, filename ); > > } > > } > > @@ -667,6 +698,10 @@ public class DefaultDistributedBuildMana > > log.error( "Error while retrieving content of " + > filename, > > e ); > > } > > } > > + > > + // call reload in case we disable the build agent > > + reload(); > > + > > return ""; > > } > > > > @@ -677,7 +712,7 @@ public class DefaultDistributedBuildMana > > { > > if ( isAgentAvailable( buildAgentUrl ) ) > > { > > - SlaveBuildAgentTransportClient client = new > > SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) ); > > + SlaveBuildAgentTransportService client = > > createSlaveBuildAgentTransportClientConnection( buildAgentUrl ); > > client.removeFromPrepareBuildQueue( projectGroupId, > > scmRootId ); > > } > > } > > @@ -695,6 +730,9 @@ public class DefaultDistributedBuildMana > > throw new ContinuumException( "Error occurred while removing > > projectGroupId=" + projectGroupId + " scmRootId=" + > > scmRootId + " from prepare > build > > queue of agent " + buildAgentUrl, e ); > > } > > + > > + // call reload in case we disable the build agent > > + reload(); > > } > > > > public void removeFromBuildQueue( String buildAgentUrl, int > projectId, > > int buildDefinitionId ) > > @@ -704,7 +742,7 @@ public class DefaultDistributedBuildMana > > { > > if ( isAgentAvailable( buildAgentUrl ) ) > > { > > - SlaveBuildAgentTransportClient client = new > > SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) ); > > + SlaveBuildAgentTransportService client = > > createSlaveBuildAgentTransportClientConnection( buildAgentUrl ); > > client.removeFromBuildQueue( projectId, buildDefinitionId > > ); > > } > > } > > @@ -722,6 +760,9 @@ public class DefaultDistributedBuildMana > > throw new ContinuumException( "Error occurred while removing > > project " + projectId + > > " from build queue of agent " + > > buildAgentUrl, e ); > > } > > + > > + // call reload in case we disable the build agent > > + reload(); > > } > > > > public void removeFromPrepareBuildQueue( List<String> hashCodes ) > > @@ -735,7 +776,7 @@ public class DefaultDistributedBuildMana > > { > > if ( isAgentAvailable( buildAgentUrl ) ) > > { > > - SlaveBuildAgentTransportClient client = new > > SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) ); > > + SlaveBuildAgentTransportService client = > > createSlaveBuildAgentTransportClientConnection( buildAgentUrl ); > > client.removeFromPrepareBuildQueue( hashCodes ); > > } > > } > > @@ -749,6 +790,9 @@ public class DefaultDistributedBuildMana > > } > > } > > } > > + > > + // call reload in case we disable a build agent > > + reload(); > > } > > > > public void removeFromBuildQueue( List<String> hashCodes ) > > @@ -762,7 +806,7 @@ public class DefaultDistributedBuildMana > > { > > if ( isAgentAvailable( buildAgentUrl ) ) > > { > > - SlaveBuildAgentTransportClient client = new > > SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) ); > > + SlaveBuildAgentTransportService client = > > createSlaveBuildAgentTransportClientConnection( buildAgentUrl ); > > client.removeFromBuildQueue( hashCodes ); > > } > > } > > @@ -776,11 +820,171 @@ public class DefaultDistributedBuildMana > > } > > } > > } > > + > > + // call reload in case we disable a build agent > > + reload(); > > + } > > + > > + public boolean isProjectInAnyPrepareBuildQueue( int projectId, int > > buildDefinitionId ) > > + throws ContinuumException > > + { > > + boolean found = false; > > + > > + synchronized( overallDistributedBuildQueues ) > > + { > > + for ( String buildAgentUrl : > > overallDistributedBuildQueues.keySet() ) > > + { > > + try > > + { > > + if ( isAgentAvailable( buildAgentUrl ) ) > > + { > > + SlaveBuildAgentTransportService client = > > createSlaveBuildAgentTransportClientConnection( buildAgentUrl ); > > + > > + List<Map<String, Object>> projects = > > client.getProjectsAndBuildDefinitionsInPrepareBuildQueue(); > > + > > + for ( Map<String, Object> context : projects ) > > + { > > + int pid = > ContinuumBuildConstant.getProjectId( > > context ); > > + int buildId = > > ContinuumBuildConstant.getBuildDefinitionId( context ); > > + > > + if ( pid == projectId && buildId == > > buildDefinitionId ) > > + { > > + found = true; > > + break; > > > > I think you can just return true here and return false if the loop has > finished instead of the multiple if conditions and break statements? > > I need to call the reload() function at the end because a build agent might have been disabled while in the loop. Initially, the removal of the distributed build queue when a build agent is disabled is inside the disableBuildAgent method. But this causes a concurrent modification exception so I had to move it out there, thus calling the reload function at the end. + } > > + > > + } > > + } > > + > > + if ( found ) > > + { > > + break; > > + } > > + } > > + catch ( MalformedURLException e ) > > + { > > + throw new ContinuumException( "Invalid build agent > > url: " + buildAgentUrl ); > > + } > > + catch ( Exception e ) > > + { > > + throw new ContinuumException( "Error while > retrieving > > projects in prepare build queue", e ); > > + } > > + } > > + } > > + > > + // call reload in case we disable a build agent > > + reload(); > > + > > + if ( found ) > > + { > > + return true; > > + } > > + else > > + { > > + return false; > > + } > > + } > > + > > + public boolean isProjectInAnyBuildQueue( int projectId, int > > buildDefinitionId ) > > + throws ContinuumException > > + { > > + Map<String, List<BuildProjectTask>> map = > > getProjectsInBuildQueue(); > > + > > + for ( String url : map.keySet() ) > > + { > > + for ( BuildProjectTask task : map.get( url ) ) > > + { > > + if ( task.getProjectId() == projectId && > > task.getBuildDefinitionId() == buildDefinitionId ) > > + { > > + return true; > > + } > > + } > > + } > > + > > + return false; > > + } > > + > > + public boolean isProjectCurrentlyPreparingBuild( int projectId, int > > buildDefinitionId ) > > + throws ContinuumException > > + { > > + boolean found = false; > > + > > + synchronized( overallDistributedBuildQueues ) > > + { > > + for ( String buildAgentUrl : > > overallDistributedBuildQueues.keySet() ) > > + { > > + try > > + { > > + if ( isAgentAvailable( buildAgentUrl ) ) > > + { > > + SlaveBuildAgentTransportService client = > > createSlaveBuildAgentTransportClientConnection( buildAgentUrl ); > > + List<Map<String, Object>> projects = > > client.getProjectsAndBuildDefinitionsCurrentlyPreparingBuild(); > > + > > + for ( Map<String, Object> context : projects ) > > + { > > + int pid = > ContinuumBuildConstant.getProjectId( > > context ); > > + int buildId = > > ContinuumBuildConstant.getBuildDefinitionId( context ); > > + > > + if ( pid == projectId && buildId == > > buildDefinitionId ) > > + { > > + found = true; > > + break; > > > > Same comment as above :) > > > > + } > > + } > > + } > > + > > + if ( found ) > > + { > > + break; > > + } > > + } > > + catch ( MalformedURLException e ) > > + { > > + throw new ContinuumException( "Invalid build agent > > url: " + buildAgentUrl ); > > + } > > + catch ( Exception e ) > > + { > > + throw new ContinuumException( "Error retrieving > > projects currently preparing build in " + buildAgentUrl, e ); > > + } > > + } > > + } > > + > > + // call reload in case we disable a build agent > > + reload(); > > + > > + if ( found ) > > + { > > + return true; > > + } > > + else > > + { > > + return false; > > + } > > + } > > + > > + public boolean isProjectCurrentlyBuilding( int projectId, int > > buildDefinitionId ) > > + throws ContinuumException > > + { > > + Map<String, BuildProjectTask> map = > > getProjectsCurrentlyBuilding(); > > + > > + for ( String url : map.keySet() ) > > + { > > + BuildProjectTask task = map.get( url ); > > + > > + if ( task.getProjectId() == projectId && > > task.getBuildDefinitionId() == buildDefinitionId ) > > + { > > + return true; > > + } > > + } > > + > > + return false; > > } > > > > > Thanks, > Deng >
