1 module neton.rpcservice.LeaseService; 2 3 import neton.protocol.neton; 4 import neton.protocol.neton; 5 import neton.protocol.netonrpc; 6 import grpc; 7 import hunt.logging; 8 import neton.server.NetonRpcServer; 9 import neton.util.Future; 10 import neton.rpcservice.Command; 11 import std.stdio; 12 13 class LeaseService : LeaseBase 14 { 15 override Status LeaseGrant(LeaseGrantRequest req, ref LeaseGrantResponse response) 16 { 17 auto f = new Future!(LeaseGrantRequest, LeaseGrantResponse)(req); 18 19 if(req.TTL == 0) 20 { 21 logError("grant lease ttl is null"); 22 return new Status(StatusCode.INVALID_ARGUMENT); 23 } 24 25 RpcRequest rreq; 26 if (req.ID == 0) 27 rreq.CMD = RpcReqCommand.LeaseGenIDRequest; 28 else 29 rreq.CMD = RpcReqCommand.LeaseGrantRequest; 30 rreq.LeaseID = req.ID; 31 rreq.TTL = req.TTL; 32 rreq.Hash = f.toHash(); 33 NetonRpcServer.instance().Propose(rreq, f); 34 logDebug("waiting ..... : ", rreq); 35 response = f.get(); 36 logDebug("waiting done....."); 37 38 return Status.OK; 39 } 40 41 override Status LeaseRevoke(LeaseRevokeRequest req, ref LeaseRevokeResponse response) 42 { 43 auto f = new Future!(LeaseRevokeRequest, LeaseRevokeResponse)(req); 44 45 if(req.ID == 0) 46 { 47 logError("revoke lease id is null"); 48 return new Status(StatusCode.INVALID_ARGUMENT); 49 } 50 51 RpcRequest rreq; 52 rreq.CMD = RpcReqCommand.LeaseRevokeRequest; 53 rreq.LeaseID = req.ID; 54 rreq.Hash = f.toHash(); 55 NetonRpcServer.instance().Propose(rreq, f); 56 logDebug("waiting ..... : ", rreq); 57 response = f.get(); 58 logDebug("waiting done....."); 59 60 return Status.OK; 61 } 62 63 override Status LeaseKeepAlive(ServerReaderWriter!(LeaseKeepAliveRequest, 64 LeaseKeepAliveResponse) rw) 65 { 66 LeaseKeepAliveRequest req; 67 while (rw.read(req)) 68 { 69 logDebug("LeaseKeepAlive -----> ID : ", req.ID); 70 if(req.ID == 0) 71 return new Status(StatusCode.INVALID_ARGUMENT); 72 73 auto f = new Future!(ServerReaderWriter!(LeaseKeepAliveRequest, LeaseKeepAliveResponse), LeaseKeepAliveResponse)(rw); 74 75 RpcRequest rreq; 76 rreq.CMD = RpcReqCommand.LeaseKeepAliveRequest; 77 rreq.LeaseID = req.ID; 78 rreq.Hash = f.toHash(); 79 NetonRpcServer.instance().Propose(rreq, f); 80 } 81 logWarning("LeaseKeepAlive service end : ", this.toHash()); 82 83 return Status.OK; 84 } 85 86 override Status LeaseTimeToLive(LeaseTimeToLiveRequest req, ref LeaseTimeToLiveResponse response) 87 { 88 if(req.ID == 0) 89 { 90 logError("lease timetolive id is null"); 91 return new Status(StatusCode.INVALID_ARGUMENT); 92 } 93 94 auto f = new Future!(LeaseTimeToLiveRequest, LeaseTimeToLiveResponse)(req); 95 96 RpcRequest rreq; 97 rreq.CMD = RpcReqCommand.LeaseTimeToLiveRequest; 98 rreq.LeaseID = req.ID; 99 rreq.Hash = f.toHash(); 100 NetonRpcServer.instance().Propose(rreq, f); 101 logDebug("waiting ..... : ", rreq); 102 response = f.get(); 103 logDebug("waiting done....."); 104 105 return Status.OK; 106 } 107 108 override Status LeaseLeases(LeaseLeasesRequest req, ref LeaseLeasesResponse response) 109 { 110 auto f = new Future!(LeaseLeasesRequest, LeaseLeasesResponse)(req); 111 112 RpcRequest rreq; 113 rreq.CMD = RpcReqCommand.LeaseLeasesRequest; 114 rreq.Hash = f.toHash(); 115 NetonRpcServer.instance().Propose(rreq, f); 116 logDebug("waiting ..... : ", rreq); 117 response = f.get(); 118 logDebug("waiting done....."); 119 120 return Status.OK; 121 } 122 123 }