32
32
import io .openmessaging .storage .dledger .protocol .MetadataResponse ;
33
33
import io .openmessaging .storage .dledger .protocol .PullEntriesRequest ;
34
34
import io .openmessaging .storage .dledger .protocol .PullEntriesResponse ;
35
+ import io .openmessaging .storage .dledger .protocol .PullReadIndexRequest ;
36
+ import io .openmessaging .storage .dledger .protocol .PullReadIndexResponse ;
35
37
import io .openmessaging .storage .dledger .protocol .PushEntryRequest ;
36
38
import io .openmessaging .storage .dledger .protocol .PushEntryResponse ;
37
39
import io .openmessaging .storage .dledger .protocol .RequestOrResponse ;
@@ -77,11 +79,13 @@ public DLedgerRpcNettyService(DLedgerServer dLedgerServer) {
77
79
this (dLedgerServer , null , null , null );
78
80
}
79
81
80
- public DLedgerRpcNettyService (DLedgerServer dLedgerServer , NettyServerConfig nettyServerConfig , NettyClientConfig nettyClientConfig ) {
82
+ public DLedgerRpcNettyService (DLedgerServer dLedgerServer , NettyServerConfig nettyServerConfig ,
83
+ NettyClientConfig nettyClientConfig ) {
81
84
this (dLedgerServer , nettyServerConfig , nettyClientConfig , null );
82
85
}
83
86
84
- public DLedgerRpcNettyService (DLedgerServer dLedgerServer , NettyServerConfig nettyServerConfig , NettyClientConfig nettyClientConfig , ChannelEventListener channelEventListener ) {
87
+ public DLedgerRpcNettyService (DLedgerServer dLedgerServer , NettyServerConfig nettyServerConfig ,
88
+ NettyClientConfig nettyClientConfig , ChannelEventListener channelEventListener ) {
85
89
this .dLedgerServer = dLedgerServer ;
86
90
this .memberState = dLedgerServer .getMemberState ();
87
91
NettyRequestProcessor protocolProcessor = new NettyRequestProcessor () {
@@ -109,6 +113,7 @@ public boolean rejectRequest() {
109
113
this .remotingServer .registerProcessor (DLedgerRequestCode .VOTE .getCode (), protocolProcessor , null );
110
114
this .remotingServer .registerProcessor (DLedgerRequestCode .HEART_BEAT .getCode (), protocolProcessor , null );
111
115
this .remotingServer .registerProcessor (DLedgerRequestCode .LEADERSHIP_TRANSFER .getCode (), protocolProcessor , null );
116
+ this .remotingServer .registerProcessor (DLedgerRequestCode .PULL_READ_INDEX .getCode (), protocolProcessor , null );
112
117
113
118
//start the remoting client
114
119
if (nettyClientConfig == null ) {
@@ -252,9 +257,29 @@ public CompletableFuture<PushEntryResponse> push(PushEntryRequest request) throw
252
257
return future ;
253
258
}
254
259
260
+ @ Override
261
+ public CompletableFuture <PullReadIndexResponse > pullReadIndex (PullReadIndexRequest request ) throws Exception {
262
+ CompletableFuture <PullReadIndexResponse > future = new CompletableFuture <>();
263
+ RemotingCommand wrapperRequest = RemotingCommand .createRequestCommand (DLedgerRequestCode .PULL_READ_INDEX .getCode (), null );
264
+ wrapperRequest .setBody (JSON .toJSONBytes (request ));
265
+ remotingClient .invokeAsync (getPeerAddr (request ), wrapperRequest , 3000 , responseFuture -> {
266
+ RemotingCommand responseCommand = responseFuture .getResponseCommand ();
267
+ PullReadIndexResponse response ;
268
+ if (null != responseCommand ) {
269
+ response = JSON .parseObject (responseCommand .getBody (), PullReadIndexResponse .class );
270
+ } else {
271
+ response = new PullReadIndexResponse ();
272
+ response .copyBaseInfo (request );
273
+ response .setCode (DLedgerResponseCode .NETWORK_ERROR .getCode ());
274
+ }
275
+ future .complete (response );
276
+ });
277
+ return future ;
278
+ }
279
+
255
280
@ Override
256
281
public CompletableFuture <LeadershipTransferResponse > leadershipTransfer (
257
- LeadershipTransferRequest request ) throws Exception {
282
+ LeadershipTransferRequest request ) throws Exception {
258
283
CompletableFuture <LeadershipTransferResponse > future = new CompletableFuture <>();
259
284
try {
260
285
RemotingCommand wrapperRequest = RemotingCommand .createRequestCommand (DLedgerRequestCode .LEADERSHIP_TRANSFER .getCode (), null );
@@ -283,7 +308,7 @@ public CompletableFuture<LeadershipTransferResponse> leadershipTransfer(
283
308
}
284
309
285
310
private void writeResponse (RequestOrResponse storeResp , Throwable t , RemotingCommand request ,
286
- ChannelHandlerContext ctx ) {
311
+ ChannelHandlerContext ctx ) {
287
312
RemotingCommand response = null ;
288
313
try {
289
314
if (t != null ) {
@@ -319,57 +344,43 @@ public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand
319
344
case METADATA : {
320
345
MetadataRequest metadataRequest = JSON .parseObject (request .getBody (), MetadataRequest .class );
321
346
CompletableFuture <MetadataResponse > future = handleMetadata (metadataRequest );
322
- future .whenCompleteAsync ((x , y ) -> {
323
- writeResponse (x , y , request , ctx );
324
- }, futureExecutor );
347
+ future .whenCompleteAsync ((x , y ) -> writeResponse (x , y , request , ctx ), futureExecutor );
325
348
break ;
326
349
}
327
350
case APPEND : {
328
351
AppendEntryRequest appendEntryRequest = JSON .parseObject (request .getBody (), AppendEntryRequest .class );
329
352
CompletableFuture <AppendEntryResponse > future = handleAppend (appendEntryRequest );
330
- future .whenCompleteAsync ((x , y ) -> {
331
- writeResponse (x , y , request , ctx );
332
- }, futureExecutor );
353
+ future .whenCompleteAsync ((x , y ) -> writeResponse (x , y , request , ctx ), futureExecutor );
333
354
break ;
334
355
}
335
356
case GET : {
336
357
GetEntriesRequest getEntriesRequest = JSON .parseObject (request .getBody (), GetEntriesRequest .class );
337
358
CompletableFuture <GetEntriesResponse > future = handleGet (getEntriesRequest );
338
- future .whenCompleteAsync ((x , y ) -> {
339
- writeResponse (x , y , request , ctx );
340
- }, futureExecutor );
359
+ future .whenCompleteAsync ((x , y ) -> writeResponse (x , y , request , ctx ), futureExecutor );
341
360
break ;
342
361
}
343
362
case PULL : {
344
363
PullEntriesRequest pullEntriesRequest = JSON .parseObject (request .getBody (), PullEntriesRequest .class );
345
364
CompletableFuture <PullEntriesResponse > future = handlePull (pullEntriesRequest );
346
- future .whenCompleteAsync ((x , y ) -> {
347
- writeResponse (x , y , request , ctx );
348
- }, futureExecutor );
365
+ future .whenCompleteAsync ((x , y ) -> writeResponse (x , y , request , ctx ), futureExecutor );
349
366
break ;
350
367
}
351
368
case PUSH : {
352
369
PushEntryRequest pushEntryRequest = JSON .parseObject (request .getBody (), PushEntryRequest .class );
353
370
CompletableFuture <PushEntryResponse > future = handlePush (pushEntryRequest );
354
- future .whenCompleteAsync ((x , y ) -> {
355
- writeResponse (x , y , request , ctx );
356
- }, futureExecutor );
371
+ future .whenCompleteAsync ((x , y ) -> writeResponse (x , y , request , ctx ), futureExecutor );
357
372
break ;
358
373
}
359
374
case VOTE : {
360
375
VoteRequest voteRequest = JSON .parseObject (request .getBody (), VoteRequest .class );
361
376
CompletableFuture <VoteResponse > future = handleVote (voteRequest );
362
- future .whenCompleteAsync ((x , y ) -> {
363
- writeResponse (x , y , request , ctx );
364
- }, futureExecutor );
377
+ future .whenCompleteAsync ((x , y ) -> writeResponse (x , y , request , ctx ), futureExecutor );
365
378
break ;
366
379
}
367
380
case HEART_BEAT : {
368
381
HeartBeatRequest heartBeatRequest = JSON .parseObject (request .getBody (), HeartBeatRequest .class );
369
382
CompletableFuture <HeartBeatResponse > future = handleHeartBeat (heartBeatRequest );
370
- future .whenCompleteAsync ((x , y ) -> {
371
- writeResponse (x , y , request , ctx );
372
- }, futureExecutor );
383
+ future .whenCompleteAsync ((x , y ) -> writeResponse (x , y , request , ctx ), futureExecutor );
373
384
break ;
374
385
}
375
386
case LEADERSHIP_TRANSFER : {
@@ -379,10 +390,16 @@ public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand
379
390
future .whenCompleteAsync ((x , y ) -> {
380
391
writeResponse (x , y , request , ctx );
381
392
logger .info ("LEADERSHIP_TRANSFER FINISHED. Request={}, response={}, cost={}ms" ,
382
- request , x , DLedgerUtils .elapsed (start ));
393
+ request , x , DLedgerUtils .elapsed (start ));
383
394
}, futureExecutor );
384
395
break ;
385
396
}
397
+ case PULL_READ_INDEX : {
398
+ PullReadIndexRequest pullReadIndexRequest = JSON .parseObject (request .getBody (), PullReadIndexRequest .class );
399
+ CompletableFuture <PullReadIndexResponse > future = handlePullReadIndex (pullReadIndexRequest );
400
+ future .whenCompleteAsync ((x , y ) -> writeResponse (x , y , request , ctx ), futureExecutor );
401
+ break ;
402
+ }
386
403
default :
387
404
logger .error ("Unknown request code {} from {}" , request .getCode (), request );
388
405
break ;
@@ -392,7 +409,7 @@ public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand
392
409
393
410
@ Override
394
411
public CompletableFuture <LeadershipTransferResponse > handleLeadershipTransfer (
395
- LeadershipTransferRequest leadershipTransferRequest ) throws Exception {
412
+ LeadershipTransferRequest leadershipTransferRequest ) throws Exception {
396
413
return dLedgerServer .handleLeadershipTransfer (leadershipTransferRequest );
397
414
}
398
415
@@ -432,6 +449,11 @@ public CompletableFuture<PushEntryResponse> handlePush(PushEntryRequest request)
432
449
return dLedgerServer .handlePush (request );
433
450
}
434
451
452
+ @ Override
453
+ public CompletableFuture <PullReadIndexResponse > handlePullReadIndex (PullReadIndexRequest request ) throws Exception {
454
+ return dLedgerServer .handlePullReadIndex (request );
455
+ }
456
+
435
457
public RemotingCommand handleResponse (RequestOrResponse response , RemotingCommand request ) {
436
458
RemotingCommand remotingCommand = RemotingCommand .createResponseCommand (DLedgerResponseCode .SUCCESS .getCode (), null );
437
459
remotingCommand .setBody (JSON .toJSONBytes (response ));
0 commit comments