1 |
| |
2 |
| |
3 |
| |
4 |
| |
5 |
| |
6 |
| |
7 |
| package org.jboss.cache.buddyreplication; |
8 |
| |
9 |
| import org.jboss.cache.CacheImpl; |
10 |
| import org.jboss.cache.Fqn; |
11 |
| import org.jboss.cache.misc.TestingUtil; |
12 |
| |
13 |
| |
14 |
| |
15 |
| |
16 |
| |
17 |
| |
18 |
| public class BuddyReplicationFailoverTest extends BuddyReplicationTestsBase |
19 |
| { |
20 |
| protected boolean optimisticLocks = false; |
21 |
| private String key = "key"; |
22 |
| private String value = "value"; |
23 |
| |
24 |
3
| public void testDataGravitationKillOwner() throws Exception
|
25 |
| { |
26 |
3
| testDataGravitation(true);
|
27 |
| } |
28 |
| |
29 |
3
| public void testDataGravitationDontKillOwner() throws Exception
|
30 |
| { |
31 |
3
| testDataGravitation(false);
|
32 |
| } |
33 |
| |
34 |
6
| private void testDataGravitation(boolean killOwner) throws Exception
|
35 |
| { |
36 |
6
| caches = createCaches(3, false, true, optimisticLocks);
|
37 |
| |
38 |
6
| Fqn fqn = Fqn.fromString("/test");
|
39 |
6
| Fqn backupFqn = BuddyManager.getBackupFqn(caches[0].getLocalAddress(), fqn);
|
40 |
| |
41 |
6
| dumpCacheContents(caches);
|
42 |
| |
43 |
6
| caches[0].put(fqn, key, value);
|
44 |
| |
45 |
6
| dumpCacheContents(caches);
|
46 |
| |
47 |
6
| assertEquals("Value should exist", value, caches[0].get(fqn, key));
|
48 |
| |
49 |
6
| dumpCacheContents(caches);
|
50 |
| |
51 |
| |
52 |
6
| assertTrue("Should be false", !caches[1].exists(fqn));
|
53 |
6
| assertTrue("Should be false", !caches[2].exists(fqn));
|
54 |
| |
55 |
6
| assertFalse("Should be false", caches[0].exists(backupFqn));
|
56 |
6
| assertTrue("Value be true", caches[1].exists(backupFqn));
|
57 |
6
| assertFalse("Should be false", caches[2].exists(backupFqn));
|
58 |
| |
59 |
6
| if (killOwner)
|
60 |
| { |
61 |
3
| System.out.println("***** About to kill original data owner (" + caches[0].getLocalAddress() + "). *****");
|
62 |
| |
63 |
| |
64 |
3
| caches[0].stop();
|
65 |
3
| caches[0] = null;
|
66 |
| |
67 |
3
| TestingUtil.blockUntilViewsReceived(5 * 60 * 1000, false, caches[1], caches[2]);
|
68 |
| |
69 |
| |
70 |
| |
71 |
| } |
72 |
| |
73 |
6
| System.out.println("***** Killed original data owner, about to call a get on a different cache instance. *****");
|
74 |
| |
75 |
| |
76 |
6
| assertEquals("Value should have gravitated", value, caches[2].get(fqn, key));
|
77 |
| |
78 |
6
| TestingUtil.sleepThread(500);
|
79 |
| |
80 |
6
| dumpCacheContents(caches);
|
81 |
| |
82 |
| |
83 |
6
| Fqn newBackupFqn = BuddyManager.getBackupFqn(caches[2].getLocalAddress(), fqn);
|
84 |
| |
85 |
| |
86 |
3
| if (!killOwner) assertTrue("Should be false", !caches[0].exists(fqn));
|
87 |
6
| assertTrue("Should be false", !caches[1].exists(fqn));
|
88 |
| |
89 |
| |
90 |
3
| if (!killOwner) assertFalse("Should be null", caches[0].exists(backupFqn));
|
91 |
6
| assertFalse("Should be null", caches[1].exists(backupFqn));
|
92 |
6
| assertFalse("Should be null", caches[2].exists(backupFqn));
|
93 |
| |
94 |
| |
95 |
6
| if (killOwner)
|
96 |
| { |
97 |
3
| assertEquals("Value should exist", value, caches[1].get(newBackupFqn, key));
|
98 |
| } |
99 |
| else |
100 |
| { |
101 |
3
| assertEquals("Value should exist", value, caches[0].get(newBackupFqn, key));
|
102 |
3
| assertFalse("Should be null", caches[1].exists(newBackupFqn));
|
103 |
| } |
104 |
6
| assertFalse("Should be null", caches[2].exists(newBackupFqn));
|
105 |
| } |
106 |
| |
107 |
3
| public void testDataReplicationSuppression() throws Exception
|
108 |
| { |
109 |
3
| caches = createCaches(3, false, false, optimisticLocks);
|
110 |
| |
111 |
3
| Fqn fqn = Fqn.fromString("/test");
|
112 |
3
| Fqn backupFqn = BuddyManager.getBackupFqn(caches[0].getLocalAddress(), fqn);
|
113 |
3
| caches[0].put(fqn, key, value);
|
114 |
| |
115 |
3
| dumpCacheContents(caches);
|
116 |
| |
117 |
3
| assertEquals("value", caches[0].get(fqn, key));
|
118 |
3
| assertFalse(caches[0].exists(backupFqn));
|
119 |
3
| assertEquals("value", caches[1].get(backupFqn, key));
|
120 |
3
| assertFalse(caches[1].exists(fqn));
|
121 |
3
| assertFalse(caches[2].exists(fqn));
|
122 |
3
| assertFalse(caches[2].exists(backupFqn));
|
123 |
| |
124 |
3
| assertNoLocks(caches);
|
125 |
| |
126 |
3
| backupFqn = BuddyManager.getBackupFqn(caches[1].getLocalAddress(), fqn);
|
127 |
| |
128 |
3
| System.out.println("*** Calling get() on cache[1] with force option");
|
129 |
| |
130 |
3
| caches[1].getInvocationContext().getOptionOverrides().setForceDataGravitation(true);
|
131 |
3
| assertEquals("value", caches[1].get(fqn, key));
|
132 |
| |
133 |
3
| dumpCacheContents(caches);
|
134 |
| |
135 |
3
| assertFalse(caches[1].exists(backupFqn));
|
136 |
3
| assertEquals("value", caches[2].get(backupFqn, key));
|
137 |
3
| assertFalse(caches[2].exists(fqn));
|
138 |
3
| assertFalse(caches[0].exists(fqn));
|
139 |
3
| assertFalse(caches[0].exists(backupFqn));
|
140 |
| } |
141 |
| |
142 |
3
| public void testSubtreeRetrieval() throws Exception
|
143 |
| { |
144 |
3
| caches = createCaches(3, false, true, optimisticLocks);
|
145 |
| |
146 |
3
| Fqn fqn = Fqn.fromString("/test");
|
147 |
3
| Fqn fqn2 = Fqn.fromString("/test/subtree");
|
148 |
| |
149 |
3
| Fqn backupFqn = Fqn.fromString("/" + BuddyManager.BUDDY_BACKUP_SUBTREE + "/" + BuddyManager.getGroupNameFromAddress(caches[0].getLocalAddress()) + "/test");
|
150 |
3
| Fqn backupFqn2 = Fqn.fromString("/" + BuddyManager.BUDDY_BACKUP_SUBTREE + "/" + BuddyManager.getGroupNameFromAddress(caches[0].getLocalAddress()) + "/test/subtree");
|
151 |
| |
152 |
| |
153 |
3
| caches[0].put(fqn, key, value);
|
154 |
3
| caches[0].put(fqn2, key, value);
|
155 |
| |
156 |
| |
157 |
3
| assertEquals(value, caches[0].get(fqn, key));
|
158 |
3
| assertEquals(value, caches[0].get(fqn2, key));
|
159 |
3
| assertEquals(value, caches[1].get(backupFqn, key));
|
160 |
3
| assertEquals(value, caches[1].get(backupFqn2, key));
|
161 |
| |
162 |
3
| assertTrue(!caches[0].exists(backupFqn));
|
163 |
3
| assertTrue(!caches[0].exists(backupFqn2));
|
164 |
3
| assertTrue(!caches[1].exists(fqn));
|
165 |
3
| assertTrue(!caches[1].exists(fqn2));
|
166 |
3
| assertTrue(!caches[2].exists(fqn));
|
167 |
3
| assertTrue(!caches[2].exists(fqn2));
|
168 |
3
| assertTrue(!caches[2].exists(backupFqn));
|
169 |
3
| assertTrue(!caches[2].exists(backupFqn2));
|
170 |
| |
171 |
3
| assertNoLocks(caches);
|
172 |
| |
173 |
| |
174 |
3
| caches[2].get(fqn);
|
175 |
| |
176 |
3
| Fqn newBackupFqn = Fqn.fromString("/" + BuddyManager.BUDDY_BACKUP_SUBTREE + "/" + BuddyManager.getGroupNameFromAddress(caches[2].getLocalAddress()) + "/test");
|
177 |
3
| Fqn newBackupFqn2 = Fqn.fromString("/" + BuddyManager.BUDDY_BACKUP_SUBTREE + "/" + BuddyManager.getGroupNameFromAddress(caches[2].getLocalAddress()) + "/test/subtree");
|
178 |
| |
179 |
3
| assertEquals(value, caches[2].get(fqn, key));
|
180 |
3
| assertTrue(caches[2].exists(fqn2));
|
181 |
3
| assertEquals(value, caches[0].get(newBackupFqn, key));
|
182 |
3
| assertTrue(caches[0].exists(newBackupFqn2));
|
183 |
| |
184 |
3
| assertTrue(!caches[2].exists(newBackupFqn));
|
185 |
3
| assertTrue(!caches[2].exists(newBackupFqn2));
|
186 |
3
| assertTrue(!caches[0].exists(fqn));
|
187 |
3
| assertTrue(!caches[0].exists(fqn2));
|
188 |
3
| assertTrue(!caches[1].exists(fqn));
|
189 |
3
| assertTrue(!caches[1].exists(fqn2));
|
190 |
3
| assertTrue(!caches[1].exists(newBackupFqn));
|
191 |
3
| assertTrue(!caches[1].exists(newBackupFqn2));
|
192 |
| |
193 |
3
| for (CacheImpl cache : caches)
|
194 |
| { |
195 |
9
| assertTrue(!cache.exists(backupFqn));
|
196 |
9
| assertTrue(!cache.exists(backupFqn2));
|
197 |
| } |
198 |
| |
199 |
3
| assertNoLocks(caches);
|
200 |
| } |
201 |
| } |