示例#1
0
文件: server.C 项目: Amit-DU/dht
void
user_args::reply (void *res)
{
  //marshall result
  xdrproc_t inproc = prog->tbl[procno].xdr_res;
  xdrsuio x (XDR_ENCODE);
  if ((!inproc) || (!inproc (x.xdrp (), res))) 
    fatal << "couldn't marshall result\n";

  int res_len = x.uio ()->resid ();
  track_reply (*prog, procno, res_len);

  //stuff into a transport wrapper
  dorpc_res *rpc_res = New dorpc_res (DORPC_OK);
  
  me_->fill_node (rpc_res->resok->src);
  rpc_res->resok->send_time_echo = send_time;
  rpc_res->resok->results.setsize (res_len);
  if (res_len > 0)
    x.uio ()->copyout (rpc_res->resok->results.base ());

  assert (rpc_res->status == DORPC_OK);
  
  u_int64_t diff = getusec (true) - init_time;
  track_proctime (*prog, procno, diff);
 
  //reply
  sbp->reply (rpc_res);
  delete rpc_res;
  delete this;
}
示例#2
0
文件: server.C 项目: Amit-DU/dht
ptr<dorpc_arg> vnode_impl::marshal_doRPC (ref<location> l,
    const rpc_program &prog, int procno, ptr<void> in)
{
  //form the transport RPC
  ptr<dorpc_arg> arg = New refcounted<dorpc_arg> ();

  //header

  l->fill_node (arg->dest);
  me_->fill_node (arg->src);
  
  arg->progno = prog.progno;
  arg->procno = procno;

  //marshall the args ourself
  xdrproc_t inproc = prog.tbl[procno].xdr_arg;
  xdrsuio x (XDR_ENCODE);
  if ((!inproc) || (!inproc (x.xdrp (), in))) {
    fatal << "failed to marshall args\n";
    return NULL;
  } else {
    int args_len = x.uio ()->resid ();
    arg->args.setsize (args_len);
    if (args_len > 0)
      x.uio ()->copyout (arg->args.base ());
  }
  return arg;
}
示例#3
0
void
doRPC (const chord_node &n, int procno, const void *in, void *out, aclnt_coords_cb cb)
{
  ptr<aclnt> c = get_aclnt (n.r.hostname, n.r.port);
  if (c == NULL) 
    fatal << "doRPC: couldn't aclnt::alloc\n";

 //form the transport RPC
  ptr<dorpc_arg> arg = New refcounted<dorpc_arg> ();

  //header
  struct sockaddr_in saddr;
  bzero(&saddr, sizeof (sockaddr_in));
  saddr.sin_family = AF_INET;
  inet_aton (n.r.hostname.cstr (), &saddr.sin_addr);

  arg->dest.machine_order_ipv4_addr = ntohl (saddr.sin_addr.s_addr);
  arg->dest.machine_order_port_vnnum = (n.r.port << 16) | n.vnode_num; 
  //leave coords as random.
  bzero (&arg->src, sizeof (arg->src));
  arg->progno = chord_program_1.progno;
  arg->procno = procno;
  
  //marshall the args ourself
  xdrproc_t inproc = chord_program_1.tbl[procno].xdr_arg;
  xdrsuio x (XDR_ENCODE);
  if ((!inproc) || (!inproc (x.xdrp (), (void *)in))) {
    fatal << "failed to marshall args\n";
  } else {
    int args_len = x.uio ()->resid ();
    arg->args.setsize (args_len);
    void *marshalled_args = suio_flatten (x.uio ());
    memcpy (arg->args.base (), marshalled_args, args_len);
    free (marshalled_args);

    dorpc_res *res = New dorpc_res (DORPC_OK);

    c->timedcall (TIMEOUT, TRANSPORTPROC_DORPC, 
		  arg, res, wrap (&doRPCcb, n.x, procno, res, out, cb));
  }
}