synchronous method
| 103 | |
| 104 | // synchronous method |
| 105 | Status GrpcVerbsService::GetRemoteAddressSync( |
| 106 | const GetRemoteAddressRequest* request, |
| 107 | GetRemoteAddressResponse* response) { |
| 108 | // analyzing request |
| 109 | // the channel setting part is redundant. |
| 110 | const string remote_host_name = request->host_name(); |
| 111 | RdmaChannel* rc = rdma_mgr_->FindChannel(remote_host_name); |
| 112 | CHECK(rc); |
| 113 | RdmaAddress ra; |
| 114 | ra.lid = request->channel().lid(); |
| 115 | ra.qpn = request->channel().qpn(); |
| 116 | ra.psn = request->channel().psn(); |
| 117 | ra.snp = request->channel().snp(); |
| 118 | ra.iid = request->channel().iid(); |
| 119 | rc->SetRemoteAddress(ra, false); |
| 120 | rc->Connect(); |
| 121 | int i = 0; |
| 122 | int idx[] = {1, 0}; |
| 123 | std::vector<RdmaMessageBuffer*> mb(rc->message_buffers()); |
| 124 | CHECK_EQ(request->mr_size(), RdmaChannel::kNumMessageBuffers); |
| 125 | for (const auto& mr : request->mr()) { |
| 126 | // the connections are crossed, i.e. |
| 127 | // local tx_message_buffer <---> remote rx_message_buffer_ |
| 128 | // local rx_message_buffer <---> remote tx_message_buffer_ |
| 129 | // hence idx[] = {1, 0}. |
| 130 | RdmaMessageBuffer* rb = mb[idx[i]]; |
| 131 | RemoteMR rmr; |
| 132 | rmr.remote_addr = mr.remote_addr(); |
| 133 | rmr.rkey = mr.rkey(); |
| 134 | rb->SetRemoteMR(rmr, false); |
| 135 | i++; |
| 136 | } |
| 137 | CHECK(i == RdmaChannel::kNumMessageBuffers); |
| 138 | |
| 139 | // setting up response |
| 140 | response->set_host_name( |
| 141 | worker_env_->session_mgr->LegacySession()->worker_name); |
| 142 | Channel* channel_info = response->mutable_channel(); |
| 143 | channel_info->set_lid(rc->self().lid); |
| 144 | channel_info->set_qpn(rc->self().qpn); |
| 145 | channel_info->set_psn(rc->self().psn); |
| 146 | channel_info->set_snp(rc->self().snp); |
| 147 | channel_info->set_iid(rc->self().iid); |
| 148 | for (int i = 0; i < RdmaChannel::kNumMessageBuffers; i++) { |
| 149 | MemoryRegion* mr = response->add_mr(); |
| 150 | mr->set_remote_addr(reinterpret_cast<uint64>(mb[i]->buffer())); |
| 151 | mr->set_rkey(mb[i]->self()->rkey); |
| 152 | } |
| 153 | return Status::OK(); |
| 154 | } |
| 155 | |
| 156 | // Create a GrpcVerbsService, then assign it to a given handle. |
| 157 | void SetNewVerbsService(GrpcVerbsService** handle, const WorkerEnv* worker_env, |
nothing calls this directly
no test coverage detected