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

Commit 07cc133

Browse files
Listen to private data in the events (#190)
* Listen to private data in the events * Add integration tests for the new PDC events feature * Expose enum for block event type instead of multiple boolean getters to determine event type. Co-authored-by: S m, Aruna <aruna.mohan@walmart.com> Signed-off-by: Mark S. Lewis <Mark.S.Lewis@outlook.com> Co-authored-by: Arun S M <aruna.mohan@walmart.com>
1 parent 2481e5d commit 07cc133

File tree

6 files changed

+308
-36
lines changed

6 files changed

+308
-36
lines changed

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

Lines changed: 65 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -38,65 +38,90 @@
3838
* BlockInfo contains the data from a {@link Block}
3939
*/
4040
public class BlockInfo {
41-
private final BlockDeserializer block; //can be only one or the other.
41+
private final BlockDeserializer block; // block deserializer
4242
private final EventsPackage.FilteredBlock filteredBlock;
43+
private final EventsPackage.BlockAndPrivateData blockAndPrivateData;
44+
private final Type type;
4345

4446
BlockInfo(Block block) {
45-
4647
filteredBlock = null;
48+
blockAndPrivateData = null;
4749
this.block = new BlockDeserializer(block);
50+
type = Type.BLOCK;
4851
}
4952

5053
BlockInfo(EventsPackage.DeliverResponse resp) {
54+
final EventsPackage.DeliverResponse.TypeCase responseType = resp.getTypeCase();
5155

52-
final EventsPackage.DeliverResponse.TypeCase type = resp.getTypeCase();
53-
54-
if (type == EventsPackage.DeliverResponse.TypeCase.BLOCK) {
56+
if (responseType == EventsPackage.DeliverResponse.TypeCase.BLOCK) {
5557
final Block respBlock = resp.getBlock();
56-
filteredBlock = null;
5758
if (respBlock == null) {
5859
throw new AssertionError("DeliverResponse type block but block is null");
5960
}
61+
filteredBlock = null;
62+
blockAndPrivateData = null;
6063
this.block = new BlockDeserializer(respBlock);
61-
} else if (type == EventsPackage.DeliverResponse.TypeCase.FILTERED_BLOCK) {
64+
type = Type.BLOCK;
65+
} else if (responseType == EventsPackage.DeliverResponse.TypeCase.FILTERED_BLOCK) {
6266
filteredBlock = resp.getFilteredBlock();
63-
block = null;
6467
if (filteredBlock == null) {
6568
throw new AssertionError("DeliverResponse type filter block but filter block is null");
6669
}
67-
70+
block = null;
71+
blockAndPrivateData = null;
72+
type = Type.FILTERED_BLOCK;
73+
} else if (responseType == EventsPackage.DeliverResponse.TypeCase.BLOCK_AND_PRIVATE_DATA) {
74+
blockAndPrivateData = resp.getBlockAndPrivateData();
75+
if (blockAndPrivateData == null || blockAndPrivateData.getBlock() == null) {
76+
throw new AssertionError("DeliverResponse type block and private data is null");
77+
}
78+
filteredBlock = null;
79+
block = new BlockDeserializer(blockAndPrivateData.getBlock());
80+
type = Type.BLOCK_WITH_PRIVATE_DATA;
6881
} else {
69-
throw new AssertionError(format("DeliverResponse type has unexpected type: %s, %d", type.name(), type.getNumber()));
82+
throw new AssertionError(format("DeliverResponse type has unexpected type: %s, %d", responseType.name(), responseType.getNumber()));
7083
}
7184

7285
}
7386

7487
public boolean isFiltered() {
75-
if (filteredBlock == null && block == null) {
76-
throw new AssertionError("Both block and filter is null.");
77-
}
78-
if (filteredBlock != null && block != null) {
79-
throw new AssertionError("Both block and filter are set.");
80-
}
81-
return filteredBlock != null;
88+
return type == Type.FILTERED_BLOCK;
89+
}
90+
91+
/**
92+
* Block type information. The block type determines the values returned by {@link #getBlock()}, {@link #getFilteredBlock()}
93+
* and {@link #getBlockAndPrivateData()}.
94+
*/
95+
public Type getType() {
96+
return type;
8297
}
8398

8499
public String getChannelId() throws InvalidProtocolBufferException {
85100
return isFiltered() ? filteredBlock.getChannelId() : getEnvelopeInfo(0).getChannelId();
86101
}
87102

88103
/**
89-
* @return the raw {@link Block}
104+
* @return If {@link #getType()} is {@link Type#BLOCK} or {@link Type#BLOCK_WITH_PRIVATE_DATA}, the raw {@link Block};
105+
* otherwise {@code null}.
90106
*/
91107
public Block getBlock() {
92108
return isFiltered() ? null : block.getBlock();
93109
}
94110

95111
/**
96-
* @return the raw {@link org.hyperledger.fabric.protos.peer.EventsPackage.FilteredBlock}
112+
* @return If {@link #getType()} is {@link Type#FILTERED_BLOCK}, the raw {@link EventsPackage.FilteredBlock};
113+
* otherwise {@code null}.
97114
*/
98115
public EventsPackage.FilteredBlock getFilteredBlock() {
99-
return !isFiltered() ? null : filteredBlock;
116+
return filteredBlock;
117+
}
118+
119+
/**
120+
* @return If {@link #getType()} is {@link Type#BLOCK_WITH_PRIVATE_DATA}, the raw {@link EventsPackage.BlockAndPrivateData};
121+
* otherwise {@code null}.
122+
*/
123+
public EventsPackage.BlockAndPrivateData getBlockAndPrivateData() {
124+
return blockAndPrivateData;
100125
}
101126

102127
/**
@@ -179,6 +204,26 @@ public int getTransactionCount() {
179204
return transactionCount;
180205
}
181206

207+
/**
208+
* Block event type information.
209+
*/
210+
public enum Type {
211+
FILTERED_BLOCK("Filtered Block"),
212+
BLOCK("Block"),
213+
BLOCK_WITH_PRIVATE_DATA("Block and Private Data");
214+
215+
final String description;
216+
217+
Type(final String description) {
218+
this.description = description;
219+
}
220+
221+
@Override
222+
public String toString() {
223+
return this.description;
224+
}
225+
}
226+
182227
/**
183228
* Wrappers Envelope
184229
*/

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

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6415,12 +6415,12 @@ public static class PeerOptions implements Cloneable, Serializable {
64156415
protected Boolean newest = true;
64166416
protected Long startEvents;
64176417
protected Long stopEvents = Long.MAX_VALUE;
6418-
protected boolean registerEventsForFilteredBlocks = false;
6418+
protected BlockInfo.Type eventType = BlockInfo.Type.BLOCK;
64196419

64206420
@Override
64216421
public String toString() {
64226422
StringBuilder sb = new StringBuilder(1000);
6423-
sb.append("PeerOptions( " + format("newest: %s, startEvents: %s, stopEvents: %s, registerEventsForFilteredBlocks: %s", "" + newest, "" + startEvents, "" + stopEvents, registerEventsForFilteredBlocks));
6423+
sb.append("PeerOptions( " + format("newest: %s, startEvents: %s, stopEvents: %s, eventType: %s", "" + newest, "" + startEvents, "" + stopEvents, eventType));
64246424

64256425
if (peerRoles != null && !peerRoles.isEmpty()) {
64266426
sb.append(", PeerRoles:[");
@@ -6437,12 +6437,12 @@ public String toString() {
64376437
}
64386438

64396439
/**
6440-
* Is the peer eventing service registered for filtered blocks
6440+
* Returns requested event type
64416441
*
6442-
* @return true if filtered blocks will be returned by the peer eventing service.
6442+
* @return enum value of the event type
64436443
*/
6444-
public boolean isRegisterEventsForFilteredBlocks() {
6445-
return registerEventsForFilteredBlocks;
6444+
BlockInfo.Type getEventType() {
6445+
return this.eventType;
64466446
}
64476447

64486448
/**
@@ -6451,7 +6451,17 @@ public boolean isRegisterEventsForFilteredBlocks() {
64516451
* @return the PeerOptions instance.
64526452
*/
64536453
public PeerOptions registerEventsForFilteredBlocks() {
6454-
registerEventsForFilteredBlocks = true;
6454+
this.eventType = BlockInfo.Type.FILTERED_BLOCK;
6455+
return this;
6456+
}
6457+
6458+
/**
6459+
* Register the peer eventing services to return private data maps with the blocks.
6460+
*
6461+
* @return the PeerOptions instance.
6462+
*/
6463+
public PeerOptions registerEventsForPrivateData() {
6464+
this.eventType = BlockInfo.Type.BLOCK_WITH_PRIVATE_DATA;
64556465
return this;
64566466
}
64576467

@@ -6461,7 +6471,7 @@ public PeerOptions registerEventsForFilteredBlocks() {
64616471
* @return the PeerOptions instance.
64626472
*/
64636473
public PeerOptions registerEventsForBlocks() {
6464-
registerEventsForFilteredBlocks = false;
6474+
this.eventType = BlockInfo.Type.BLOCK;
64656475
return this;
64666476
}
64676477

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

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class PeerEventServiceClient {
5858
private long peerEventRegistrationWaitTimeMilliSecs = PEER_EVENT_REGISTRATION_WAIT_TIME;
5959

6060
private final PeerOptions peerOptions;
61-
private final boolean filterBlock;
61+
private final BlockInfo.Type eventType;
6262
private byte[] clientTLSCertificateDigest;
6363
StreamObserver<Envelope> nso = null;
6464
StreamObserver<EventsPackage.DeliverResponse> so = null;
@@ -73,7 +73,7 @@ class PeerEventServiceClient {
7373
*/
7474
PeerEventServiceClient(Peer peer, Endpoint endpoint, Properties properties, PeerOptions peerOptions) {
7575
this.channelBuilder = endpoint.getChannelBuilder();
76-
this.filterBlock = peerOptions.isRegisterEventsForFilteredBlocks();
76+
this.eventType = peerOptions.getEventType();
7777
this.peer = peer;
7878
this.peerOptions = peerOptions;
7979
name = peer.getName();
@@ -230,13 +230,17 @@ public void onNext(EventsPackage.DeliverResponse resp) {
230230
throwableList.add(peerEventingServiceException);
231231
}
232232
} else if (typeCase == EventsPackage.DeliverResponse.TypeCase.FILTERED_BLOCK ||
233-
typeCase == EventsPackage.DeliverResponse.TypeCase.BLOCK) {
233+
typeCase == EventsPackage.DeliverResponse.TypeCase.BLOCK ||
234+
typeCase == EventsPackage.DeliverResponse.TypeCase.BLOCK_AND_PRIVATE_DATA) {
234235
if (typeCase == EventsPackage.DeliverResponse.TypeCase.BLOCK) {
235236
logger.trace(format("%s got event block hex hashcode: %016x, block number: %d",
236237
PeerEventServiceClient.this.toString(), resp.getBlock().hashCode(), resp.getBlock().getHeader().getNumber()));
237-
} else {
238+
} else if (typeCase == EventsPackage.DeliverResponse.TypeCase.FILTERED_BLOCK) {
238239
logger.trace(format("%s got event block hex hashcode: %016x, block number: %d",
239240
PeerEventServiceClient.this.toString(), resp.getFilteredBlock().hashCode(), resp.getFilteredBlock().getNumber()));
241+
} else {
242+
logger.trace(format("%s got event block hex hashcode: %016x, block number: %d",
243+
PeerEventServiceClient.this.toString(), resp.getBlockAndPrivateData().getBlock().hashCode(), resp.getBlockAndPrivateData().getBlock().getHeader().getNumber()));
240244
}
241245

242246
peer.setLastConnectTime(System.currentTimeMillis());
@@ -303,7 +307,16 @@ public void onCompleted() {
303307
}
304308
};
305309

306-
nso = filterBlock ? broadcast.deliverFiltered(so) : broadcast.deliver(so);
310+
switch (this.eventType) {
311+
case FILTERED_BLOCK:
312+
nso = broadcast.deliverFiltered(so);
313+
break;
314+
case BLOCK_WITH_PRIVATE_DATA:
315+
nso = broadcast.deliverWithPrivateData(so);
316+
break;
317+
default:
318+
nso = broadcast.deliver(so);
319+
}
307320

308321
nso.onNext(envelope);
309322

src/test/java/org/hyperledger/fabric/sdk/NetworkConfigTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ public void testPeerOrdererOverrideHandlers() throws Exception {
470470
for (Peer peer : channel.getPeers()) {
471471
Channel.PeerOptions peersOptions = channel.getPeersOptions(peer);
472472
assertNotNull(peersOptions);
473-
assertTrue(peersOptions.isRegisterEventsForFilteredBlocks());
473+
assertEquals(peersOptions.getEventType(), BlockInfo.Type.FILTERED_BLOCK);
474474
assertEquals(expectedStartEvents, peersOptions.startEvents);
475475
assertEquals(expectedStopEvents, peersOptions.stopEvents);
476476
assertEquals(expectmaxMessageSizePeer, peer.getProperties().get("grpc.NettyChannelBuilderOption.maxInboundMessageSize"));

src/test/java/org/hyperledger/fabric/sdkintegration/End2endAndBackAgainIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -889,8 +889,8 @@ private void testPeerServiceEventingReplay(HFClient client, Channel replayTestCh
889889
assertNull(blockEvent.getBlock()); // should not have raw block event.
890890
assertNotNull(blockEvent.getFilteredBlock()); // should have raw filtered block.
891891
} else {
892-
assertNotNull(blockEvent.getBlock()); // should not have raw block event.
893-
assertNull(blockEvent.getFilteredBlock()); // should have raw filtered block.
892+
assertNotNull(blockEvent.getBlock()); // should have raw block event.
893+
assertNull(blockEvent.getFilteredBlock()); // should not have raw filtered block.
894894
}
895895

896896
assertEquals(replayTestChannel.getName(), blockEvent.getChannelId());

0 commit comments

Comments
 (0)