15
15
import java .util .concurrent .CountDownLatch ;
16
16
import java .util .stream .Stream ;
17
17
18
+ import static java .util .concurrent .TimeUnit .NANOSECONDS ;
19
+
18
20
/**
19
21
* Tests multicast and unicast ordering of <em>regular</em> messages.<br/>
20
22
* Regular messages from different senders can be delivered in parallel; messages from the same sender must be
25
27
*/
26
28
@ Test (groups =Global .TIME_SENSITIVE ,singleThreaded =true )
27
29
public class OrderingTest {
28
- protected static final int NUM_MSGS =100000 ;
30
+ protected static final int NUM_MSGS =50_000 ;
29
31
protected static final int PRINT =NUM_MSGS / 5 ;
30
32
protected static final int NUM_SENDERS =2 ;
33
+ protected JChannel [] channels =new JChannel [NUM_SENDERS ];
31
34
32
- protected JChannel [] channels =new JChannel [NUM_SENDERS ];
33
-
34
-
35
- @ BeforeMethod void init () throws Exception {
35
+ @ BeforeMethod protected void init () throws Exception {
36
36
for (int i =0 ; i < channels .length ; i ++) {
37
37
channels [i ]=createChannel (i ).connect ("OrderingTest.testFIFOOrder" );
38
38
channels [i ].setReceiver (new MyReceiver (channels [i ].name ()));
@@ -44,66 +44,67 @@ public class OrderingTest {
44
44
}
45
45
}
46
46
47
- @ AfterMethod void destroy () {
48
-
47
+ @ AfterMethod protected void destroy () {
49
48
Stream .of (channels ).forEach (ch -> {
50
49
SHUFFLE shuffle =ch .getProtocolStack ().findProtocol (SHUFFLE .class );
51
50
shuffle .setDown (false ).setUp (false );
52
51
});
53
52
Util .close (channels );
54
53
}
55
54
56
-
57
55
protected static JChannel createChannel (int index ) throws Exception {
58
56
return new JChannel (new SHARED_LOOPBACK (),
59
57
new SHARED_LOOPBACK_PING (),
60
- new SHUFFLE ().setUp (false ).setDown (false ).setMaxSize (200 ), // reorders messages
61
- new NAKACK2 ().useMcastXmit ( false ). setDiscardDeliveredMsgs (true ).setXmitInterval (200 ),
58
+ new SHUFFLE ().setUp (false ).setDown (false ).setMaxSize (100 ), // reorders messages
59
+ new NAKACK2 ().setDiscardDeliveredMsgs (true ).setXmitInterval (200 ),
62
60
new UNICAST3 (),
63
61
new STABLE ().setMaxBytes (50_000 ).setDesiredAverageGossip (1000 ),
64
62
new GMS ().setJoinTimeout (500 ).printLocalAddress (false ),
65
- new UFC ().setMaxCredits (2_000_000 ),
66
- new MFC ().setMaxCredits (2_000_000 ),
67
- new FRAG2 ())
68
- .name (String .valueOf ((char )('A' +index )));
63
+ new UFC ().setMaxCredits (200_000 ). setMinCredits ( 50_000 ),
64
+ new MFC ().setMaxCredits (200_000 ). setMinCredits ( 50_000 ),
65
+ new FRAG2 (). setFragSize ( 40_000 ) )
66
+ .name (String .valueOf ((char )('A' + index )));
69
67
}
70
68
71
69
72
70
// @Test(invocationCount=100)
73
71
public void testMulticastFIFOOrdering () throws Exception {
74
72
System .out .println ("\n -- sending " + NUM_MSGS + " messages" );
75
73
final CountDownLatch latch =new CountDownLatch (1 );
76
- MySender [] senders =new MySender [NUM_SENDERS ];
74
+ Thread [] senders =new Thread [NUM_SENDERS ];
77
75
for (int i =0 ; i < senders .length ; i ++) {
78
- senders [i ]=new MySender (channels [i ], null , latch );
76
+ senders [i ]=new Thread ( new MySender (channels [i ], null , latch ), "sender-" + i );
79
77
senders [i ].start ();
80
78
}
81
79
latch .countDown ();
82
- for (MySender sender : senders )
80
+ long start =System .nanoTime ();
81
+ for (Thread sender : senders )
83
82
sender .join ();
84
-
85
83
System .out .println ("-- senders done" );
86
-
87
84
checkOrder (NUM_MSGS * NUM_SENDERS );
85
+ long time =System .nanoTime ()-start ;
86
+ System .out .printf ("-- took %s to send and receive %,d msgs\n " , Util .printTime (time , NANOSECONDS ), NUM_MSGS *NUM_SENDERS );
88
87
}
89
88
90
89
public void testUnicastFIFOOrdering () throws Exception {
91
90
System .out .printf ("\n -- sending %d unicast messages\n " , NUM_MSGS );
92
91
final CountDownLatch latch =new CountDownLatch (1 );
93
- MySender [] senders =new MySender [NUM_SENDERS ];
92
+ Thread [] senders =new Thread [NUM_SENDERS ];
94
93
for (int i =0 ; i < senders .length ; i ++) {
95
94
Address dest =channels [(i +1 ) % channels .length ].getAddress ();
96
- senders [i ]=new MySender (channels [i ], dest , latch );
95
+ senders [i ]=new Thread ( new MySender (channels [i ], dest , latch ), "sender=" + i );
97
96
System .out .printf ("-- %s sends to %s\n " , channels [i ].getAddress (), dest );
98
97
senders [i ].start ();
99
98
}
100
99
latch .countDown ();
101
- for (MySender sender : senders )
100
+ long start =System .nanoTime ();
101
+ for (Thread sender : senders )
102
102
sender .join ();
103
103
104
104
System .out .println ("-- senders done" );
105
-
106
105
checkOrder (NUM_MSGS );
106
+ long time =System .nanoTime ()-start ;
107
+ System .out .printf ("-- took %s to send, reshuffle and receive %,d msgs\n " , Util .printTime (time , NANOSECONDS ), NUM_MSGS );
107
108
}
108
109
109
110
protected void checkOrder (int expected_msgs ) {
@@ -114,16 +115,16 @@ protected void checkOrder(int expected_msgs) {
114
115
}
115
116
116
117
System .out .println ("\n -- waiting for message reception by all receivers:" );
117
- Util .waitUntilTrue (10000 , 500 ,
118
+ Util .waitUntilTrue (500000 , 500 ,
118
119
() -> Stream .of (channels ).map (JChannel ::getReceiver )
119
120
.allMatch (r -> ((MyReceiver )r ).getReceived () == expected_msgs ));
120
121
121
122
Stream .of (channels ).forEach (ch -> System .out .printf ("%s: %d\n " , ch .getAddress (),
122
123
((MyReceiver )ch .getReceiver ()).getReceived ()));
123
124
for (JChannel ch : channels ) {
124
- MyReceiver receiver =(MyReceiver )ch .getReceiver ();
125
- assert receiver .getReceived () == expected_msgs :
126
- String .format ("%s had %d messages (expected=%d)" , receiver .name , receiver .getReceived (), expected_msgs );
125
+ MyReceiver r =(MyReceiver )ch .getReceiver ();
126
+ assert r .getReceived () == expected_msgs :
127
+ String .format ("%s received %d messages (expected=%d)" , r .name , r .getReceived (), expected_msgs );
127
128
}
128
129
129
130
System .out .println ("\n -- checking message order" );
@@ -138,7 +139,7 @@ protected void checkOrder(int expected_msgs) {
138
139
139
140
140
141
141
- protected static class MySender extends Thread {
142
+ protected static class MySender implements Runnable {
142
143
protected final JChannel ch ;
143
144
protected final Address dest ;
144
145
protected final CountDownLatch latch ;
@@ -158,7 +159,7 @@ public void run() {
158
159
}
159
160
for (int i =1 ; i <= NUM_MSGS ; i ++) {
160
161
try {
161
- Message msg =new BytesMessage (dest , i );
162
+ Message msg =new ObjectMessage (dest , i );
162
163
ch .send (msg );
163
164
if (i % PRINT == 0 )
164
165
System .out .println (ch .getAddress () + ": " + i + " sent" );
@@ -202,7 +203,9 @@ public synchronized void receive(Message msg) {
202
203
if (++received % PRINT == 0 )
203
204
System .out .printf ("%s: received %d\n " , name , received );
204
205
}
206
+
205
207
}
206
208
207
209
210
+
208
211
}
0 commit comments