Author: markt
Date: Sun Dec 28 16:30:00 2008
New Revision: 729815

URL: http://svn.apache.org/viewvc?rev=729815&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=46223
Add a simple co-ordinator provided by Robert Newson

Added:
    
tomcat/trunk/java/org/apache/catalina/tribes/group/interceptors/SimpleCoordinator.java
Modified:
    tomcat/trunk/webapps/docs/config/cluster-interceptor.xml

Added: 
tomcat/trunk/java/org/apache/catalina/tribes/group/interceptors/SimpleCoordinator.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/group/interceptors/SimpleCoordinator.java?rev=729815&view=auto
==============================================================================
--- 
tomcat/trunk/java/org/apache/catalina/tribes/group/interceptors/SimpleCoordinator.java
 (added)
+++ 
tomcat/trunk/java/org/apache/catalina/tribes/group/interceptors/SimpleCoordinator.java
 Sun Dec 28 16:30:00 2008
@@ -0,0 +1,117 @@
+/*
+ * 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
+ */
+package org.apache.catalina.tribes.group.interceptors;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+
+import java.util.Arrays;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.apache.catalina.tribes.ChannelException;
+import org.apache.catalina.tribes.Member;
+import org.apache.catalina.tribes.group.AbsoluteOrder;
+import org.apache.catalina.tribes.group.ChannelInterceptorBase;
+
+/**
+ * A dinky coordinator, just uses a sorted version of the member array.
+ * 
+ * @author rnewson
+ * 
+ */
+public class SimpleCoordinator extends ChannelInterceptorBase {
+
+    private Member[] view;
+
+    private AtomicBoolean membershipChanged = new AtomicBoolean();
+
+    private void membershipChanged() {
+        membershipChanged.set(true);
+    }
+
+    @Override
+    public void memberAdded(final Member member) {
+        super.memberAdded(member);
+        membershipChanged();
+        installViewWhenStable();
+    }
+
+    @Override
+    public void memberDisappeared(final Member member) {
+        super.memberDisappeared(member);
+        membershipChanged();
+        installViewWhenStable();
+    }
+
+    /**
+     * Override to receive view changes.
+     * 
+     * @param view
+     */
+    protected void viewChange(final Member[] view) {
+    }
+
+    @Override
+    public void start(int svc) throws ChannelException {
+        super.start(svc);
+        installViewWhenStable();
+    }
+
+    private void installViewWhenStable() {
+        int stableCount = 0;
+
+        while (stableCount < 10) {
+            if (membershipChanged.compareAndSet(true, false)) {
+                stableCount = 0;
+            } else {
+                stableCount++;
+            }
+            try {
+                MILLISECONDS.sleep(250);
+            } catch (final InterruptedException e) {
+                Thread.currentThread().interrupt();
+            }
+        }
+
+        final Member[] members = getMembers();
+        final Member[] view = Arrays.copyOf(members, members.length + 1);
+        view[members.length] = getLocalMember(false);
+        Arrays.sort(view, AbsoluteOrder.comp);
+        if (Arrays.equals(view, this.view)) {
+            return;
+        }
+        this.view = view;
+        viewChange(view);
+    }
+
+    @Override
+    public void stop(int svc) throws ChannelException {
+        super.stop(svc);
+    }
+
+    public Member[] getView() {
+        return view;
+    }
+
+    public Member getCoordinator() {
+        return view == null ? null : view[0];
+    }
+
+    public boolean isCoordinator() {
+        return view == null ? false : getLocalMember(false).equals(
+                getCoordinator());
+    }
+
+}

Modified: tomcat/trunk/webapps/docs/config/cluster-interceptor.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/cluster-interceptor.xml?rev=729815&r1=729814&r2=729815&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/cluster-interceptor.xml (original)
+++ tomcat/trunk/webapps/docs/config/cluster-interceptor.xml Sun Dec 28 
16:30:00 2008
@@ -46,6 +46,7 @@
     
<li><code>org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor</code></li>
     
<li><code>org.apache.catalina.tribes.group.interceptors.NonBlockingCoordinator</code></li>
     
<li><code>org.apache.catalina.tribes.group.interceptors.OrderInterceptor</code></li>
+    
<li><code>org.apache.catalina.tribes.group.interceptors.SimpleCoordinator</code></li>
     
<li><code>org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor</code></li>
     
<li><code>org.apache.catalina.tribes.group.interceptors.TwoPhaseCommitInterceptor</code></li>
     
<li><code>org.apache.catalina.tribes.group.interceptors.DomainFilterInterceptor</code></li>



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to