~ubuntu-branches/ubuntu/maverick/tomcat6/maverick-updates

« back to all changes in this revision

Viewing changes to java/org/apache/catalina/tribes/group/interceptors/SimpleCoordinator.java

  • Committer: Bazaar Package Importer
  • Author(s): Torsten Werner
  • Date: 2010-01-23 19:40:38 UTC
  • mfrom: (2.2.6 sid)
  • Revision ID: james.westby@ubuntu.com-20100123194038-0tnrf6kiy0wrjrw9
Tags: 6.0.20-dfsg1-1
* Fix debian/orig-tar.sh to exclude binary only standard.jar and jstl.jar.
  (Closes: #528119)
* Upload a cleaned tarball.
* Add ${misc:Depends} in debian/control.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Licensed to the Apache Software Foundation (ASF) under one or more
3
 
 * contributor license agreements.  See the NOTICE file distributed with
4
 
 * this work for additional information regarding copyright ownership.
5
 
 * The ASF licenses this file to You under the Apache License, Version 2.0
6
 
 * (the "License"); you may not use this file except in compliance with
7
 
 * the License.  You may obtain a copy of the License at
8
 
 * 
9
 
 *      http://www.apache.org/licenses/LICENSE-2.0
10
 
 * 
11
 
 * Unless required by applicable law or agreed to in writing, software
12
 
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 
 * See the License for the specific language governing permissions and
15
 
 */
16
 
package org.apache.catalina.tribes.group.interceptors;
17
 
 
18
 
import static java.util.concurrent.TimeUnit.MILLISECONDS;
19
 
 
20
 
import java.util.Arrays;
21
 
import java.util.concurrent.atomic.AtomicBoolean;
22
 
 
23
 
import org.apache.catalina.tribes.ChannelException;
24
 
import org.apache.catalina.tribes.Member;
25
 
import org.apache.catalina.tribes.group.AbsoluteOrder;
26
 
import org.apache.catalina.tribes.group.ChannelInterceptorBase;
27
 
 
28
 
/**
29
 
 * A dinky coordinator, just uses a sorted version of the member array.
30
 
 * 
31
 
 * @author rnewson
32
 
 * 
33
 
 */
34
 
public class SimpleCoordinator extends ChannelInterceptorBase {
35
 
 
36
 
    private Member[] view;
37
 
 
38
 
    private AtomicBoolean membershipChanged = new AtomicBoolean();
39
 
 
40
 
    private void membershipChanged() {
41
 
        membershipChanged.set(true);
42
 
    }
43
 
 
44
 
    @Override
45
 
    public void memberAdded(final Member member) {
46
 
        super.memberAdded(member);
47
 
        membershipChanged();
48
 
        installViewWhenStable();
49
 
    }
50
 
 
51
 
    @Override
52
 
    public void memberDisappeared(final Member member) {
53
 
        super.memberDisappeared(member);
54
 
        membershipChanged();
55
 
        installViewWhenStable();
56
 
    }
57
 
 
58
 
    /**
59
 
     * Override to receive view changes.
60
 
     * 
61
 
     * @param view
62
 
     */
63
 
    protected void viewChange(final Member[] view) {
64
 
    }
65
 
 
66
 
    @Override
67
 
    public void start(int svc) throws ChannelException {
68
 
        super.start(svc);
69
 
        installViewWhenStable();
70
 
    }
71
 
 
72
 
    private void installViewWhenStable() {
73
 
        int stableCount = 0;
74
 
 
75
 
        while (stableCount < 10) {
76
 
            if (membershipChanged.compareAndSet(true, false)) {
77
 
                stableCount = 0;
78
 
            } else {
79
 
                stableCount++;
80
 
            }
81
 
            try {
82
 
                MILLISECONDS.sleep(250);
83
 
            } catch (final InterruptedException e) {
84
 
                Thread.currentThread().interrupt();
85
 
            }
86
 
        }
87
 
 
88
 
        final Member[] members = getMembers();
89
 
        final Member[] view = new Member[members.length+1];
90
 
        System.arraycopy(members, 0, view, 0, members.length);
91
 
        view[members.length] = getLocalMember(false);
92
 
        Arrays.sort(view, AbsoluteOrder.comp);
93
 
        if (Arrays.equals(view, this.view)) {
94
 
            return;
95
 
        }
96
 
        this.view = view;
97
 
        viewChange(view);
98
 
    }
99
 
 
100
 
    @Override
101
 
    public void stop(int svc) throws ChannelException {
102
 
        super.stop(svc);
103
 
    }
104
 
 
105
 
    public Member[] getView() {
106
 
        return view;
107
 
    }
108
 
 
109
 
    public Member getCoordinator() {
110
 
        return view == null ? null : view[0];
111
 
    }
112
 
 
113
 
    public boolean isCoordinator() {
114
 
        return view == null ? false : getLocalMember(false).equals(
115
 
                getCoordinator());
116
 
    }
117
 
 
118
 
}
 
1
/*
 
2
 * Licensed to the Apache Software Foundation (ASF) under one or more
 
3
 * contributor license agreements.  See the NOTICE file distributed with
 
4
 * this work for additional information regarding copyright ownership.
 
5
 * The ASF licenses this file to You under the Apache License, Version 2.0
 
6
 * (the "License"); you may not use this file except in compliance with
 
7
 * the License.  You may obtain a copy of the License at
 
8
 * 
 
9
 *      http://www.apache.org/licenses/LICENSE-2.0
 
10
 * 
 
11
 * Unless required by applicable law or agreed to in writing, software
 
12
 * distributed under the License is distributed on an "AS IS" BASIS,
 
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
14
 * See the License for the specific language governing permissions and
 
15
 */
 
16
package org.apache.catalina.tribes.group.interceptors;
 
17
 
 
18
import static java.util.concurrent.TimeUnit.MILLISECONDS;
 
19
 
 
20
import java.util.Arrays;
 
21
import java.util.concurrent.atomic.AtomicBoolean;
 
22
 
 
23
import org.apache.catalina.tribes.ChannelException;
 
24
import org.apache.catalina.tribes.Member;
 
25
import org.apache.catalina.tribes.group.AbsoluteOrder;
 
26
import org.apache.catalina.tribes.group.ChannelInterceptorBase;
 
27
 
 
28
/**
 
29
 * A dinky coordinator, just uses a sorted version of the member array.
 
30
 * 
 
31
 * @author rnewson
 
32
 * 
 
33
 */
 
34
public class SimpleCoordinator extends ChannelInterceptorBase {
 
35
 
 
36
    private Member[] view;
 
37
 
 
38
    private AtomicBoolean membershipChanged = new AtomicBoolean();
 
39
 
 
40
    private void membershipChanged() {
 
41
        membershipChanged.set(true);
 
42
    }
 
43
 
 
44
    @Override
 
45
    public void memberAdded(final Member member) {
 
46
        super.memberAdded(member);
 
47
        membershipChanged();
 
48
        installViewWhenStable();
 
49
    }
 
50
 
 
51
    @Override
 
52
    public void memberDisappeared(final Member member) {
 
53
        super.memberDisappeared(member);
 
54
        membershipChanged();
 
55
        installViewWhenStable();
 
56
    }
 
57
 
 
58
    /**
 
59
     * Override to receive view changes.
 
60
     * 
 
61
     * @param view
 
62
     */
 
63
    protected void viewChange(final Member[] view) {
 
64
    }
 
65
 
 
66
    @Override
 
67
    public void start(int svc) throws ChannelException {
 
68
        super.start(svc);
 
69
        installViewWhenStable();
 
70
    }
 
71
 
 
72
    private void installViewWhenStable() {
 
73
        int stableCount = 0;
 
74
 
 
75
        while (stableCount < 10) {
 
76
            if (membershipChanged.compareAndSet(true, false)) {
 
77
                stableCount = 0;
 
78
            } else {
 
79
                stableCount++;
 
80
            }
 
81
            try {
 
82
                MILLISECONDS.sleep(250);
 
83
            } catch (final InterruptedException e) {
 
84
                Thread.currentThread().interrupt();
 
85
            }
 
86
        }
 
87
 
 
88
        final Member[] members = getMembers();
 
89
        final Member[] view = new Member[members.length+1];
 
90
        System.arraycopy(members, 0, view, 0, members.length);
 
91
        view[members.length] = getLocalMember(false);
 
92
        Arrays.sort(view, AbsoluteOrder.comp);
 
93
        if (Arrays.equals(view, this.view)) {
 
94
            return;
 
95
        }
 
96
        this.view = view;
 
97
        viewChange(view);
 
98
    }
 
99
 
 
100
    @Override
 
101
    public void stop(int svc) throws ChannelException {
 
102
        super.stop(svc);
 
103
    }
 
104
 
 
105
    public Member[] getView() {
 
106
        return view;
 
107
    }
 
108
 
 
109
    public Member getCoordinator() {
 
110
        return view == null ? null : view[0];
 
111
    }
 
112
 
 
113
    public boolean isCoordinator() {
 
114
        return view == null ? false : getLocalMember(false).equals(
 
115
                getCoordinator());
 
116
    }
 
117
 
 
118
}