Add defer support to peers
authorFilippos Giannakos <philipgian@grnet.gr>
Wed, 27 Feb 2013 16:12:43 +0000 (18:12 +0200)
committerFilippos Giannakos <philipgian@grnet.gr>
Wed, 27 Feb 2013 16:12:43 +0000 (18:12 +0200)
Add support to peer skeleton to defer requests to another peer, by forwarding
requests to another port.

xseg/peers/user/peer.c
xseg/peers/user/peer.h

index a9ec9b3..b47a73f 100644 (file)
@@ -483,12 +483,26 @@ int peerd_start_threads(struct peerd *peer)
 #endif
 
 
-void defer_request(struct peerd *peer, struct peer_req *pr)
+int defer_request(struct peerd *peer, struct peer_req *pr)
 {
-       // assert canDefer(peer);
-//     xseg_submit(peer->xseg, peer->defer_portno, pr->req);
-//     xseg_signal(peer->xseg, peer->defer_portno);
-//     free_peer_req(peer, pr);
+       int r;
+       xport p;
+       if (!canDefer(peer)){
+               XSEGLOG2(&lc, E, "Peer cannot defer requests");
+               return -1;
+       }
+       p = xseg_forward(peer->xseg, pr->req, peer->defer_portno, pr->portno,
+                       X_ALLOC);
+       if (p == NoPort){
+               XSEGLOG2(&lc, E, "Cannot defer request %lx", pr->req);
+               return -1;
+       }
+       r = xseg_signal(peer->xseg, p);
+       if (r < 0) {
+               XSEGLOG2(&lc, W, "Cannot signal port %lu", p);
+       }
+       free_peer_req(peer, pr);
+       return 0;
 }
 
 static int peerd_loop(struct peerd *peer) 
@@ -551,7 +565,7 @@ static struct xseg *join(char *spec)
 }
 
 static struct peerd* peerd_init(uint32_t nr_ops, char* spec, long portno_start,
-                       long portno_end, uint32_t nr_threads, uint32_t defer_portno)
+                       long portno_end, uint32_t nr_threads, xport defer_portno)
 {
        int i;
        struct peerd *peer;
@@ -717,7 +731,7 @@ int main(int argc, char *argv[])
        uint32_t nr_ops = 16;
        uint32_t nr_threads = 1;
        unsigned int debug_level = 0;
-       uint32_t defer_portno = NoPort;
+       xport defer_portno = NoPort;
        pid_t old_pid;
        int pid_fd = -1;
 
@@ -743,7 +757,7 @@ int main(int argc, char *argv[])
 #ifdef MT
        READ_ARG_ULONG("-t", nr_threads);
 #endif
-//     READ_ARG_ULONG("-dp", defer_portno);
+       READ_ARG_ULONG("-dp", defer_portno);
        READ_ARG_STRING("-l", logfile, MAX_LOGFILE_LEN);
        READ_ARG_BOOL("-d", daemonize);
        READ_ARG_BOOL("-h", help);
index efaf051..72dd0e2 100644 (file)
@@ -90,7 +90,7 @@ struct peerd {
        xport portno_start;
        xport portno_end;
        long nr_ops;
-       uint32_t defer_portno;
+       xport defer_portno;
        struct peer_req *peer_reqs;
        struct xq free_reqs;
        void *priv;
@@ -110,7 +110,7 @@ enum dispatch_reason {
 
 void fail(struct peerd *peer, struct peer_req *pr);
 void complete(struct peerd *peer, struct peer_req *pr);
-void defer_request(struct peerd *peer, struct peer_req *pr);
+int defer_request(struct peerd *peer, struct peer_req *pr);
 void pending(struct peerd *peer, struct peer_req *req);
 void log_pr(char *msg, struct peer_req *pr);
 int canDefer(struct peerd *peer);