You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ni...@apache.org on 2014/03/31 16:59:34 UTC
[2/3] git commit: improving deployment policy validation,
using Java concurrency
improving deployment policy validation, using Java concurrency
Project: http://git-wip-us.apache.org/repos/asf/incubator-stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-stratos/commit/3a54eff3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-stratos/tree/3a54eff3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-stratos/diff/3a54eff3
Branch: refs/heads/master
Commit: 3a54eff331a3808d7de0a3ffdddde37ec17fa219
Parents: ab73ebd
Author: Nirmal Fernando <ni...@apache.org>
Authored: Mon Mar 31 20:28:31 2014 +0530
Committer: Nirmal Fernando <ni...@apache.org>
Committed: Mon Mar 31 20:28:31 2014 +0530
----------------------------------------------------------------------
.../concurrent/PartitionValidatorCallable.java | 88 ++++++++++++++++++++
.../impl/CloudControllerServiceImpl.java | 67 ++++++---------
.../runtime/FasterLookUpDataHolder.java | 17 +++-
3 files changed, 128 insertions(+), 44 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/3a54eff3/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/PartitionValidatorCallable.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/PartitionValidatorCallable.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/PartitionValidatorCallable.java
new file mode 100644
index 0000000..2ae5274
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/PartitionValidatorCallable.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.stratos.cloud.controller.concurrent;
+
+import java.util.concurrent.Callable;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.cloud.controller.deployment.partition.Partition;
+import org.apache.stratos.cloud.controller.exception.InvalidIaasProviderException;
+import org.apache.stratos.cloud.controller.exception.InvalidPartitionException;
+import org.apache.stratos.cloud.controller.interfaces.Iaas;
+import org.apache.stratos.cloud.controller.pojo.Cartridge;
+import org.apache.stratos.cloud.controller.pojo.IaasProvider;
+import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
+import org.apache.stratos.cloud.controller.validate.interfaces.PartitionValidator;
+
+public class PartitionValidatorCallable implements Callable<IaasProvider> {
+
+ private static final Log log = LogFactory.getLog(PartitionValidatorCallable.class);
+ private Partition partition;
+ private Cartridge cartridge;
+
+ public PartitionValidatorCallable(Partition partition, Cartridge cartridge) {
+ this.partition = partition;
+ this.cartridge = cartridge;
+ }
+
+ @Override
+ public IaasProvider call() throws Exception {
+ String provider = partition.getProvider();
+ IaasProvider iaasProvider = cartridge.getIaasProvider(provider);
+
+ if (iaasProvider == null) {
+ String msg =
+ "Invalid Partition - " + partition.toString() +
+ ". Cause: Iaas Provider is null for Provider: " + provider;
+ log.error(msg);
+ throw new InvalidPartitionException(msg);
+ }
+
+ Iaas iaas = iaasProvider.getIaas();
+
+ if (iaas == null) {
+
+ try {
+ iaas = CloudControllerUtil.getIaas(iaasProvider);
+ } catch (InvalidIaasProviderException e) {
+ String msg =
+ "Invalid Partition - " + partition.toString() +
+ ". Cause: Unable to build Iaas of this IaasProvider [Provider] : " + provider+". "+e.getMessage();
+ log.error(msg, e);
+ throw new InvalidPartitionException(msg, e);
+ }
+
+ }
+
+ PartitionValidator validator = iaas.getPartitionValidator();
+ validator.setIaasProvider(iaasProvider);
+ IaasProvider updatedIaasProvider =
+ validator.validate(partition.getId(),
+ CloudControllerUtil.toJavaUtilProperties(partition.getProperties()));
+
+ if (log.isDebugEnabled()) {
+ log.debug("Partition "+partition.toString()+ " is validated successfully "
+ + "against the Cartridge: "+cartridge.getType());
+ }
+
+ return updatedIaasProvider;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/3a54eff3/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
index adff085..05d98cb 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
@@ -20,6 +20,7 @@ package org.apache.stratos.cloud.controller.impl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.cloud.controller.concurrent.PartitionValidatorCallable;
import org.apache.stratos.cloud.controller.concurrent.ThreadExecutor;
import org.apache.stratos.cloud.controller.deployment.partition.Partition;
import org.apache.stratos.cloud.controller.exception.*;
@@ -46,7 +47,9 @@ import org.wso2.carbon.registry.core.exceptions.RegistryException;
import java.util.*;
import java.util.Properties;
+import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import com.google.common.net.InetAddresses;
@@ -1032,7 +1035,6 @@ public class CloudControllerServiceImpl implements CloudControllerService {
}
-
@Override
public boolean validateDeploymentPolicy(String cartridgeType, Partition[] partitions)
@@ -1048,48 +1050,27 @@ public class CloudControllerServiceImpl implements CloudControllerService {
log.error(msg);
throw new InvalidCartridgeTypeException(msg);
}
-
- for (Partition partition : partitions) {
- String provider = partition.getProvider();
- IaasProvider iaasProvider = cartridge.getIaasProvider(provider);
-
- if (iaasProvider == null) {
- String msg =
- "Invalid Partition - " + partition.toString() +
- ". Cause: Iaas Provider is null for Provider: " + provider;
- log.error(msg);
- throw new InvalidPartitionException(msg);
- }
-
- Iaas iaas = iaasProvider.getIaas();
-
- if (iaas == null) {
-
- try {
- iaas = CloudControllerUtil.getIaas(iaasProvider);
- } catch (InvalidIaasProviderException e) {
- String msg =
- "Invalid Partition - " + partition.toString() +
- ". Cause: Unable to build Iaas of this IaasProvider [Provider] : " + provider+". "+e.getMessage();
- log.error(msg, e);
- throw new InvalidPartitionException(msg, e);
- }
-
- }
-
- PartitionValidator validator = iaas.getPartitionValidator();
- validator.setIaasProvider(iaasProvider);
- IaasProvider updatedIaasProvider =
- validator.validate(partition.getId(),
- CloudControllerUtil.toJavaUtilProperties(partition.getProperties()));
- // add to a temporary Map
- partitionToIaasProviders.put(partition.getId(), updatedIaasProvider);
-
- if (log.isDebugEnabled()) {
- log.debug("Partition "+partition.toString()+ " is validated successfully "
- + "against the Cartridge: "+cartridgeType);
- }
-
+
+ Map<String, Future<IaasProvider>> jobList = new HashMap<String, Future<IaasProvider>>();
+
+ for (Partition partition : partitions) {
+ Callable<IaasProvider> worker = new PartitionValidatorCallable(
+ partition, cartridge);
+ Future<IaasProvider> job = FasterLookUpDataHolder.getInstance()
+ .getExecutor().submit(worker);
+ jobList.put(partition.getId(), job);
+ }
+
+ // Retrieve the results of the concurrently performed sanity checks.
+ for (String partitionId : jobList.keySet()) {
+ Future<IaasProvider> job = jobList.get(partitionId);
+ try {
+ // add to a temporary Map
+ partitionToIaasProviders.put(partitionId, job.get());
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ throw new InvalidPartitionException(e.getMessage(), e);
+ }
}
// if and only if the deployment policy valid
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/3a54eff3/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/runtime/FasterLookUpDataHolder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/runtime/FasterLookUpDataHolder.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/runtime/FasterLookUpDataHolder.java
index 0c1cb91..970e2c0 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/runtime/FasterLookUpDataHolder.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/runtime/FasterLookUpDataHolder.java
@@ -32,6 +32,8 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
/**
* This object holds all runtime data and provides faster access. This is a Singleton class.
@@ -66,6 +68,11 @@ public class FasterLookUpDataHolder implements Serializable{
private Map<String, ClusterContext> clusterIdToContext = new ConcurrentHashMap<String, ClusterContext>();
/**
+ * Thread pool used in this task to execute parallel tasks.
+ */
+ private transient ExecutorService executor = Executors.newFixedThreadPool(20);
+
+ /**
* List of registered {@link Cartridge}s
*/
private List<Cartridge> cartridges;
@@ -119,7 +126,7 @@ public class FasterLookUpDataHolder implements Serializable{
private FasterLookUpDataHolder() {
cartridges = new ArrayList<Cartridge>();
-
+
}
public List<Cartridge> getCartridges() {
@@ -359,4 +366,12 @@ public class FasterLookUpDataHolder implements Serializable{
this.clusterIdToContext = clusterIdToContext;
}
+ public ExecutorService getExecutor() {
+ return executor;
+ }
+
+ public void setExecutor(ExecutorService executor) {
+ this.executor = executor;
+ }
+
}
\ No newline at end of file