diff options
author | wjongman | 2010-06-05 21:29:57 +0000 |
---|---|---|
committer | wjongman | 2010-06-05 21:29:57 +0000 |
commit | 351b39c4492e49ef261d593b5879737dafec855a (patch) | |
tree | 23dfeca01483d50e6ced6d37e534b518134de5c8 | |
parent | 4457e2efdf70d92289d49be292d63d112b3630db (diff) | |
download | org.eclipse.ecf-351b39c4492e49ef261d593b5879737dafec855a.tar.gz org.eclipse.ecf-351b39c4492e49ef261d593b5879737dafec855a.tar.xz org.eclipse.ecf-351b39c4492e49ef261d593b5879737dafec855a.zip |
bug 315248: [Discovery] [ZooDiscovery] GUID contains characters to confuse Zookeeper nodes buildup
https://bugs.eclipse.org/bugs/show_bug.cgi?id=315248
Signed off by wim.jongman@remainsoftware.com
11 files changed, 118 insertions, 107 deletions
diff --git a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/DiscoveryActivator.java b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/DiscoveryActivator.java index 6fd14f36a..188f87e67 100644 --- a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/DiscoveryActivator.java +++ b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/DiscoveryActivator.java @@ -14,7 +14,6 @@ package org.eclipse.ecf.provider.zookeeper; import java.util.HashSet; import java.util.Properties; import java.util.Set; -import java.util.concurrent.Executors; import org.eclipse.ecf.discovery.IDiscoveryAdvertiser; import org.eclipse.ecf.discovery.IDiscoveryLocator; @@ -23,7 +22,6 @@ import org.eclipse.ecf.provider.zookeeper.core.ZooDiscoveryContainerInstantiator import org.eclipse.ecf.provider.zookeeper.core.internal.BundleStoppingListener; import org.eclipse.ecf.provider.zookeeper.util.Logger; import org.eclipse.ecf.provider.zookeeper.util.PrettyPrinter; -import org.osgi.framework.Bundle; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; @@ -41,51 +39,38 @@ public class DiscoveryActivator implements BundleActivator { public void start(final BundleContext ctxt) { context = ctxt; - Executors.newSingleThreadExecutor().execute(new Runnable() { - public void run() { - while (ctxt.getBundle().getState() != Bundle.ACTIVE) { - try { - Thread.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - Properties props = new Properties(); - props.put(IDiscoveryLocator.CONTAINER_NAME, - ZooDiscoveryContainerInstantiator.NAME); - props.put(IDiscoveryAdvertiser.CONTAINER_NAME, - ZooDiscoveryContainerInstantiator.NAME); - /* - * Make us available as IDiscoveryLocator and - * IDiscoveryAdvertiser services for OSGi trackers - */ - discoveryRegistration = ctxt.registerService(new String[] { - IDiscoveryLocator.class.getName(), - IDiscoveryAdvertiser.class.getName() }, - ZooDiscoveryContainer.getSingleton(), props); - ZooDiscoveryContainer.getSingleton().setDiscoveryProperties( - props); + Properties props = new Properties(); + props.put(IDiscoveryLocator.CONTAINER_NAME, + ZooDiscoveryContainerInstantiator.NAME); + props.put(IDiscoveryAdvertiser.CONTAINER_NAME, + ZooDiscoveryContainerInstantiator.NAME); + /* + * Make us available as IDiscoveryLocator and IDiscoveryAdvertiser + * services for OSGi trackers + */ + discoveryRegistration = ctxt.registerService(new String[] { + IDiscoveryLocator.class.getName(), + IDiscoveryAdvertiser.class.getName() }, ZooDiscoveryContainer + .getSingleton(), props); + ZooDiscoveryContainer.getSingleton().setDiscoveryProperties(props); - // track OSGi log services - DiscoveryActivator.this.logServiceTraker = new ServiceTracker( - ctxt, org.osgi.service.log.LogService.class.getName(), - null) { - public Object addingService(ServiceReference reference) { - Logger.bindLogService((LogService) context - .getService(reference)); - return super.addingService(reference); - } - - public void removedService(ServiceReference reference, - Object service) { - Logger.unbindLogService((LogService) service); - removedService(reference, service); - } - }; - logServiceTraker.open(true); + // track OSGi log services + DiscoveryActivator.this.logServiceTraker = new ServiceTracker(ctxt, + org.osgi.service.log.LogService.class.getName(), null) { + public Object addingService(ServiceReference reference) { + Logger.bindLogService((LogService) context + .getService(reference)); + return super.addingService(reference); + } + public void removedService(ServiceReference reference, + Object service) { + Logger.unbindLogService((LogService) service); + removedService(reference, service); + super.removedService(reference, service); } - }); + }; + logServiceTraker.open(true); } public void stop(BundleContext c) throws Exception { diff --git a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/core/AdvertisedService.java b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/core/AdvertisedService.java index 2341816ae..26fc16cb0 100644 --- a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/core/AdvertisedService.java +++ b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/core/AdvertisedService.java @@ -203,7 +203,7 @@ public class AdvertisedService extends ServiceInfo implements INode, IService { public String getPath() { return getNodeId() + INode._URI_ + Geo.getHost() + INode._ZOODISCOVERYID_ - + Configurator.INSTANCE.getID().toString(); + + Configurator.INSTANCE.getID().getName(); } public String getAbsolutePath() { diff --git a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/core/ZooDiscoveryContainer.java b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/core/ZooDiscoveryContainer.java index e4993df77..44b6360f9 100644 --- a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/core/ZooDiscoveryContainer.java +++ b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/core/ZooDiscoveryContainer.java @@ -61,7 +61,6 @@ public class ZooDiscoveryContainer extends AbstractDiscoveryContainerAdapter { private Properties DiscoveryProperties; protected Advertiser advertiser; protected Localizer localizer; - protected Thread zookeeperThread; private ZooKeeperServer zooKeeperServer; private ID targetId; protected boolean isQuorumPeerReady; @@ -137,11 +136,6 @@ public class ZooDiscoveryContainer extends AbstractDiscoveryContainerAdapter { CACHED_THREAD_POOL.execute(new Runnable() { public void run() { startStandAlone(conf); - try { - ZooDiscoveryContainer.this.zookeeperThread.join(); - } catch (InterruptedException e) { - Logger.log(LogService.LOG_ERROR, e.getMessage(), e); - } watchManager.watch(); ZooDiscoveryContainer.this.localizer.init(); } @@ -166,11 +160,6 @@ public class ZooDiscoveryContainer extends AbstractDiscoveryContainerAdapter { CACHED_THREAD_POOL.execute(new Runnable() { public void run() { startStandAlone(conf); - try { - ZooDiscoveryContainer.this.zookeeperThread.join(); - } catch (InterruptedException e) { - Logger.log(LogService.LOG_ERROR, e.getMessage(), e); - } watchManager.watch(); ZooDiscoveryContainer.this.localizer.init(); } @@ -198,33 +187,25 @@ public class ZooDiscoveryContainer extends AbstractDiscoveryContainerAdapter { "Zookeeper server cannot be started! ", e);//$NON-NLS-1$ } - this.zookeeperThread = new Thread(new Runnable() { - public void run() { - try { - ZooDiscoveryContainer.this.zooKeeperServer = new ZooKeeperServer(); - FileTxnSnapLog fileTxnSnapLog = new FileTxnSnapLog(conf - .getZookeeperDataFile(), conf - .getZookeeperDataFile()); - ZooDiscoveryContainer.this.zooKeeperServer - .setTxnLogFactory(fileTxnSnapLog); - ZooDiscoveryContainer.this.zooKeeperServer.setTickTime(conf - .getTickTime()); - - Factory cnxnFactory = new NIOServerCnxn.Factory( - new InetSocketAddress(conf.getClientPort())); - cnxnFactory - .startup(ZooDiscoveryContainer.this.zooKeeperServer); - } catch (Exception e) { - Logger - .log( - LogService.LOG_ERROR, - "Zookeeper server cannot be started! Possibly another instance is already running on the same port. ", - e); - } - } - }); - this.zookeeperThread.setDaemon(true); - this.zookeeperThread.start(); + try { + ZooDiscoveryContainer.this.zooKeeperServer = new ZooKeeperServer(); + FileTxnSnapLog fileTxnSnapLog = new FileTxnSnapLog(conf + .getZookeeperDataFile(), conf.getZookeeperDataFile()); + ZooDiscoveryContainer.this.zooKeeperServer + .setTxnLogFactory(fileTxnSnapLog); + ZooDiscoveryContainer.this.zooKeeperServer.setTickTime(conf + .getTickTime()); + + Factory cnxnFactory = new NIOServerCnxn.Factory( + new InetSocketAddress(conf.getClientPort())); + cnxnFactory.startup(ZooDiscoveryContainer.this.zooKeeperServer); + } catch (Exception e) { + Logger + .log( + LogService.LOG_ERROR, + "Zookeeper server cannot be started! Possibly another instance is already running on the same port. ", + e); + } } @@ -381,12 +362,18 @@ public class ZooDiscoveryContainer extends AbstractDiscoveryContainerAdapter { } public IServiceInfo[] getServices() { + if (watchManager == null) { + return new IServiceInfo[0]; + } return watchManager.getAllKnownServices().values().toArray( new IServiceInfo[watchManager.getAllKnownServices().size()]); } public IServiceInfo[] getServices(IServiceTypeID type) { Assert.isNotNull(type); + if (watchManager == null) { + return new IServiceInfo[0]; + } List<IServiceInfo> services = new ArrayList<IServiceInfo>(); for (IServiceInfo sinfo : watchManager.getAllKnownServices().values()) { if (sinfo.getServiceID().getServiceTypeID().getInternal() == type diff --git a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/core/internal/Configurator.java b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/core/internal/Configurator.java index 1ae13ea05..9b5b95d4b 100644 --- a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/core/internal/Configurator.java +++ b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/core/internal/Configurator.java @@ -14,6 +14,7 @@ package org.eclipse.ecf.provider.zookeeper.core.internal; import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.UUID; import org.eclipse.core.runtime.Assert; import org.eclipse.ecf.core.identity.ID; @@ -28,7 +29,8 @@ public class Configurator extends DiscoveryContainerConfig { private File zookeeperData; private List<Configuration> runningConfigs = new ArrayList<Configuration>(); public static final Configurator INSTANCE = new Configurator(); - private static final ID ConfigID = IDFactory.getDefault().createGUID(); + private static final ID ConfigID = IDFactory.getDefault().createStringID( + UUID.randomUUID().toString()); private Configurator() { super(ConfigID); diff --git a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/NodeReader.java b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/NodeReader.java index 402ca0417..10d94ddb5 100644 --- a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/NodeReader.java +++ b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/NodeReader.java @@ -39,10 +39,12 @@ public class NodeReader implements Watcher, private String ip; boolean isNodePublished; private boolean isDisposed; + private ReadRoot readRoot; public NodeReader(String path, ReadRoot readRoot) { Assert.isNotNull(path); Assert.isNotNull(readRoot); + this.readRoot = readRoot; this.path = path; this.zookeeper = readRoot.getReadKeeper(); this.ip = readRoot.getIp(); @@ -62,17 +64,9 @@ public class NodeReader implements Watcher, return INode.ROOT_SLASH + getPath(); } - public synchronized void dispose() { - if (null != ReadRoot.discoverdServices.remove(this.discovered - .getServiceID().getServiceTypeID().getName())) { - this.discovered.dispose(); - this.discovered = null; - } - } - public void processResult(int rc, String p, Object ctx, byte[] data, Stat stat) { - if (p == null || !p.equals(getAbsolutePath())) { + if (p == null || !p.equals(getAbsolutePath()) || data == null) { return; } ByteArrayInputStream bis = null; @@ -104,8 +98,10 @@ public class NodeReader implements Watcher, } bis.close(); this.discovered = new DiscoverdService(getPath(), props); - ReadRoot.discoverdServices.put(this.discovered.getServiceID() - .getServiceTypeID().getName(), this.discovered); + readRoot.getDiscoverdServices() + .put( + this.discovered.getServiceID().getServiceTypeID() + .getName(), this.discovered); PrettyPrinter.prompt(PrettyPrinter.REMOTE_AVAILABLE, this.discovered); Localizer.getSingleton().localize( @@ -147,9 +143,19 @@ public class NodeReader implements Watcher, * node is no more available. */ dispose(); - this.isDisposed = true; } } + public synchronized void dispose() { + if (isDisposed || discovered == null) + return; + if (null != readRoot.getDiscoverdServices().remove( + this.discovered.getServiceID().getServiceTypeID().getName())) { + this.discovered.dispose(); + isDisposed = true; + + } + } + }
\ No newline at end of file diff --git a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/NodeWriter.java b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/NodeWriter.java index 50af2d524..8d3427486 100644 --- a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/NodeWriter.java +++ b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/NodeWriter.java @@ -98,6 +98,14 @@ public class NodeWriter { } catch (InterruptedException e) { // ignore } + } else if (!this.writeRoot.isConnected() + && writeRoot.getWatchManager().getConfig().isCentralized()) { + /* + * connection lost to the central ZooDiscovery where our services + * are published to. + */ + PrettyPrinter.prompt(PrettyPrinter.UNPUBLISHED, this.getNode() + .getWrappedService()); } } diff --git a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/ReadRoot.java b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/ReadRoot.java index 49264b54f..8e6449c77 100644 --- a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/ReadRoot.java +++ b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/ReadRoot.java @@ -34,16 +34,18 @@ public class ReadRoot implements Watcher, ChildrenCallback { private boolean isConnected; private Map<String, NodeReader> nodeReaders = Collections .synchronizedMap(new HashMap<String, NodeReader>()); - public static Map<String, DiscoverdService> discoverdServices = Collections - .synchronizedMap(new HashMap<String, DiscoverdService>()); - public static Map<String, List<DiscoverdService>> perTypeDiscoverdServices = Collections - .synchronizedMap(new HashMap<String, List<DiscoverdService>>()); + private Map<String, DiscoverdService> discoverdServices; + private Map<String, List<DiscoverdService>> perTypeDiscoverdServices; ReadRoot(String ip, WatchManager watchManager) { Assert.isNotNull(ip); Assert.isNotNull(watchManager); this.ip = ip; this.watchManager = watchManager; + discoverdServices = Collections + .synchronizedMap(new HashMap<String, DiscoverdService>()); + perTypeDiscoverdServices = Collections + .synchronizedMap(new HashMap<String, List<DiscoverdService>>()); connect(); } @@ -157,4 +159,12 @@ public class ReadRoot implements Watcher, ChildrenCallback { return this.ip; } + public Map<String, DiscoverdService> getDiscoverdServices() { + return discoverdServices; + } + + public Map<String, List<DiscoverdService>> getPerTypeDiscoverdServices() { + return perTypeDiscoverdServices; + } + }
\ No newline at end of file diff --git a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/WatchManager.java b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/WatchManager.java index a8bba7ec8..7c643e5d0 100644 --- a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/WatchManager.java +++ b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/WatchManager.java @@ -215,7 +215,11 @@ public class WatchManager implements BundleStoppingListener { if (zk != null) zk.close(); } - this.zooKeepers.clear(); + if (this.zooKeepers != null) + this.zooKeepers.clear(); + if (this.allKnownServices != null) + this.allKnownServices.clear(); + } catch (Throwable e) { // Ignore. We're already down at this point. } diff --git a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/WriteRoot.java b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/WriteRoot.java index e77947f69..0830e45fc 100644 --- a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/WriteRoot.java +++ b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/node/internal/WriteRoot.java @@ -21,12 +21,14 @@ import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.data.Stat; import org.eclipse.core.runtime.Assert; import org.eclipse.ecf.provider.zookeeper.util.Logger; +import org.eclipse.ecf.provider.zookeeper.util.PrettyPrinter; import org.osgi.service.log.LogService; class WriteRoot implements Watcher { private ZooKeeper writeKeeper; private String ip; private WatchManager watchManager; + private boolean isConnected; WriteRoot(String ip, WatchManager watchManager) { @@ -112,9 +114,12 @@ class WriteRoot implements Watcher { } catch (KeeperException e) { if (e.code().equals(KeeperException.Code.CONNECTIONLOSS)) { this.isConnected = false; - } - Logger.log(LogService.LOG_INFO, - "Trying to connect to " + this.ip, e); //$NON-NLS-1$ + PrettyPrinter.attemptingConnectionTo(this.ip); + } else + Logger + .log( + LogService.LOG_ERROR, + "Error while trying to connect to " + this.ip, e); //$NON-NLS-1$ } } synchronized (this) { @@ -135,4 +140,8 @@ class WriteRoot implements Watcher { return this.isConnected; } + public WatchManager getWatchManager() { + return watchManager; + } + }
\ No newline at end of file diff --git a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/util/Geo.java b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/util/Geo.java index 5a7054e45..c3ab2f55d 100644 --- a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/util/Geo.java +++ b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/util/Geo.java @@ -47,7 +47,7 @@ public class Geo { Assert.isTrue(childPath.length() > INode.ROOT.length()); String[] parts = childPath.split(INode._ZOODISCOVERYID_); String id = parts[1]; - return id.equals(Configurator.INSTANCE.getID().toString()); + return id.equals(Configurator.INSTANCE.getID().getName()); } public static URI getLocation() { diff --git a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/util/PrettyPrinter.java b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/util/PrettyPrinter.java index c8e961622..8285605b1 100644 --- a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/util/PrettyPrinter.java +++ b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/util/PrettyPrinter.java @@ -65,11 +65,11 @@ public class PrettyPrinter { } public static void attemptingConnectionTo(String ip) { - System.err.println(prompt + System.out.println(prompt + "INFO - Attempting connection to server: /" + ip);//$NON-NLS-1$ } public static void connectionLost(String ip) { - System.err.println(prompt + "INFO - Connection Lost: /" + ip);//$NON-NLS-1$ + System.out.println(prompt + "INFO - Connection Lost: /" + ip);//$NON-NLS-1$ } } |