You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@continuum.apache.org by ct...@apache.org on 2011/03/17 12:46:30 UTC
svn commit: r1082448 - in /continuum/trunk:
continuum-api/src/main/java/org/apache/continuum/builder/distributed/manager/
continuum-core/src/main/java/org/apache/continuum/builder/distributed/manager/
continuum-xmlrpc/continuum-xmlrpc-api/src/main/java...
Author: ctan
Date: Thu Mar 17 11:46:30 2011
New Revision: 1082448
URL: http://svn.apache.org/viewvc?rev=1082448&view=rev
Log:
[CONTINUUM-2617] cancel a project build for distributed builds
Submitted By: John Michael Luy
Modified:
continuum/trunk/continuum-api/src/main/java/org/apache/continuum/builder/distributed/manager/DistributedBuildManager.java
continuum/trunk/continuum-core/src/main/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManager.java
continuum/trunk/continuum-xmlrpc/continuum-xmlrpc-api/src/main/java/org/apache/maven/continuum/xmlrpc/ContinuumService.java
continuum/trunk/continuum-xmlrpc/continuum-xmlrpc-client/src/main/java/org/apache/maven/continuum/xmlrpc/client/ContinuumXmlRpcClient.java
continuum/trunk/continuum-xmlrpc/continuum-xmlrpc-server/src/main/java/org/apache/maven/continuum/xmlrpc/server/ContinuumServiceImpl.java
Modified: continuum/trunk/continuum-api/src/main/java/org/apache/continuum/builder/distributed/manager/DistributedBuildManager.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-api/src/main/java/org/apache/continuum/builder/distributed/manager/DistributedBuildManager.java?rev=1082448&r1=1082447&r2=1082448&view=diff
==============================================================================
--- continuum/trunk/continuum-api/src/main/java/org/apache/continuum/builder/distributed/manager/DistributedBuildManager.java (original)
+++ continuum/trunk/continuum-api/src/main/java/org/apache/continuum/builder/distributed/manager/DistributedBuildManager.java Thu Mar 17 11:46:30 2011
@@ -103,4 +103,7 @@ public interface DistributedBuildManager
boolean isProjectCurrentlyBuilding( int projectId, int buildDefinitionId )
throws ContinuumException;
+
+ String getBuildAgentUrl( int projectId )
+ throws ContinuumException;
}
Modified: continuum/trunk/continuum-core/src/main/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManager.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManager.java?rev=1082448&r1=1082447&r2=1082448&view=diff
==============================================================================
--- continuum/trunk/continuum-core/src/main/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManager.java (original)
+++ continuum/trunk/continuum-core/src/main/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManager.java Thu Mar 17 11:46:30 2011
@@ -1055,6 +1055,54 @@ public class DefaultDistributedBuildMana
return agentUrl;
}
+ public String getBuildAgentUrl( int projectId )
+ throws ContinuumException
+ {
+ String agentUrl = null;
+
+ synchronized( overallDistributedBuildQueues )
+ {
+ for ( String buildAgentUrl : overallDistributedBuildQueues.keySet() )
+ {
+ OverallDistributedBuildQueue overallDistributedBuildQueue =
+ overallDistributedBuildQueues.get( buildAgentUrl );
+
+ if ( overallDistributedBuildQueue != null )
+ {
+ try
+ {
+ if ( isAgentAvailable( buildAgentUrl ) )
+ {
+ SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
+
+ if ( client.isProjectGroupCurrentlyPreparingBuild( projectId ) ||
+ client.isProjectCurrentlyBuilding( projectId ) ||
+ client.isProjectGroupInPrepareBuildQueue( projectId ) ||
+ client.isProjectInBuildQueue( projectId ) )
+ {
+ agentUrl = buildAgentUrl;
+ break;
+ }
+ }
+ }
+ catch ( MalformedURLException e )
+ {
+ log.warn( "Unable to check if project " + projectId + " is currently queued or processed in agent: Invalid build agent url" + buildAgentUrl );
+ }
+ catch ( Exception e )
+ {
+ log.warn( "Unable to check if project " + projectId + " is currently queued or processed in agent", e );
+ }
+ }
+ }
+ }
+
+ // call reload in case we disable a build agent
+ reload();
+
+ return agentUrl;
+ }
+
private void createDistributedBuildQueueForAgent( String buildAgentUrl )
throws ComponentLookupException
{
@@ -1521,4 +1569,4 @@ public class DefaultDistributedBuildMana
this.container = container;
}
-}
\ No newline at end of file
+}
Modified: continuum/trunk/continuum-xmlrpc/continuum-xmlrpc-api/src/main/java/org/apache/maven/continuum/xmlrpc/ContinuumService.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-xmlrpc/continuum-xmlrpc-api/src/main/java/org/apache/maven/continuum/xmlrpc/ContinuumService.java?rev=1082448&r1=1082447&r2=1082448&view=diff
==============================================================================
--- continuum/trunk/continuum-xmlrpc/continuum-xmlrpc-api/src/main/java/org/apache/maven/continuum/xmlrpc/ContinuumService.java (original)
+++ continuum/trunk/continuum-xmlrpc/continuum-xmlrpc-api/src/main/java/org/apache/maven/continuum/xmlrpc/ContinuumService.java Thu Mar 17 11:46:30 2011
@@ -1189,6 +1189,16 @@ public interface ContinuumService
boolean cancelCurrentBuild()
throws Exception;
+ /**
+ * Cancel a project build
+ *
+ * @param projectId the project id
+ * @return
+ * @throws Exception
+ */
+ boolean cancelBuild( int projectId )
+ throws Exception;
+
// ----------------------------------------------------------------------
// TODO:Users
// ----------------------------------------------------------------------
Modified: continuum/trunk/continuum-xmlrpc/continuum-xmlrpc-client/src/main/java/org/apache/maven/continuum/xmlrpc/client/ContinuumXmlRpcClient.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-xmlrpc/continuum-xmlrpc-client/src/main/java/org/apache/maven/continuum/xmlrpc/client/ContinuumXmlRpcClient.java?rev=1082448&r1=1082447&r2=1082448&view=diff
==============================================================================
--- continuum/trunk/continuum-xmlrpc/continuum-xmlrpc-client/src/main/java/org/apache/maven/continuum/xmlrpc/client/ContinuumXmlRpcClient.java (original)
+++ continuum/trunk/continuum-xmlrpc/continuum-xmlrpc-client/src/main/java/org/apache/maven/continuum/xmlrpc/client/ContinuumXmlRpcClient.java Thu Mar 17 11:46:30 2011
@@ -583,6 +583,12 @@ public class ContinuumXmlRpcClient
return continuum.cancelCurrentBuild();
}
+ public boolean cancelBuild( int projectId )
+ throws Exception
+ {
+ return continuum.cancelBuild( projectId );
+ }
+
// ----------------------------------------------------------------------
// Release Result
// ----------------------------------------------------------------------
Modified: continuum/trunk/continuum-xmlrpc/continuum-xmlrpc-server/src/main/java/org/apache/maven/continuum/xmlrpc/server/ContinuumServiceImpl.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-xmlrpc/continuum-xmlrpc-server/src/main/java/org/apache/maven/continuum/xmlrpc/server/ContinuumServiceImpl.java?rev=1082448&r1=1082447&r2=1082448&view=diff
==============================================================================
--- continuum/trunk/continuum-xmlrpc/continuum-xmlrpc-server/src/main/java/org/apache/maven/continuum/xmlrpc/server/ContinuumServiceImpl.java (original)
+++ continuum/trunk/continuum-xmlrpc/continuum-xmlrpc-server/src/main/java/org/apache/maven/continuum/xmlrpc/server/ContinuumServiceImpl.java Thu Mar 17 11:46:30 2011
@@ -40,6 +40,7 @@ import org.apache.continuum.configuratio
import org.apache.continuum.configuration.BuildAgentGroupConfiguration;
import org.apache.continuum.configuration.ContinuumConfigurationException;
import org.apache.continuum.dao.SystemConfigurationDao;
+import org.apache.continuum.model.project.ProjectScmRoot;
import org.apache.continuum.purge.ContinuumPurgeManagerException;
import org.apache.continuum.purge.PurgeConfigurationServiceException;
import org.apache.continuum.repository.RepositoryServiceException;
@@ -102,7 +103,7 @@ public class ContinuumServiceImpl
private static final MapperIF mapper = DozerBeanMapperSingletonWrapper.getInstance();
private final Logger logger = LoggerFactory.getLogger( ContinuumServiceImpl.class );
-
+
/**
* @plexus.requirement
*/
@@ -658,7 +659,7 @@ public class ContinuumServiceImpl
{
ProjectSummary ps = getProjectSummary( projectId );
checkBuildProjectInGroupAuthorization( ps.getProjectGroup().getName() );
-
+
buildProjectWithBuildDefinition( projectId, buildDefinitionId,
new org.apache.continuum.utils.build.BuildTrigger( ContinuumProjectState.TRIGGER_SCHEDULED, "" ) );
return 0;
@@ -675,7 +676,7 @@ public class ContinuumServiceImpl
continuum.buildProject( projectId, buildTrigger );
return 0;
}
-
+
public int buildProject( int projectId, int buildDefinitionId, BuildTrigger xmlrpcBuildTrigger )
throws ContinuumException, NoBuildAgentException, NoBuildAgentInGroupException
{
@@ -684,7 +685,7 @@ public class ContinuumServiceImpl
org.apache.continuum.utils.build.BuildTrigger buildTrigger = populateBuildTrigger( xmlrpcBuildTrigger );
buildProjectWithBuildDefinition( projectId, buildDefinitionId, buildTrigger );
-
+
return 0;
}
@@ -859,7 +860,7 @@ public class ContinuumServiceImpl
return populateAddingResult( result );
}
-
+
public AddingResult addMavenTwoProject( String url, int projectGroupId, boolean checkProtocol,
boolean useCredentialsCache, boolean recursiveProjects,
boolean checkoutInSingleDirectory )
@@ -1269,7 +1270,7 @@ public class ContinuumServiceImpl
try
{
Map<String, List<org.apache.continuum.taskqueue.BuildProjectTask>> buildTasks;
-
+
if ( continuum.getConfiguration().isDistributedBuildEnabled() )
{
buildTasks = distributedBuildManager.getProjectsInBuildQueue();
@@ -1278,7 +1279,7 @@ public class ContinuumServiceImpl
{
buildTasks = parallelBuildsManager.getProjectsInBuildQueues();
}
-
+
Set<String> keys = buildTasks.keySet();
List<org.apache.continuum.taskqueue.BuildProjectTask> convertedTasks =
new ArrayList<org.apache.continuum.taskqueue.BuildProjectTask>();
@@ -1324,6 +1325,105 @@ public class ContinuumServiceImpl
}
}
+ public boolean cancelBuild( int projectId )
+ throws ContinuumException
+ {
+ checkManageQueuesAuthorization();
+ try
+ {
+ if ( continuum.getConfiguration().isDistributedBuildEnabled() )
+ {
+ DistributedBuildManager dbm = continuum.getDistributedBuildManager();
+
+ String buildAgentUrl = dbm.getBuildAgentUrl( projectId );
+
+ // wait if already preparing
+ if ( dbm.isProjectCurrentlyPreparingBuild( projectId, -1 ) )
+ {
+ while ( dbm.isProjectCurrentlyPreparingBuild( projectId, -1 ) )
+ {
+ try
+ {
+ Thread.sleep( 1000 );
+ }
+ catch ( InterruptedException e )
+ {
+ // do nothing
+ }
+ }
+ }
+
+ if ( dbm.isProjectInAnyPrepareBuildQueue( projectId, -1 ) )
+ {
+ if ( buildAgentUrl != null )
+ {
+ ProjectScmRoot scmRoot = continuum.getProjectScmRootByProject( projectId );
+ dbm.removeFromPrepareBuildQueue( buildAgentUrl, scmRoot.getProjectGroup().getId(),
+ scmRoot.getId() );
+ }
+ }
+ else if ( dbm.isProjectInAnyBuildQueue( projectId, -1 ) )
+ {
+ dbm.removeFromBuildQueue( buildAgentUrl, projectId, -1 );
+ }
+ else if ( dbm.isProjectCurrentlyBuilding( projectId, -1 ) )
+ {
+ if ( buildAgentUrl != null )
+ {
+ dbm.cancelDistributedBuild( buildAgentUrl );
+ }
+ }
+
+ return true;
+ }
+ else
+ {
+ // if currently preparing build or being checked out, wait until done
+ if ( parallelBuildsManager.isProjectCurrentlyPreparingBuild( projectId ) ||
+ parallelBuildsManager.isProjectCurrentlyBeingCheckedOut( projectId ) )
+ {
+ while ( parallelBuildsManager.isProjectCurrentlyPreparingBuild( projectId ) ||
+ parallelBuildsManager.isProjectCurrentlyBeingCheckedOut( projectId ) )
+ {
+ try
+ {
+ Thread.sleep( 1000 );
+ }
+ catch ( InterruptedException e )
+ {
+ // do nothing
+ }
+ }
+ }
+
+ if ( parallelBuildsManager.isInPrepareBuildQueue( projectId ) )
+ {
+ ProjectScmRoot scmRoot = continuum.getProjectScmRootByProject( projectId );
+ parallelBuildsManager.removeProjectFromPrepareBuildQueue( scmRoot.getProjectGroup().getId(),
+ scmRoot.getId() );
+ }
+ else if ( parallelBuildsManager.isInAnyCheckoutQueue( projectId ) )
+ {
+ parallelBuildsManager.removeProjectFromCheckoutQueue( projectId );
+ }
+ else if ( parallelBuildsManager.isInAnyBuildQueue( projectId ) )
+ {
+ parallelBuildsManager.removeProjectFromBuildQueue( projectId );
+ }
+ else if ( parallelBuildsManager.isProjectInAnyCurrentBuild( projectId ) )
+ {
+ return parallelBuildsManager.cancelBuild( projectId );
+ }
+
+ return true;
+ }
+ }
+ catch ( BuildManagerException e )
+ {
+ throw new ContinuumException( e.getMessage(), e );
+ }
+ }
+
// ----------------------------------------------------------------------
// Release Results
// ----------------------------------------------------------------------
@@ -1994,7 +2094,7 @@ public class ContinuumServiceImpl
{
bd.setSchedule( null );
}
-
+
if ( StringUtils.isNotEmpty( buildDef.getDescription() ) )
{
bd.setDescription( buildDef.getDescription() );
@@ -2002,7 +2102,7 @@ public class ContinuumServiceImpl
return bd;
}
-
+
protected void buildProjectWithBuildDefinition( int projectId, int buildDefinitionId, org.apache.continuum.utils.build.BuildTrigger buildTrigger )
throws ContinuumException, NoBuildAgentException, NoBuildAgentInGroupException
{
@@ -2730,7 +2830,7 @@ public class ContinuumServiceImpl
{
return serializeObject( this.addMavenTwoProjectAsSingleProject( url, projectGroupId ) );
}
-
+
public Map<String, Object> addMavenTwoProjectRPC( String url, int projectGroupId, boolean checkProtocol,
boolean useCredentialsCache, boolean recursiveProjects,
boolean checkoutInSingleDirectory )