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

Commit 1eb8e0a

Browse files
committed
FABJ-383 Garbage collection orderer peer connection.
PS 06 Minor logging updates. 07 Logging changes. Change-Id: I1e6ed709b43b987ad573da15af63a36b492c8850 Signed-off-by: rickr <cr22rc@gmail.com>
1 parent 8044bac commit 1eb8e0a

25 files changed

+614
-327
lines changed

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

Lines changed: 90 additions & 39 deletions
Large diffs are not rendered by default.

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

Lines changed: 56 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import java.util.concurrent.TimeUnit;
1818

1919
import com.google.common.util.concurrent.ListenableFuture;
20-
import io.grpc.ConnectivityState;
2120
import io.grpc.ManagedChannel;
2221
import io.grpc.ManagedChannelBuilder;
2322
import org.apache.commons.logging.Log;
@@ -28,30 +27,50 @@
2827
import org.hyperledger.fabric.protos.peer.FabricProposal;
2928
import org.hyperledger.fabric.protos.peer.FabricProposalResponse;
3029
import org.hyperledger.fabric.sdk.exception.PeerException;
30+
import org.hyperledger.fabric.sdk.helper.Config;
31+
32+
import static java.lang.String.format;
3133

3234
/**
3335
* Sample client code that makes gRPC calls to the server.
3436
*/
3537
class EndorserClient {
38+
private static final Config config = Config.getConfig();
3639
private static final Log logger = LogFactory.getLog(EndorserClient.class);
40+
private static final boolean IS_TRACE_LEVEL = logger.isTraceEnabled();
3741

42+
// private final String channelName;
43+
// private final String name;
44+
// private final String url;
3845
private ManagedChannel managedChannel;
3946
private EndorserGrpc.EndorserFutureStub futureStub;
40-
DiscoveryGrpc.DiscoveryFutureStub discoveryFutureStub;
47+
private DiscoveryGrpc.DiscoveryFutureStub discoveryFutureStub;
4148
private boolean shutdown = false;
49+
private final String toString;
4250

4351
/**
4452
* Construct client for accessing Peer server using the existing channel.
4553
*
4654
* @param channelBuilder The ChannelBuilder to build the endorser client
4755
*/
48-
EndorserClient(ManagedChannelBuilder<?> channelBuilder) {
56+
EndorserClient(String channelName, String name, String url, ManagedChannelBuilder<?> channelBuilder) {
4957
managedChannel = channelBuilder.build();
5058
futureStub = EndorserGrpc.newFutureStub(managedChannel);
5159
discoveryFutureStub = DiscoveryGrpc.newFutureStub(managedChannel);
60+
toString = "EndorserClient{" + "id: " + config.getNextID() + ", channel: " + channelName + ", name:" + name + ", url: " + url + "}";
61+
logger.trace("Created " + toString());
62+
63+
}
64+
65+
@Override
66+
public String toString() {
67+
return toString;
5268
}
5369

5470
synchronized void shutdown(boolean force) {
71+
if (IS_TRACE_LEVEL) {
72+
logger.trace(format("%s shutdown called force: %b, shutdown: %b, managedChannel: %s", toString(), force, shutdown, "" + managedChannel));
73+
}
5574
if (shutdown) {
5675
return;
5776
}
@@ -60,49 +79,76 @@ synchronized void shutdown(boolean force) {
6079
// let all referenced resource finalize
6180
managedChannel = null;
6281
discoveryFutureStub = null;
63-
6482
futureStub = null;
6583

6684
if (lchannel == null) {
6785
return;
6886
}
6987
if (force) {
70-
lchannel.shutdownNow();
88+
89+
try {
90+
lchannel.shutdownNow();
91+
} catch (Exception e) {
92+
logger.warn(e);
93+
}
94+
7195
} else {
7296
boolean isTerminated = false;
7397

7498
try {
7599
isTerminated = lchannel.shutdown().awaitTermination(3, TimeUnit.SECONDS);
76100
} catch (Exception e) {
77-
logger.debug(e); //best effort
101+
logger.debug(toString(), e); //best effort
78102
}
79103
if (!isTerminated) {
80-
lchannel.shutdownNow();
104+
try {
105+
lchannel.shutdownNow();
106+
} catch (Exception e) {
107+
logger.warn(toString(), e);
108+
}
81109
}
82110
}
83111
}
84112

85113
public ListenableFuture<FabricProposalResponse.ProposalResponse> sendProposalAsync(FabricProposal.SignedProposal proposal) throws PeerException {
86114
if (shutdown) {
87-
throw new PeerException("Shutdown");
115+
throw new PeerException("Shutdown " + toString());
88116
}
89117
return futureStub.processProposal(proposal);
90118
}
91119

92120
public ListenableFuture<Protocol.Response> sendDiscoveryRequestAsync(Protocol.SignedRequest signedRequest) throws PeerException {
93121
if (shutdown) {
94-
throw new PeerException("Shutdown");
122+
throw new PeerException("Shutdown " + toString());
95123
}
96124
return discoveryFutureStub.discover(signedRequest);
97125
}
98126

99127
boolean isChannelActive() {
100128
ManagedChannel lchannel = managedChannel;
101-
return lchannel != null && !lchannel.isShutdown() && !lchannel.isTerminated() && ConnectivityState.READY.equals(lchannel.getState(true));
129+
if (null == lchannel) {
130+
131+
logger.trace(toString() + "Grpc channel needs creation.");
132+
133+
return false;
134+
}
135+
136+
final boolean isTerminated = lchannel.isTerminated();
137+
final boolean isShutdown = lchannel.isShutdown();
138+
final boolean ret = !lchannel.isShutdown() && !isTerminated; // && ConnectivityState.READY.equals(lchannel.getState(true));
139+
if (IS_TRACE_LEVEL) {
140+
logger.trace(format("%s grpc channel isActive: %b, isShutdown: %b, isTerminated: %b, state: %s ", toString(), ret, isShutdown, isTerminated, "" + lchannel.getState(false)));
141+
}
142+
143+
return ret;
102144
}
103145

104146
@Override
105147
public void finalize() {
148+
if (!shutdown) {
149+
logger.warn(toString() + " finalized not shutdown is Active" + isChannelActive());
150+
}
151+
106152
shutdown(true);
107153
}
108154
}

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

Lines changed: 64 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
package org.hyperledger.fabric.sdk;
1616

17+
import java.io.IOException;
18+
import java.io.ObjectInputStream;
1719
import java.io.Serializable;
1820
import java.util.ArrayList;
1921
import java.util.Properties;
@@ -52,8 +54,11 @@
5254

5355
public class EventHub implements Serializable {
5456
private static final long serialVersionUID = 2882609588201108148L;
55-
private static final Log logger = LogFactory.getLog(EventHub.class);
5657
private static final Config config = Config.getConfig();
58+
private transient String id = config.getNextID();
59+
private static final Log logger = LogFactory.getLog(EventHub.class);
60+
private static final boolean IS_TRACE_LEVEL = logger.isTraceEnabled();
61+
5762
private static final long EVENTHUB_CONNECTION_WAIT_TIME = config.getEventHubConnectionWaitTime();
5863
private static final long EVENTHUB_RECONNECTION_WARNING_RATE = config.getEventHubReconnectionWarningRate();
5964

@@ -78,6 +83,7 @@ public class EventHub implements Serializable {
7883
private transient long reconnectCount;
7984
private transient long lastBlockNumber;
8085
private transient BlockEvent lastBlockEvent;
86+
private String channelName;
8187

8288
/**
8389
* Get disconnected time.
@@ -99,6 +105,22 @@ public boolean isConnected() {
99105
return connected;
100106
}
101107

108+
String getStatus() {
109+
110+
StringBuilder sb = new StringBuilder(1000);
111+
sb.append(toString()).append(", connected: ").append(connected);
112+
ManagedChannel lmanagedChannel = managedChannel;
113+
if (lmanagedChannel == null) {
114+
sb.append("managedChannel: null");
115+
} else {
116+
sb.append(", isShutdown: ").append(lmanagedChannel.isShutdown());
117+
sb.append(", isTerminated: ").append(lmanagedChannel.isTerminated());
118+
sb.append(", state: ").append("" + lmanagedChannel.getState(false));
119+
}
120+
121+
return sb.toString();
122+
}
123+
102124
/**
103125
* Get last connect time.
104126
*
@@ -136,6 +158,7 @@ public long getLastConnectedAttempt() {
136158
this.name = name;
137159
this.executorService = executorService;
138160
this.properties = properties == null ? null : (Properties) properties.clone(); //keep our own copy.
161+
logger.debug("Created " + toString());
139162
}
140163

141164
/**
@@ -186,7 +209,7 @@ synchronized boolean connect(final TransactionContext transactionContext, final
186209

187210
final CountDownLatch finishLatch = new CountDownLatch(1);
188211

189-
logger.debug(format("EventHub %s is connecting.", name));
212+
logger.debug(format("%s is connecting.", toString()));
190213

191214
lastConnectedAttempt = System.currentTimeMillis();
192215

@@ -203,12 +226,14 @@ synchronized boolean connect(final TransactionContext transactionContext, final
203226
@Override
204227
public void onNext(PeerEvents.Event event) {
205228

206-
logger.debug(format("EventHub %s got event type: %s", EventHub.this.name, event.getEventCase().name()));
229+
logger.debug(format("%s got event type: %s", EventHub.this.toString(), event.getEventCase().name()));
207230

208231
if (event.getEventCase() == PeerEvents.Event.EventCase.BLOCK) {
209232
try {
210233

211234
BlockEvent blockEvent = new BlockEvent(EventHub.this, event);
235+
236+
logger.trace(format("%s got block number: %d", EventHub.this.toString(), blockEvent.getBlockNumber()));
212237
setLastBlockSeen(blockEvent);
213238

214239
eventQue.addBEvent(blockEvent); //add to channel queue
@@ -220,14 +245,17 @@ public void onNext(PeerEvents.Event event) {
220245
} else if (event.getEventCase() == PeerEvents.Event.EventCase.REGISTER) {
221246

222247
if (reconnectCount > 1) {
223-
logger.info(format("Eventhub %s has reconnecting after %d attempts", name, reconnectCount));
248+
logger.info(format("%s has reconnecting after %d attempts", EventHub.this.toString(), reconnectCount));
224249
}
225250

226251
connected = true;
227252
connectedTime = System.currentTimeMillis();
228253
reconnectCount = 0L;
229254

230255
finishLatch.countDown();
256+
} else {
257+
logger.error(format("%s got a unexpected block type: %s",
258+
EventHub.this.toString(), event.getEventCase().name()));
231259
}
232260
}
233261

@@ -271,7 +299,7 @@ public void onError(Throwable t) {
271299
try {
272300
reconnect();
273301
} catch (Exception e) {
274-
logger.warn(format("Eventhub %s Failed shutdown msg: %s", EventHub.this.name, e.getMessage()));
302+
logger.warn(format("%s Failed shutdown msg: %s", EventHub.this.toString(), e.getMessage()));
275303
}
276304

277305
}
@@ -300,17 +328,17 @@ public void onCompleted() {
300328

301329
if (!reconnection && !finishLatch.await(EVENTHUB_CONNECTION_WAIT_TIME, TimeUnit.MILLISECONDS)) {
302330

303-
logger.warn(format("EventHub %s failed to connect in %s ms.", name, EVENTHUB_CONNECTION_WAIT_TIME));
331+
logger.warn(format("%s failed to connect in %s ms.", toString(), EVENTHUB_CONNECTION_WAIT_TIME));
304332

305333
} else {
306-
logger.trace(format("Eventhub %s Done waiting for reply!", name));
334+
logger.trace(format("%s done waiting for reply!", toString()));
307335
}
308336

309337
} catch (InterruptedException e) {
310338
logger.error(e);
311339
}
312340

313-
logger.debug(format("Eventhub %s connect is done with connect status: %b ", name, connected));
341+
logger.debug(format("%s connect is done with connect status: %b ", toString(), connected));
314342

315343
if (connected) {
316344
eventStream = eventStreamLocal;
@@ -383,16 +411,19 @@ void setEventQue(Channel.ChannelEventQue eventQue) {
383411

384412
@Override
385413
public String toString() {
386-
return "EventHub:" + getName();
414+
return "EventHub{" + "id: " + id + ", name: " + getName() + ", channelName: " + channelName + ", url: " + getUrl() + "}";
387415
}
388416

389-
public void shutdown() {
417+
public synchronized void shutdown() {
418+
if (shutdown) {
419+
return;
420+
}
421+
logger.trace(toString() + " being shutdown.");
390422
shutdown = true;
391423
lastBlockEvent = null;
392424
lastBlockNumber = 0;
393425
connected = false;
394426
disconnectedHandler = null;
395-
channel = null;
396427
eventStream = null;
397428
final ManagedChannel lmanagedChannel = managedChannel;
398429
managedChannel = null;
@@ -406,20 +437,23 @@ void setChannel(Channel channel) throws InvalidArgumentException {
406437
throw new InvalidArgumentException("setChannel Channel can not be null");
407438
}
408439

409-
if (null != this.channel) {
440+
if (null != channelName) {
410441
throw new InvalidArgumentException(format("Can not add event hub %s to channel %s because it already belongs to channel %s.",
411-
name, channel.getName(), this.channel.getName()));
442+
name, channel.getName(), channelName));
412443
}
413-
414-
this.channel = channel;
444+
logger.debug(toString() + " set to channel: " + channel);
445+
this.channelName = channel.getName();
415446
}
416447

417-
synchronized void setLastBlockSeen(BlockEvent lastBlockSeen) {
448+
private synchronized void setLastBlockSeen(BlockEvent lastBlockSeen) {
418449
long newLastBlockNumber = lastBlockSeen.getBlockNumber();
419450
// overkill but make sure.
420451
if (lastBlockNumber < newLastBlockNumber) {
421452
lastBlockNumber = newLastBlockNumber;
422453
this.lastBlockEvent = lastBlockSeen;
454+
if (IS_TRACE_LEVEL) {
455+
logger.trace(toString() + " last block seen: " + lastBlockNumber);
456+
}
423457
}
424458
}
425459

@@ -446,7 +480,7 @@ public interface EventHubDisconnected {
446480
@Override
447481
public synchronized void disconnected(final EventHub eventHub) {
448482
if (reconnectCount == 1) {
449-
logger.warn(format("Channel %s detected disconnect on event hub %s (%s)", channel.getName(), eventHub.toString(), url));
483+
logger.warn(format("%s detected disconnect.", eventHub.toString()));
450484
}
451485

452486
executorService.execute(() -> {
@@ -455,7 +489,7 @@ public synchronized void disconnected(final EventHub eventHub) {
455489
Thread.sleep(500);
456490

457491
if (transactionContext == null) {
458-
logger.warn("Eventhub reconnect failed with no user context");
492+
logger.warn(EventHub.this.toString() + " reconnect failed with no user context");
459493
return;
460494
}
461495

@@ -485,4 +519,16 @@ public EventHubDisconnected setEventHubDisconnectedHandler(EventHubDisconnected
485519
return ret;
486520
}
487521

522+
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
523+
in.defaultReadObject();
524+
id = config.getNextID();
525+
}
526+
527+
public void finalize() throws Throwable {
528+
logger.trace(format("%s finalized", toString()));
529+
shutdown();
530+
super.finalize();
531+
532+
}
533+
488534
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
import static org.hyperledger.fabric.sdk.User.userContextCheck;
5252

5353
public class HFClient {
54-
private static final Config config = Config.getConfig();
54+
private static final Config config = Config.getConfig(); // never remove this! config needs to load first.
5555

5656
private CryptoSuite cryptoSuite;
5757
protected final ExecutorService executorService;
@@ -66,7 +66,6 @@ public class HFClient {
6666
}
6767
}
6868

69-
7069
ExecutorService getExecutorService() {
7170
return executorService;
7271
}

0 commit comments

Comments
 (0)