fixing cartridge deployment issues and global deployment policy deployment issues
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/2c07846c Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/2c07846c Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/2c07846c Branch: refs/heads/master Commit: 2c07846c3b8ef6c66446908fce427e827af281d4 Parents: f6c912b Author: reka <[email protected]> Authored: Mon Dec 1 22:21:04 2014 +0530 Committer: reka <[email protected]> Committed: Mon Dec 1 22:21:27 2014 +0530 ---------------------------------------------------------------------- .../autoscaler/api/AutoScalerServiceImpl.java | 27 + .../AutoscalerTopologyEventReceiver.java | 169 +- .../autoscaler/pojo/policy/PolicyManager.java | 9 + .../pojo/policy/deployment/ChildPolicy.java | 4 +- .../partition/network/ChildLevelPartition.java | 22 +- .../stratos/autoscaler/util/AutoscalerUtil.java | 54 +- .../org.apache.stratos.cloud.controller/pom.xml | 2 - .../src/main/resources/META-INF/services.xml | 2 +- .../clustering/DistributedObjectProvider.java | 3 +- .../src/main/resources/AutoScalerService.wsdl | 1490 +++++++++--------- 10 files changed, 982 insertions(+), 800 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/2c07846c/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java index 739ae9d..91745d8 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java @@ -21,6 +21,7 @@ package org.apache.stratos.autoscaler.api; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.stratos.autoscaler.applications.ApplicationHolder; import org.apache.stratos.autoscaler.context.AutoscalerContext; //import org.apache.stratos.autoscaler.NetworkPartitionLbHolder; import org.apache.stratos.autoscaler.applications.parser.ApplicationParser; @@ -45,12 +46,14 @@ import org.apache.stratos.autoscaler.pojo.policy.autoscale.AutoscalePolicy; import org.apache.stratos.autoscaler.pojo.policy.deployment.DeploymentPolicy; import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.Partition; import org.apache.stratos.autoscaler.registry.RegistryManager; +import org.apache.stratos.autoscaler.util.AutoscalerUtil; import org.apache.stratos.common.Properties; import org.apache.stratos.common.Property; import org.apache.stratos.common.kubernetes.KubernetesGroup; import org.apache.stratos.common.kubernetes.KubernetesHost; import org.apache.stratos.common.kubernetes.KubernetesMaster; import org.apache.stratos.messaging.domain.applications.Application; +import org.apache.stratos.messaging.message.receiver.topology.TopologyManager; import org.apache.stratos.metadata.client.defaults.DefaultMetaDataServiceClient; import org.apache.stratos.metadata.client.defaults.MetaDataServiceClient; import org.apache.stratos.metadata.client.exception.MetaDataServiceClientException; @@ -112,6 +115,30 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface { boolean hasDeployed = PolicyManager.getInstance().deployDeploymentPolicy(deploymentPolicy); //Need to start the application Monitor after validation of the deployment policies. + //Check whether all the clusters are there + ApplicationHolder.acquireReadLock(); + boolean allClusterInitialized = false; + + try { + Application application = ApplicationHolder.getApplications(). + getApplication(deploymentPolicy.getApplicationId()); + if(application != null) { + allClusterInitialized = AutoscalerUtil.allClustersInitialized(application); + } + + } finally { + ApplicationHolder.releaseReadLock(); + } + + if(allClusterInitialized) { + AutoscalerUtil.getInstance(). + startApplicationMonitor(deploymentPolicy.getApplicationId()); + + } else { + log.info("The application clusters are not yet created. " + + "Waiting for them to be created"); + } + return hasDeployed; } http://git-wip-us.apache.org/repos/asf/stratos/blob/2c07846c/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java index 73bd6db..98c0afa 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java @@ -27,14 +27,14 @@ import org.apache.stratos.autoscaler.context.cluster.ClusterContextFactory; import org.apache.stratos.autoscaler.context.cluster.VMClusterContext; import org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher; import org.apache.stratos.autoscaler.event.publisher.InstanceNotificationPublisher; -import org.apache.stratos.autoscaler.exception.application.DependencyBuilderException; -import org.apache.stratos.autoscaler.exception.application.TopologyInConsistentException; import org.apache.stratos.autoscaler.exception.partition.PartitionValidationException; import org.apache.stratos.autoscaler.exception.policy.PolicyValidationException; -import org.apache.stratos.autoscaler.monitor.MonitorFactory; import org.apache.stratos.autoscaler.monitor.cluster.AbstractClusterMonitor; import org.apache.stratos.autoscaler.monitor.component.ApplicationMonitor; import org.apache.stratos.autoscaler.monitor.events.ClusterStatusEvent; +import org.apache.stratos.autoscaler.pojo.policy.PolicyManager; +import org.apache.stratos.autoscaler.pojo.policy.deployment.DeploymentPolicy; +import org.apache.stratos.autoscaler.util.AutoscalerUtil; import org.apache.stratos.autoscaler.util.ServiceReferenceHolder; import org.apache.stratos.messaging.domain.applications.Application; import org.apache.stratos.messaging.domain.applications.Applications; @@ -143,7 +143,17 @@ public class AutoscalerTopologyEventReceiver implements Runnable { if (applications != null) { for (Application application : applications.getApplications().values()) { if (allClustersInitialized(application)) { - startApplicationMonitor(application.getUniqueIdentifier()); + DeploymentPolicy policy = PolicyManager.getInstance(). + getDeploymentPolicyByApplication( + application.getUniqueIdentifier()); + if(policy != null) { + AutoscalerUtil.getInstance(). + startApplicationMonitor(application.getUniqueIdentifier()); + } else { + log.info("The relevant application policy is not yet " + + "deployed for this [application] " + + application.getUniqueIdentifier()); + } } else { log.error("Complete Topology is not consistent with the applications " + "which got persisted"); @@ -175,7 +185,7 @@ public class AutoscalerTopologyEventReceiver implements Runnable { //acquire read lock ApplicationHolder.acquireReadLock(); //start the application monitor - startApplicationMonitor(appId); + //startApplicationMonitor(appId); } catch (Exception e) { String msg = "Error processing event " + e.getLocalizedMessage(); log.error(msg, e); @@ -432,81 +442,81 @@ public class AutoscalerTopologyEventReceiver implements Runnable { }); topologyEventReceiver.addEventListener(new ClusterInstanceCreatedEventListener() { - @Override - protected void onEvent(Event event) { - - ClusterInstanceCreatedEvent clusterInstanceCreatedEvent = - (ClusterInstanceCreatedEvent) event; - AbstractClusterMonitor clusterMonitor = AutoscalerContext.getInstance(). - getClusterMonitor(clusterInstanceCreatedEvent.getClusterId()); - String instanceId = ((ClusterInstanceCreatedEvent) event).getInstanceId(); - //FIXME to take lock when clusterMonitor is running - if (clusterMonitor != null) { - TopologyManager.acquireReadLockForCluster(clusterInstanceCreatedEvent.getServiceName(), - clusterInstanceCreatedEvent.getClusterId()); - - try { - Service service = TopologyManager.getTopology(). - getService(clusterInstanceCreatedEvent.getServiceName()); - - if (service != null) { - Cluster cluster = service.getCluster(clusterInstanceCreatedEvent.getClusterId()); - if (cluster != null) { - try { - if (cluster.isKubernetesCluster()) { - clusterMonitor.setClusterContext( - ClusterContextFactory.getKubernetesClusterContext( - instanceId, - cluster)); - } else { - VMClusterContext clusterContext = - (VMClusterContext) clusterMonitor.getClusterContext(); - if (clusterContext == null) { - clusterMonitor.setClusterContext( - ClusterContextFactory. - getVMServiceClusterContext(instanceId, - cluster)); - } else { - clusterContext.addInstanceContext(instanceId, cluster); - } - - } - if (clusterMonitor.hasMonitoringStarted().compareAndSet(false, true)) { - clusterMonitor.startScheduler(); - log.info("Monitoring task for Cluster Monitor with cluster id " + - clusterInstanceCreatedEvent.getClusterId() + " started successfully"); - } - } catch (PolicyValidationException e) { - log.error(e.getMessage(), e); - } catch (PartitionValidationException e) { - log.error(e.getMessage(), e); - } - } - - } else { - log.error("Service " + clusterInstanceCreatedEvent.getServiceName() + - " not found, no cluster instance added to ClusterMonitor " + - clusterInstanceCreatedEvent.getClusterId()); - } - - }finally{ - TopologyManager.releaseReadLockForCluster(clusterInstanceCreatedEvent.getServiceName(), - clusterInstanceCreatedEvent.getClusterId()); - } - - }else{ - log.error("No Cluster Monitor found for cluster id " + - clusterInstanceCreatedEvent.getClusterId()); - } - } - } - - ); - } + @Override + protected void onEvent(Event event) { + + ClusterInstanceCreatedEvent clusterInstanceCreatedEvent = + (ClusterInstanceCreatedEvent) event; + AbstractClusterMonitor clusterMonitor = AutoscalerContext.getInstance(). + getClusterMonitor(clusterInstanceCreatedEvent.getClusterId()); + String instanceId = ((ClusterInstanceCreatedEvent) event).getInstanceId(); + //FIXME to take lock when clusterMonitor is running + if (clusterMonitor != null) { + TopologyManager.acquireReadLockForCluster(clusterInstanceCreatedEvent.getServiceName(), + clusterInstanceCreatedEvent.getClusterId()); + + try { + Service service = TopologyManager.getTopology(). + getService(clusterInstanceCreatedEvent.getServiceName()); + + if (service != null) { + Cluster cluster = service.getCluster(clusterInstanceCreatedEvent.getClusterId()); + if (cluster != null) { + try { + if (cluster.isKubernetesCluster()) { + clusterMonitor.setClusterContext( + ClusterContextFactory.getKubernetesClusterContext( + instanceId, + cluster)); + } else { + VMClusterContext clusterContext = + (VMClusterContext) clusterMonitor.getClusterContext(); + if (clusterContext == null) { + clusterMonitor.setClusterContext( + ClusterContextFactory. + getVMServiceClusterContext(instanceId, + cluster)); + } else { + clusterContext.addInstanceContext(instanceId, cluster); + } + + } + if (clusterMonitor.hasMonitoringStarted().compareAndSet(false, true)) { + clusterMonitor.startScheduler(); + log.info("Monitoring task for Cluster Monitor with cluster id " + + clusterInstanceCreatedEvent.getClusterId() + " started successfully"); + } + } catch (PolicyValidationException e) { + log.error(e.getMessage(), e); + } catch (PartitionValidationException e) { + log.error(e.getMessage(), e); + } + } + + } else { + log.error("Service " + clusterInstanceCreatedEvent.getServiceName() + + " not found, no cluster instance added to ClusterMonitor " + + clusterInstanceCreatedEvent.getClusterId()); + } + + } finally { + TopologyManager.releaseReadLockForCluster(clusterInstanceCreatedEvent.getServiceName(), + clusterInstanceCreatedEvent.getClusterId()); + } + + } else { + log.error("No Cluster Monitor found for cluster id " + + clusterInstanceCreatedEvent.getClusterId()); + } + } + } + + ); + } - /** - * Terminate load balancer topology receiver thread. - */ + /** + * Terminate load balancer topology receiver thread. + */ public void terminate() { topologyEventReceiver.terminate(); @@ -514,5 +524,4 @@ public class AutoscalerTopologyEventReceiver implements Runnable { } - } http://git-wip-us.apache.org/repos/asf/stratos/blob/2c07846c/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/PolicyManager.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/PolicyManager.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/PolicyManager.java index 31a1f74..ca9a4a7 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/PolicyManager.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/PolicyManager.java @@ -286,4 +286,13 @@ public class PolicyManager { return deploymentPolicyListMap.get(id); } + public DeploymentPolicy getDeploymentPolicyByApplication(String appId) { + for(DeploymentPolicy deploymentPolicy : deploymentPolicyListMap.values()) { + if(deploymentPolicy.getApplicationId().equals(appId)) { + return deploymentPolicy; + } + } + return null; + } + } http://git-wip-us.apache.org/repos/asf/stratos/blob/2c07846c/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/ChildPolicy.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/ChildPolicy.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/ChildPolicy.java index 1f4a8b4..9d78dcf 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/ChildPolicy.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/ChildPolicy.java @@ -20,10 +20,12 @@ package org.apache.stratos.autoscaler.pojo.policy.deployment; import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.ChildLevelNetworkPartition; +import java.io.Serializable; + /** * This will keep the Children's policy in an application */ -public class ChildPolicy { +public class ChildPolicy implements Serializable { private String id; private ChildLevelNetworkPartition[] childLevelNetworkPartitions; http://git-wip-us.apache.org/repos/asf/stratos/blob/2c07846c/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/partition/network/ChildLevelPartition.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/partition/network/ChildLevelPartition.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/partition/network/ChildLevelPartition.java index 691cb07..8c3b140 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/partition/network/ChildLevelPartition.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/partition/network/ChildLevelPartition.java @@ -19,17 +19,13 @@ package org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network; -public class ChildLevelPartition { +import java.io.Serializable; + +public class ChildLevelPartition implements Serializable { private String partitionId; private String networkPartitionId; private int max; - public ChildLevelPartition(String partitionId, String networkPartitionId, int max) { - this.partitionId = partitionId; - this.networkPartitionId = networkPartitionId; - this.max = max; - } - public int getMax() { return max; } @@ -41,4 +37,16 @@ public class ChildLevelPartition { public String getPartitionId() { return partitionId; } + + public void setPartitionId(String partitionId) { + this.partitionId = partitionId; + } + + public void setNetworkPartitionId(String networkPartitionId) { + this.networkPartitionId = networkPartitionId; + } + + public void setMax(int max) { + this.max = max; + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/2c07846c/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java index 077a1a4..476e8bb 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java @@ -38,6 +38,10 @@ import org.apache.stratos.common.Properties; import org.apache.stratos.common.Property; import org.apache.stratos.messaging.domain.applications.Application; import org.apache.stratos.messaging.domain.applications.Applications; +import org.apache.stratos.messaging.domain.applications.ClusterDataHolder; +import org.apache.stratos.messaging.domain.topology.Service; +import org.apache.stratos.messaging.domain.topology.Topology; +import org.apache.stratos.messaging.message.receiver.topology.TopologyManager; /** @@ -51,6 +55,13 @@ public class AutoscalerUtil { } + public static AutoscalerUtil getInstance() { + return Holder.INSTANCE; + } + private static class Holder { + private static final AutoscalerUtil INSTANCE = new AutoscalerUtil(); + } + public static Applications getApplications () { Applications applications; @@ -88,6 +99,47 @@ public class AutoscalerUtil { return clusterId.substring(0, clusterId.indexOf(".")); } + public static boolean allClustersInitialized(Application application) { + boolean allClustersInitialized = false; + for (ClusterDataHolder holder : application.getClusterDataRecursively()) { + TopologyManager.acquireReadLockForCluster(holder.getServiceType(), + holder.getClusterId()); + + try { + Topology topology = TopologyManager.getTopology(); + if (topology != null) { + Service service = topology.getService(holder.getServiceType()); + if (service != null) { + if (service.clusterExists(holder.getClusterId())) { + allClustersInitialized = true; + return allClustersInitialized; + } else { + if (log.isDebugEnabled()) { + log.debug("[Cluster] " + holder.getClusterId() + " is not found in " + + "the Topology"); + } + allClustersInitialized = false; + } + } else { + if (log.isDebugEnabled()) { + log.debug("Service is null in the CompleteTopologyEvent"); + } + } + } else { + if (log.isDebugEnabled()) { + log.debug("Topology is null in the CompleteTopologyEvent"); + } + } + } finally { + TopologyManager.releaseReadLockForCluster(holder.getServiceType(), + holder.getClusterId()); + } + } + return allClustersInitialized; + } + + + /*public static LbClusterMonitor getLBClusterMonitor(Cluster cluster) throws PolicyValidationException, PartitionValidationException { // FIXME fix the following code to correctly update // AutoscalerContext context = AutoscalerContext.getInstance(); @@ -297,7 +349,7 @@ public class AutoscalerUtil { return toCommonProperties(properties); } - protected synchronized void startApplicationMonitor(String applicationId) { + public synchronized void startApplicationMonitor(String applicationId) { Thread th = null; if (AutoscalerContext.getInstance().getAppMonitor(applicationId) == null) { th = new Thread(new ApplicationMonitorAdder(applicationId)); http://git-wip-us.apache.org/repos/asf/stratos/blob/2c07846c/components/org.apache.stratos.cloud.controller/pom.xml ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/pom.xml b/components/org.apache.stratos.cloud.controller/pom.xml index 5889c1d..1a9445a 100644 --- a/components/org.apache.stratos.cloud.controller/pom.xml +++ b/components/org.apache.stratos.cloud.controller/pom.xml @@ -49,12 +49,10 @@ <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> <Bundle-Name>${project.artifactId}</Bundle-Name> <Export-Package> - !org.apache.stratos.cloud.controller.services.impl.*, !org.apache.stratos.cloud.controller.internal.*, org.apache.stratos.cloud.controller.*, </Export-Package> <Private-Package> - org.apache.stratos.cloud.controller.services.impl.*, org.apache.stratos.cloud.controller.internal.*, </Private-Package> <Import-Package> http://git-wip-us.apache.org/repos/asf/stratos/blob/2c07846c/components/org.apache.stratos.cloud.controller/src/main/resources/META-INF/services.xml ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/resources/META-INF/services.xml b/components/org.apache.stratos.cloud.controller/src/main/resources/META-INF/services.xml index f0283f5..3f365e7 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/resources/META-INF/services.xml +++ b/components/org.apache.stratos.cloud.controller/src/main/resources/META-INF/services.xml @@ -22,7 +22,7 @@ <serviceGroup> <service name="CloudControllerService" scope="application"> - <parameter name="ServiceClass">org.apache.stratos.cloud.controller.services.CloudControllerServiceImpl</parameter> + <parameter name="ServiceClass">org.apache.stratos.cloud.controller.services.impl.CloudControllerServiceImpl</parameter> <messageReceivers> <messageReceiver mep="http://www.w3.org/ns/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/> <messageReceiver mep="http://www.w3.org/ns/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/> http://git-wip-us.apache.org/repos/asf/stratos/blob/2c07846c/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/clustering/DistributedObjectProvider.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/clustering/DistributedObjectProvider.java b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/clustering/DistributedObjectProvider.java index fe47ca4..428d3da 100644 --- a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/clustering/DistributedObjectProvider.java +++ b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/clustering/DistributedObjectProvider.java @@ -26,6 +26,7 @@ import com.hazelcast.core.IMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -34,7 +35,7 @@ import java.util.concurrent.ConcurrentHashMap; /** * Provides objects to be managed in distributed and non-distributed environments. */ -public class DistributedObjectProvider { +public class DistributedObjectProvider implements Serializable { private static final Log log = LogFactory.getLog(DistributedObjectProvider.class); private final boolean clustered;
