From 6fd16157825a600119b26d9b4b5f6166cc97c093 Mon Sep 17 00:00:00 2001 From: agura Date: Tue, 7 Apr 2015 02:03:50 +0300 Subject: [PATCH 1/3] ignite-688 Age related cluster group doesn't refresh dynamically --- .../internal/cluster/ClusterGroupAdapter.java | 29 ++++------------------ 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/ClusterGroupAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/ClusterGroupAdapter.java index 0daffcc..40462c3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cluster/ClusterGroupAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cluster/ClusterGroupAdapter.java @@ -114,28 +114,6 @@ public class ClusterGroupAdapter implements ClusterGroupEx, Externalizable { } /** - * @param subjId Subject ID. - * @param ctx Grid kernal context. - * @param p Predicate. - * @param ids Node IDs. - */ - private ClusterGroupAdapter(@Nullable GridKernalContext ctx, - @Nullable UUID subjId, - @Nullable IgnitePredicate p, - Set ids) - { - if (ctx != null) - setKernalContext(ctx); - - this.subjId = subjId; - this.p = p; - this.ids = ids; - - if (p == null && ids != null) - this.p = F.nodeForNodeIds(ids); - } - - /** * ctx.gateway().readLock() */ protected void guard() { @@ -806,7 +784,7 @@ public class ClusterGroupAdapter implements ClusterGroupEx, Externalizable { * @param isOldest Oldest flag. */ private AgeClusterGroup(ClusterGroupAdapter parent, boolean isOldest) { - super(parent.ctx, parent.subjId, (IgnitePredicate) null); + super(parent.ctx, parent.subjId, (IgnitePredicate)null); this.isOldest = isOldest; @@ -822,7 +800,10 @@ public class ClusterGroupAdapter implements ClusterGroupEx, Externalizable { try { lastTopVer = ctx.discovery().topologyVersion(); - this.node = isOldest ? U.oldest(super.nodes(), null) : U.youngest(super.nodes(), null); + Collection nodes = ctx.discovery().allNodes(); + + this.node = isOldest ? U.oldest(nodes, null) : U.youngest(nodes, null); + this.p = F.nodeForNodes(node); } finally { -- 1.9.5.msysgit.0 From 97ad565f1605013433e556be37c5b8f4d659b144 Mon Sep 17 00:00:00 2001 From: Andrey Gura Date: Tue, 7 Apr 2015 14:54:09 +0300 Subject: [PATCH 2/3] ignite-688 Age related cluster group doesn't refresh dynamically --- .../internal/cluster/ClusterGroupAdapter.java | 86 ++++++++++++++++++++-- 1 file changed, 80 insertions(+), 6 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/ClusterGroupAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/ClusterGroupAdapter.java index 40462c3..b93a920 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cluster/ClusterGroupAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cluster/ClusterGroupAdapter.java @@ -60,10 +60,10 @@ public class ClusterGroupAdapter implements ClusterGroupEx, Externalizable { private String gridName; /** Subject ID. */ - private UUID subjId; + protected UUID subjId; /** Cluster group predicate. */ - protected IgnitePredicate p; + protected volatile IgnitePredicate p; /** Node IDs. */ private Set ids; @@ -114,6 +114,28 @@ public class ClusterGroupAdapter implements ClusterGroupEx, Externalizable { } /** + * @param subjId Subject ID. + * @param ctx Grid kernal context. + * @param p Predicate. + * @param ids Node IDs. + */ + private ClusterGroupAdapter(@Nullable GridKernalContext ctx, + @Nullable UUID subjId, + @Nullable IgnitePredicate p, + Set ids) + { + if (ctx != null) + setKernalContext(ctx); + + this.subjId = subjId; + this.p = p; + this.ids = ids; + + if (p == null && ids != null) + this.p = F.nodeForNodeIds(ids); + } + + /** * ctx.gateway().readLock() */ protected void guard() { @@ -303,7 +325,7 @@ public class ClusterGroupAdapter implements ClusterGroupEx, Externalizable { } /** {@inheritDoc} */ - @Override public final ClusterGroup forPredicate(IgnitePredicate p) { + @Override public ClusterGroup forPredicate(IgnitePredicate p) { A.notNull(p, "p"); guard(); @@ -769,6 +791,9 @@ public class ClusterGroupAdapter implements ClusterGroupEx, Externalizable { /** Selected node. */ private volatile ClusterNode node; + /** Node predicate. */ + private IgnitePredicate parentP; + /** Last topology version. */ private volatile long lastTopVer; @@ -784,8 +809,9 @@ public class ClusterGroupAdapter implements ClusterGroupEx, Externalizable { * @param isOldest Oldest flag. */ private AgeClusterGroup(ClusterGroupAdapter parent, boolean isOldest) { - super(parent.ctx, parent.subjId, (IgnitePredicate)null); + super(parent.ctx, parent.subjId, parent.p, parent.ids); + this.parentP = parent.p; this.isOldest = isOldest; reset(); @@ -800,9 +826,9 @@ public class ClusterGroupAdapter implements ClusterGroupEx, Externalizable { try { lastTopVer = ctx.discovery().topologyVersion(); - Collection nodes = ctx.discovery().allNodes(); + this.p = parentP; - this.node = isOldest ? U.oldest(nodes, null) : U.youngest(nodes, null); + this.node = isOldest ? U.oldest(super.nodes(), null) : U.youngest(super.nodes(), null); this.p = F.nodeForNodes(node); } @@ -828,5 +854,53 @@ public class ClusterGroupAdapter implements ClusterGroupEx, Externalizable { return node == null ? Collections.emptyList() : Collections.singletonList(node); } + + /** {@inheritDoc} */ + @Override public ClusterGroup forPredicate(IgnitePredicate p) { + A.notNull(p, "p"); + + guard(); + + try { + if (p != null) + ctx.resource().injectGeneric(p); + + return new ClusterGroupAdapter(ctx, this.subjId, new GroupPredicate(this, p)); + } + catch (IgniteCheckedException e) { + throw U.convertException(e); + } + finally { + unguard(); + } + } + } + + /** + * Dynamic cluster group based predicate. + */ + private static class GroupPredicate implements IgnitePredicate { + /** */ + private static final long serialVersionUID = 0L; + + /** Target cluster group. */ + private final ClusterGroup grp; + + /** Predicate. */ + private final IgnitePredicate p; + + /** + * @param grp Cluster group. + * @param p Predicate. + */ + public GroupPredicate(ClusterGroup grp, IgnitePredicate p) { + this.grp = grp; + this.p = p; + } + + /** {@inheritDoc} */ + @Override public boolean apply(ClusterNode node) { + return grp.predicate().apply(node) && p.apply(node); + } } } -- 1.9.5.msysgit.0 From e4794d40683f925b84b3a4d74cac30cd7931e698 Mon Sep 17 00:00:00 2001 From: Andrey Gura Date: Tue, 7 Apr 2015 22:01:34 +0300 Subject: [PATCH 3/3] ignite-688 Age related cluster group doesn't refresh dynamically --- .../internal/cluster/ClusterGroupAdapter.java | 73 ++++++++++++++++++++-- 1 file changed, 67 insertions(+), 6 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/ClusterGroupAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/ClusterGroupAdapter.java index b93a920..f431e76 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cluster/ClusterGroupAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cluster/ClusterGroupAdapter.java @@ -120,9 +120,9 @@ public class ClusterGroupAdapter implements ClusterGroupEx, Externalizable { * @param ids Node IDs. */ private ClusterGroupAdapter(@Nullable GridKernalContext ctx, - @Nullable UUID subjId, - @Nullable IgnitePredicate p, - Set ids) + @Nullable UUID subjId, + @Nullable IgnitePredicate p, + Set ids) { if (ctx != null) setKernalContext(ctx); @@ -320,7 +320,7 @@ public class ClusterGroupAdapter implements ClusterGroupEx, Externalizable { } /** {@inheritDoc} */ - @Override public final IgnitePredicate predicate() { + @Override public IgnitePredicate predicate() { return p != null ? p : F.alwaysTrue(); } @@ -809,9 +809,25 @@ public class ClusterGroupAdapter implements ClusterGroupEx, Externalizable { * @param isOldest Oldest flag. */ private AgeClusterGroup(ClusterGroupAdapter parent, boolean isOldest) { - super(parent.ctx, parent.subjId, parent.p, parent.ids); + this(parent.ctx, parent.subjId, parent.p, parent.ids, isOldest); + } - this.parentP = parent.p; + /** + * @param ctx Context. + * @param subjId Subj ID. + * @param p Parent predicate. + * @param ids Ids. + * @param isOldest Is oldest. + */ + private AgeClusterGroup(GridKernalContext ctx, + UUID subjId, + IgnitePredicate p, + Set ids, + boolean isOldest) + { + super(ctx, subjId, p, ids); + + this.parentP = p; this.isOldest = isOldest; reset(); @@ -856,6 +872,14 @@ public class ClusterGroupAdapter implements ClusterGroupEx, Externalizable { } /** {@inheritDoc} */ + @Override public IgnitePredicate predicate() { + if (ctx.discovery().topologyVersion() != lastTopVer) + reset(); + + return super.predicate(); + } + + /** {@inheritDoc} */ @Override public ClusterGroup forPredicate(IgnitePredicate p) { A.notNull(p, "p"); @@ -874,6 +898,34 @@ public class ClusterGroupAdapter implements ClusterGroupEx, Externalizable { unguard(); } } + + /** {@inheritDoc} */ + @Override public void writeExternal(ObjectOutput out) throws IOException { + super.writeExternal(out); + + out.writeBoolean(isOldest); + out.writeObject(parentP); + } + + /** {@inheritDoc} */ + @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { + super.readExternal(in); + + isOldest = in.readBoolean(); + parentP = (IgnitePredicate)in.readObject(); + } + + /** + * Reconstructs object on unmarshalling. + * + * @return Reconstructed object. + * @throws ObjectStreamException Thrown in case of unmarshalling error. + */ + protected Object readResolve() throws ObjectStreamException { + ClusterGroupAdapter parent = (ClusterGroupAdapter)super.readResolve(); + + return new AgeClusterGroup(parent.ctx, parent.subjId, parentP, parent.ids, isOldest); + } } /** @@ -900,7 +952,16 @@ public class ClusterGroupAdapter implements ClusterGroupEx, Externalizable { /** {@inheritDoc} */ @Override public boolean apply(ClusterNode node) { + A.notNull(node, "node is null"); + return grp.predicate().apply(node) && p.apply(node); } + + /** {@inheritDoc} */ + @Override public String toString() { + return getClass().getName() + + " [grp='" + grp.getClass().getName() + + "', p='" + p.getClass().getName() + "']"; + } } } -- 1.9.5.msysgit.0