@Override public void start(Collection<? extends Location> locations) { super.start(locations); connectSensors(); Time.sleep(getConfig(DELAY_BEFORE_ADVERTISING_CLUSTER)); // FIXME: add a quorum to tolerate failed nodes before setting on fire. Optional<Entity> anyNode = Iterables.tryFind( getMembers(), new Predicate<Entity>() { @Override public boolean apply(@Nullable Entity entity) { return (entity instanceof RiakNode && hasMemberJoinedCluster(entity) && entity.getAttribute(RiakNode.SERVICE_UP)); } }); if (anyNode.isPresent()) { log.info( "Planning and Committing cluster changes on node: {}, cluster: {}", anyNode.get().getId(), getId()); Entities.invokeEffector(this, anyNode.get(), RiakNode.COMMIT_RIAK_CLUSTER); setAttribute(IS_CLUSTER_INIT, true); } else { log.warn("No Riak Nodes are found on the cluster: {}. Initialization Failed", getId()); setAttribute(SERVICE_STATE, Lifecycle.ON_FIRE); } }
@Override public String executeScript(String commands) { return Entities.invokeEffector( this, this, EXECUTE_SCRIPT, ConfigBag.newInstance() .configure(ExecuteScriptEffectorBody.SCRIPT, commands) .getAllConfig()) .getUnchecked(); }
public Task<?> start(Application app, List<? extends Location> locations) { return Entities.invokeEffector( (EntityLocal) app, app, Startable.START, MutableMap.of("locations", locations)); }
protected synchronized void onServerPoolMemberChanged(Entity member) { if (log.isTraceEnabled()) log.trace( "For {}, considering membership of {} which is in locations {}", new Object[] {this, member, member.getLocations()}); if (belongsInServerPool(member)) { // TODO can we discover the nodes by asking the riak cluster, rather than assuming what we add // will be in there? // TODO and can we do join as part of node starting? Map<Entity, String> nodes = getAttribute(RIAK_CLUSTER_NODES); if (nodes == null) nodes = Maps.newLinkedHashMap(); String riakName = getRiakName(member); if (riakName == null) { log.error("Unable to get riak name for node: {}", member.getId()); } else { // flag a first node to be the first node in the riak cluster. if (!isFirstNodeSet.get()) { nodes.put(member, riakName); setAttribute(RIAK_CLUSTER_NODES, nodes); ((EntityInternal) member) .setAttribute(RiakNode.RIAK_NODE_HAS_JOINED_CLUSTER, Boolean.TRUE); isFirstNodeSet.set(true); log.info( "Adding riak node {}: {}; {} to cluster", new Object[] {this, member, getRiakName(member)}); } else { // TODO: be wary of erreneous nodes but are still flagged 'in cluster' // add the new node to be part of the riak cluster. Optional<Entity> anyNodeInCluster = Iterables.tryFind( nodes.keySet(), new Predicate<Entity>() { @Override public boolean apply(@Nullable Entity node) { return (node instanceof RiakNode && hasMemberJoinedCluster(node)); } }); if (anyNodeInCluster.isPresent()) { if (!nodes.containsKey(member) && !hasMemberJoinedCluster(member)) { String anyNodeName = anyNodeInCluster.get().getAttribute(RiakNode.RIAK_NODE_NAME); Entities.invokeEffectorWithArgs( this, member, RiakNode.JOIN_RIAK_CLUSTER, anyNodeName); if (getAttribute(IS_CLUSTER_INIT)) { Entities.invokeEffector( RiakClusterImpl.this, anyNodeInCluster.get(), RiakNode.COMMIT_RIAK_CLUSTER); } nodes.put(member, riakName); setAttribute(RIAK_CLUSTER_NODES, nodes); log.info( "Adding riak node {}: {}; {} to cluster", new Object[] {this, member, getRiakName(member)}); } } else { log.error("entity {}: is not present", member.getId()); } } } } else { Map<Entity, String> nodes = getAttribute(RIAK_CLUSTER_NODES); if (nodes != null && nodes.containsKey(member)) { final Entity memberToBeRemoved = member; Optional<Entity> anyNodeInCluster = Iterables.tryFind( nodes.keySet(), new Predicate<Entity>() { @Override public boolean apply(@Nullable Entity node) { return (node instanceof RiakNode && hasMemberJoinedCluster(node) && !node.equals(memberToBeRemoved)); } }); if (anyNodeInCluster.isPresent()) { Entities.invokeEffectorWithArgs( this, anyNodeInCluster.get(), RiakNode.LEAVE_RIAK_CLUSTER, getRiakName(memberToBeRemoved)); } nodes.remove(member); setAttribute(RIAK_CLUSTER_NODES, nodes); log.info( "Removing riak node {}: {}; {} from cluster", new Object[] {this, member, getRiakName(member)}); } } if (log.isTraceEnabled()) log.trace("Done {} checkEntity {}", this, member); }