Skip to content
This repository was archived by the owner on Apr 22, 2025. It is now read-only.

Commit 4cf7f82

Browse files
committed
FAB-11177 Multithreaded test.
Change-Id: I6ded1d27df0a5c4e0690dceb128bea2de4b49ed8 Signed-off-by: rickr <cr22rc@gmail.com>
1 parent c5c31b8 commit 4cf7f82

File tree

8 files changed

+1631
-20
lines changed

8 files changed

+1631
-20
lines changed

pom.xml

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,15 @@
2828
<tag>fabric-sdk-java-1.0</tag>
2929
</scm>
3030
<properties>
31-
<grpc.version>1.13.1</grpc.version><!-- CURRENT_GRPC_VERSION -->
31+
<grpc.version>1.13.2</grpc.version><!-- CURRENT_GRPC_VERSION -->
3232
<protobuf.version>3.6.0</protobuf.version>
3333
<bouncycastle.version>1.60</bouncycastle.version>
3434
<httpclient.version>4.5.6</httpclient.version>
3535
<skipITs>true</skipITs>
3636
<alpn-boot-version>8.1.7.v20160121</alpn-boot-version>
3737
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
3838
<jacoco.version>0.7.9</jacoco.version>
39+
<log4j.version>1.2.17</log4j.version>
3940
<org.hyperledger.fabric.sdktest.ITSuite>IntegrationSuite.java</org.hyperledger.fabric.sdktest.ITSuite>
4041
<gpg.executable>gpg2</gpg.executable>
4142
</properties>
@@ -97,7 +98,7 @@
9798
<dependency>
9899
<groupId>io.netty</groupId>
99100
<artifactId>netty-codec-http2</artifactId>
100-
<version>4.1.25.Final</version>
101+
<version>4.1.26.Final</version>
101102
</dependency>
102103
<!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java -->
103104
<dependency>
@@ -142,9 +143,17 @@
142143
<dependency>
143144
<groupId>log4j</groupId>
144145
<artifactId>log4j</artifactId>
145-
<version>1.2.17</version>
146+
<version>${log4j.version}</version>
146147
</dependency>
147148

149+
<!-- https://mvnrepository.com/artifact/log4j/apache-log4j-extras -->
150+
<dependency>
151+
<groupId>log4j</groupId>
152+
<artifactId>apache-log4j-extras</artifactId>
153+
<version>${log4j.version}</version>
154+
</dependency>
155+
156+
148157
<!--<dependency>-->
149158
<!--<groupId>org.apache.logging.log4j</groupId>-->
150159
<!--<artifactId>log4j-core</artifactId>-->

