summaryrefslogtreecommitdiff
path: root/qpid/cpp/src/tests/clustered_replication_test
blob: cc331957adbf08f05970c6519d8d335d8c3c6ed0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/bin/sh

#
# 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 limitations
# under the License.
#

# Test reliability of the replication feature in the face of link
# failures:
srcdir=`dirname $0`
PYTHON_DIR=$srcdir/../../../python
export PYTHONPATH=$PYTHON_DIR

trap stop_brokers INT EXIT

fail() {
    echo $1
    exit 1
}
with_ais_group() {
    id -nG | grep '\<ais\>' >/dev/null || { echo "You are not a member of the ais group." 1>&2; exit 1; }
    echo $* | newgrp ais
}

stop_brokers() {
    if [[ $PRIMARY1 ]] ; then
        ../qpidd -q --port $PRIMARY1
        unset PRIMARY1
    fi      
    if [[ $PRIMARY2 ]] ; then
        ../qpidd -q --port $PRIMARY2
        unset PRIMARY2
    fi      
    if [[ $DR1 ]] ; then
        ../qpidd -q --port $DR1
        unset DR1
    fi
    if [[ $DR2 ]] ; then
        ../qpidd -q --port $DR2
        unset DR2
    fi
}

if test -d ${PYTHON_DIR}; then
    id -nG | grep '\<ais\>' >/dev/null || \
        NOGROUP="You are not a member of the ais group."
    ps -u root | grep 'aisexec\|corosync' >/dev/null || \
        NOAISEXEC="The aisexec or corosync daemon is not running as root"

    if test -n "$NOGROUP" -o -n "$NOAISEXEC"; then
        cat <<EOF

    =========== WARNING: NOT RUNNING AIS TESTS ==============

    Not running cluster replication test because:
    $NOGROUP
    $NOAISEXEC

    ==========================================================

EOF
        exit 0;
    fi

    #todo: these cluster names need to be unique to prevent clashes
    PRIMARY_CLUSTER=PRIMARY_$(hostname)_$(pwd)
    DR_CLUSTER=DR_$(hostname)_$(pwd)

    GENERAL_OPTS="--auth no --no-module-dir --no-data-dir --daemon --port 0  --log-enable notice+ --log-to-stderr false"
    PRIMARY_OPTS="--load-module ../.libs/replicating_listener.so --create-replication-queue true --replication-queue REPLICATION_QUEUE --load-module ../.libs/cluster.so --cluster-name $PRIMARY_CLUSTER"
    DR_OPTS="--load-module ../.libs/replication_exchange.so --load-module ../.libs/cluster.so --cluster-name $DR_CLUSTER"

    rm -f repl*.tmp #cleanup any files left from previous run

    #start first node of primary cluster and set up test queue
    echo Starting primary cluster
    PRIMARY1=$(with_ais_group ../qpidd $GENERAL_OPTS $PRIMARY_OPTS --log-to-file repl.primary.1.tmp) || fail "Could not start node"
    $PYTHON_DIR/commands/qpid-config -a "localhost:$PRIMARY1" add queue test-queue --generate-queue-events 2
    $PYTHON_DIR/commands/qpid-config -a "localhost:$PRIMARY1" add queue control-queue --generate-queue-events 1

    #send 10 messages, consume 5 of them
    for i in `seq 1 10`; do echo Message$i; done | ./sender --port $PRIMARY1
    ./receiver --port $PRIMARY1 --messages 5 > /dev/null

    #add new node to primary cluster, testing correct transfer of state:
    echo Adding node to primary cluster
    PRIMARY2=$(with_ais_group ../qpidd $GENERAL_OPTS $PRIMARY_OPTS --log-to-file repl.primary.2.tmp)

    #start DR cluster, set up test queue there and establish replication bridge
    echo Starting DR cluster
    DR1=$(with_ais_group ../qpidd $GENERAL_OPTS $DR_OPTS --log-to-file repl.dr.1.tmp)
    DR2=$(with_ais_group ../qpidd $GENERAL_OPTS $DR_OPTS --log-to-file repl.dr.2.tmp)

    $PYTHON_DIR/commands/qpid-config -a "localhost:$DR1" add queue test-queue
    $PYTHON_DIR/commands/qpid-config -a "localhost:$DR1" add queue control-queue
    $PYTHON_DIR/commands/qpid-config -a "localhost:$DR1" add exchange replication REPLICATION_EXCHANGE
    $PYTHON_DIR/commands/qpid-route queue add localhost:$DR2 localhost:$PRIMARY2 REPLICATION_EXCHANGE REPLICATION_QUEUE

    #send more messages to primary
    for i in `seq 11 20`; do echo Message$i; done | ./sender --port $PRIMARY1 --send-eos 1

    #wait for replication events to all be processed:        
    echo Waiting for replication to complete
    echo Done | ./sender --port $PRIMARY1 --routing-key control-queue --send-eos 1
    ./receiver --queue control-queue --port $DR1 > /dev/null

    #verify contents of test queue on dr cluster:
    echo Verifying...    
    ./receiver --port $DR2 > repl.out.tmp
    for i in `seq 6 20`; do echo Message$i; done | diff repl.out.tmp - || FAIL=1

    if [[ $FAIL ]]; then
        echo Clustered replication test failed: expectations not met!
        exit 1
    else 
        echo Clustered replication test passed
        rm -f repl*.tmp
    fi

fi