src/main/java/org/hyperledger/fabric/sdk/Channel.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3370,6 +3370,8 @@ private ProposalResponse sendProposalSerially(TransactionRequest proposalRequest
33703370

33713371
for (Peer peer : peers) {
33723372

3373+
proposalRequest.submitted = false;
3374+
33733375
try {
33743376

33753377
Collection<ProposalResponse> proposalResponses = sendProposal(proposalRequest, Collections.singletonList(peer));

src/main/java/org/hyperledger/fabric/sdk/Orderer.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public class Orderer implements Serializable {
4343
private Channel channel;
4444
private transient volatile OrdererClient ordererClient = null;
4545
private transient byte[] clientTLSCertificateDigest;
46+
private String channelName = "";
4647

4748
Orderer(String name, String url, Properties properties) throws InvalidArgumentException {
4849

@@ -104,6 +105,7 @@ public String getUrl() {
104105
void unsetChannel() {
105106

106107
channel = null;
108+
channelName = "";
107109

108110
}
109111

@@ -127,6 +129,7 @@ void setChannel(Channel channel) throws InvalidArgumentException {
127129
}
128130

129131
this.channel = channel;
132+
this.channelName = channel.getName();
130133

131134
}
132135

@@ -192,6 +195,7 @@ synchronized void shutdown(boolean force) {
192195
}
193196
shutdown = true;
194197
channel = null;
198+
channelName = "";
195199

196200
if (ordererClient != null) {
197201
OrdererClient torderClientDeliver = ordererClient;
@@ -219,6 +223,6 @@ protected void finalize() throws Throwable {
219223

220224
@Override
221225
public String toString() {
222-
return "Orderer: " + name + "(" + url + ")";
226+
return "Orderer-" + channelName + "-" + name + "(" + url + ")";
223227
}
224228
} // end Orderer

src/main/java/org/hyperledger/fabric/sdk/OrdererClient.java

Lines changed: 86 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class OrdererClient {
4848
private final ManagedChannelBuilder channelBuilder;
4949
private boolean shutdown = false;
5050
private static final Log logger = LogFactory.getLog(OrdererClient.class);
51+
private static final boolean TRACELEVEL = logger.isTraceEnabled();
5152
private ManagedChannel managedChannel = null;
5253
private final String name;
5354
private final String url;
@@ -76,7 +77,7 @@ class OrdererClient {
7677
try {
7778
tempOrdererWaitTimeMilliSecs = Long.parseLong(ordererWaitTimeMilliSecsString);
7879
} catch (NumberFormatException e) {
79-
logger.warn(format("Orderer %s wait time %s not parsable.", name, ordererWaitTimeMilliSecsString), e);
80+
logger.warn(format("Orderer %s wait time %s not parsable.", this.toString(), ordererWaitTimeMilliSecsString), e);
8081
}
8182

8283
ordererWaitTimeMilliSecs = tempOrdererWaitTimeMilliSecs;
@@ -90,6 +91,7 @@ synchronized void shutdown(boolean force) {
9091
return;
9192
}
9293
shutdown = true;
94+
logger.debug(format("Shutdown %s", this.toString()));
9395
ManagedChannel lchannel = managedChannel;
9496
managedChannel = null;
9597
if (lchannel == null) {
@@ -117,21 +119,38 @@ public void finalize() {
117119
}
118120

119121
Ab.BroadcastResponse sendTransaction(Common.Envelope envelope) throws Exception {
122+
logger.trace(this.toString() + " OrdererClient.sendTransaction entered.");
120123
StreamObserver<Common.Envelope> nso = null;
121124

122125
if (shutdown) {
123126
throw new TransactionException("Orderer client is shutdown");
124127
}
125128

126129
ManagedChannel lmanagedChannel = managedChannel;
130+
if (TRACELEVEL && lmanagedChannel != null) {
131+
logger.trace(format("%s managed channel isTerminated: %b, isShutdown: %b, state: %s", this.toString(),
132+
lmanagedChannel.isTerminated(), lmanagedChannel.isShutdown(), lmanagedChannel.getState(false).name()));
133+
}
127134

128135
if (lmanagedChannel == null || lmanagedChannel.isTerminated() || lmanagedChannel.isShutdown()) {
129136

137+
if (lmanagedChannel != null && lmanagedChannel.isTerminated()) {
138+
logger.warn(format("%s managed channel was marked terminated", this.toString()));
139+
}
140+
if (lmanagedChannel != null && lmanagedChannel.isShutdown()) {
141+
logger.warn(format("%s managed channel was marked shutdown.", this.toString()));
142+
}
143+
130144
lmanagedChannel = channelBuilder.build();
131145
managedChannel = lmanagedChannel;
132146

133147
}
134148

149+
if (TRACELEVEL && lmanagedChannel != null) {
150+
logger.trace(format("%s managed channel isTerminated: %b, isShutdown: %b, state: %s", this.toString(),
151+
lmanagedChannel.isTerminated(), lmanagedChannel.isShutdown(), lmanagedChannel.getState(false).name()));
152+
}
153+
135154
try {
136155
final CountDownLatch finishLatch = new CountDownLatch(1);
137156
AtomicBroadcastGrpc.AtomicBroadcastStub broadcast = AtomicBroadcastGrpc.newStub(lmanagedChannel);
@@ -143,11 +162,11 @@ Ab.BroadcastResponse sendTransaction(Common.Envelope envelope) throws Exception
143162
@Override
144163
public void onNext(Ab.BroadcastResponse resp) {
145164
// logger.info("Got Broadcast response: " + resp);
146-
logger.debug("resp status value: " + resp.getStatusValue() + ", resp: " + resp.getStatus());
165+
logger.debug(this.toString() + " resp status value: " + resp.getStatusValue() + ", resp: " + resp.getStatus());
147166
if (resp.getStatus() == Common.Status.SUCCESS) {
148167
ret[0] = resp;
149168
} else {
150-
throwable[0] = new TransactionException(format("Channel %s orderer %s status returned failure code %d (%s) during order registration",
169+
throwable[0] = new TransactionException(format("Channel %s orderer %s status returned failure code %d (%s) during orderer next",
151170
channelName, name, resp.getStatusValue(), resp.getStatus().name()));
152171
}
153172
finishLatch.countDown();
@@ -157,6 +176,17 @@ public void onNext(Ab.BroadcastResponse resp) {
157176
@Override
158177
public void onError(Throwable t) {
159178
if (!shutdown) {
179+
ManagedChannel lmanagedChannel = managedChannel;
180+
managedChannel = null;
181+
if (lmanagedChannel == null) {
182+
logger.error(this.toString() + " managed channel was null.");
183+
184+
} else {
185+
186+
logger.error(format("%s managed channel isTerminated: %b, isShutdown: %b, state: %s", this.toString(),
187+
lmanagedChannel.isTerminated(), lmanagedChannel.isShutdown(), lmanagedChannel.getState(false).name()));
188+
189+
}
160190
logger.error(format("Received error on channel %s, orderer %s, url %s, %s",
161191
channelName, name, url, t.getMessage()), t);
162192
}
@@ -166,6 +196,7 @@ public void onError(Throwable t) {
166196

167197
@Override
168198
public void onCompleted() {
199+
logger.trace(this.toString() + " onComplete received.");
169200
finishLatch.countDown();
170201
}
171202
};
@@ -177,7 +208,7 @@ public void onCompleted() {
177208
try {
178209
if (!finishLatch.await(ordererWaitTimeMilliSecs, TimeUnit.MILLISECONDS)) {
179210
TransactionException ste = new TransactionException(format("Channel %s, send transactions failed on orderer %s. Reason: timeout after %d ms.",
180-
channelName, name, ordererWaitTimeMilliSecs));
211+
channelName, this.toString(), ordererWaitTimeMilliSecs));
181212
logger.error("sendTransaction error " + ste.getMessage(), ste);
182213
throw ste;
183214
}
@@ -190,14 +221,14 @@ public void onCompleted() {
190221
}
191222
//get full stack trace
192223
TransactionException ste = new TransactionException(format("Channel %s, send transaction failed on orderer %s. Reason: %s",
193-
channelName, name, throwable[0].getMessage()), throwable[0]);
194-
logger.error("sendTransaction error " + ste.getMessage(), ste);
224+
channelName, this.toString(), throwable[0].getMessage()), throwable[0]);
225+
logger.error(this.toString() + "sendTransaction error " + ste.getMessage(), ste);
195226
throw ste;
196227
}
197-
logger.debug("Done waiting for reply! Got:" + ret[0]);
228+
logger.debug(this.toString() + "Done waiting for reply! Got:" + ret[0]);
198229

199230
} catch (InterruptedException e) {
200-
logger.error(e);
231+
logger.error(this.toString(), e);
201232

202233
}
203234

@@ -223,21 +254,41 @@ public void onCompleted() {
223254

224255
DeliverResponse[] sendDeliver(Common.Envelope envelope) throws TransactionException {
225256

257+
logger.trace(this.toString() + " OrdererClient.sendDeliver entered.");
258+
226259
if (shutdown) {
227260
throw new TransactionException("Orderer client is shutdown");
228261
}
229262

230263
StreamObserver<Common.Envelope> nso = null;
231264

232265
ManagedChannel lmanagedChannel = managedChannel;
266+
if (TRACELEVEL && lmanagedChannel != null) {
267+
logger.trace(format("%s managed channel isTerminated: %b, isShutdown: %b, state: %s", this.toString(),
268+
lmanagedChannel.isTerminated(), lmanagedChannel.isShutdown(), lmanagedChannel.getState(false).name()));
269+
}
233270

234271
if (lmanagedChannel == null || lmanagedChannel.isTerminated() || lmanagedChannel.isShutdown()) {
235272

273+
if (lmanagedChannel != null && lmanagedChannel.isTerminated()) {
274+
logger.warn(format("%s managed channel was marked terminated", this.toString()));
275+
}
276+
if (lmanagedChannel != null && lmanagedChannel.isShutdown()) {
277+
logger.warn(format("%s managed channel was marked shutdown.", this.toString()));
278+
}
236279
lmanagedChannel = channelBuilder.build();
237280
managedChannel = lmanagedChannel;
238281

239282
}
240283

284+
if (TRACELEVEL && lmanagedChannel != null) {
285+
logger.trace(format("%s managed channel isTerminated: %b, isShutdown: %b, state: %s", this.toString(),
286+
lmanagedChannel.isTerminated(), lmanagedChannel.isShutdown(), lmanagedChannel.getState(false).name()));
287+
}
288+
/*
289+
return lchannel != null && !lchannel.isShutdown() && !lchannel.isTerminated() && ConnectivityState.READY.equals(lchannel.getState(true));
290+
*/
291+
241292
try {
242293

243294
AtomicBroadcastGrpc.AtomicBroadcastStub broadcast = AtomicBroadcastGrpc.newStub(lmanagedChannel);
@@ -254,9 +305,10 @@ DeliverResponse[] sendDeliver(Common.Envelope envelope) throws TransactionExcept
254305
public void onNext(DeliverResponse resp) {
255306

256307
// logger.info("Got Broadcast response: " + resp);
257-
logger.debug("resp status value: " + resp.getStatusValue() + ", resp: " + resp.getStatus() + ", type case: " + resp.getTypeCase());
308+
logger.debug(this.toString() + "sendDeliver resp status value: " + resp.getStatusValue() + ", resp: " + resp.getStatus() + ", type case: " + resp.getTypeCase());
258309

259310
if (done) {
311+
logger.trace(this.toString() + " sendDeliver done!");
260312
return;
261313
}
262314

@@ -275,6 +327,18 @@ public void onNext(DeliverResponse resp) {
275327
@Override
276328
public void onError(Throwable t) {
277329
if (!shutdown) {
330+
331+
ManagedChannel lmanagedChannel = managedChannel;
332+
managedChannel = null;
333+
if (lmanagedChannel == null) {
334+
logger.error(this.toString() + " managed channel was null.");
335+
336+
} else {
337+
338+
logger.error(format("%s managed channel isTerminated: %b, isShutdown: %b, state: %s", this.toString(),
339+
lmanagedChannel.isTerminated(), lmanagedChannel.isShutdown(), lmanagedChannel.getState(false).name()));
340+
341+
}
278342
logger.error(format("Received error on channel %s, orderer %s, url %s, %s",
279343
channelName, name, url, t.getMessage()), t);
280344
}
@@ -284,7 +348,7 @@ public void onError(Throwable t) {
284348

285349
@Override
286350
public void onCompleted() {
287-
logger.trace("onCompleted");
351+
logger.trace(this.toString() + "onCompleted.");
288352
finishLatch.countDown();
289353
}
290354
};
@@ -296,43 +360,50 @@ public void onCompleted() {
296360
try {
297361
if (!finishLatch.await(ordererWaitTimeMilliSecs, TimeUnit.MILLISECONDS)) {
298362
TransactionException ex = new TransactionException(format(
299-
"Channel %s sendDeliver time exceeded for orderer %s, timed out at %d ms.", channelName, name, ordererWaitTimeMilliSecs));
363+
"Channel %s sendDeliver time exceeded for orderer %s, timed out at %d ms.", channelName, this.toString(), ordererWaitTimeMilliSecs));
300364
logger.error(ex.getMessage(), ex);
301365
throw ex;
302366
}
303-
logger.trace("Done waiting for reply!");
367+
logger.trace(this.toString() + " Done waiting for reply!");
304368

305369
} catch (InterruptedException e) {
306-
logger.error(e);
370+
logger.error(this.toString() + " " + e.getMessage(), e);
307371
}
308372

309373
if (!throwableList.isEmpty()) {
310374
Throwable throwable = throwableList.get(0);
311375
TransactionException e = new TransactionException(format(
312-
"Channel %s sendDeliver failed on orderer %s. Reason: %s", channelName, name, throwable.getMessage()), throwable);
376+
"Channel %s sendDeliver failed on orderer %s. Reason: %s", channelName, this.toString(), throwable.getMessage()), throwable);
313377
logger.error(e.getMessage(), e);
314378
throw e;
315379
}
316380

317381
return retList.toArray(new DeliverResponse[retList.size()]);
318382
} catch (Throwable t) {
319383
managedChannel = null;
384+
logger.error(this.toString() + " received error " + t.getMessage(), t);
320385
throw t;
321386

322387
} finally {
323388
if (null != nso) {
324389

325390
try {
391+
logger.debug(this.toString() + "completed.");
326392
nso.onCompleted();
327393
} catch (Exception e) { //Best effort only report on debug
328394
logger.debug(format("Exception completing sendDeliver with channel %s, name %s, url %s %s",
329-
channelName, name, url, e.getMessage()), e);
395+
channelName, this.toString(), url, e.getMessage()), e);
330396
}
331397

332398
}
333399
}
334400
}
335401

402+
@Override
403+
public String toString() {
404+
return "OrdererClient-" + channelName + "-" + name + "(" + url + ")";
405+
}
406+
336407
boolean isChannelActive() {
337408
ManagedChannel lchannel = managedChannel;
338409
return lchannel != null && !lchannel.isShutdown() && !lchannel.isTerminated() && ConnectivityState.READY.equals(lchannel.getState(true));

0 commit comments

Comments
 (0)