X-Git-Url: https://code.grnet.gr/git/archipelago/blobdiff_plain/9fb0f83b1ab1f05714a0b6fdab98919b8689ddd0..d0e9361a0fa949fc3c4e7d535bc64dab6f0a07aa:/xseg/peers/user/xseg-tool.c?ds=sidebyside diff --git a/xseg/peers/user/xseg-tool.c b/xseg/peers/user/xseg-tool.c index 21e85cf..74ce401 100644 --- a/xseg/peers/user/xseg-tool.c +++ b/xseg/peers/user/xseg-tool.c @@ -10,7 +10,7 @@ #include #include - +#include int help(void) { printf("xseg [[[]:[]] [ *] ]*\n" @@ -189,11 +189,11 @@ out: void report_request(struct xseg_request *req) { - uint32_t max = req->datalen; - char *data = xseg_get_data(xseg, req); - if (max > 128) - max = 128; - data[max-1] = 0; + //uint32_t max = req->datalen; + //char *data = xseg_get_data(xseg, req); + //if (max > 128) + // max = 128; + //data[max-1] = 0; fprintf(stderr, "request %llu state %u\n", (unsigned long long)req->serial, req->state); } @@ -314,6 +314,7 @@ int cmd_write(char *target, uint64_t offset) fprintf(stderr, "Cannot submit\n"); return -1; } + xseg_signal(xseg, p); return 0; } @@ -325,6 +326,39 @@ int cmd_truncate(char *target, uint64_t offset) int cmd_delete(char *target) { + uint32_t targetlen = strlen(target); + int r; + struct xseg_request *req; + init_local_signal(); + xseg_bind_port(xseg, srcport, NULL); + + req = xseg_get_request(xseg, srcport, dstport, X_ALLOC); + if (!req) { + fprintf(stderr, "No request!\n"); + return -1; + } + + r = xseg_prep_request(xseg, req, targetlen, 0); + if (r < 0) { + fprintf(stderr, "Cannot prepare request! (%lu, %lu)\n", + (unsigned long) targetlen, (unsigned long) req->bufferlen - targetlen); + xseg_put_request(xseg, req, srcport); + return -1; + } + + char *reqtarget = xseg_get_target(xseg, req); + strncpy(reqtarget, target, targetlen); + req->op = X_DELETE; + + xport p = xseg_submit(xseg, req, srcport, X_ALLOC); + if (p == NoPort){ + fprintf(stderr, "Couldn't submit request\n"); + xseg_put_request(xseg, req, srcport); + return -1; + } + + xseg_signal(xseg, p); + return 0; } @@ -345,6 +379,44 @@ int cmd_copy(char *src, char *dst) int cmd_clone(char *src, char *dst) { + + uint32_t targetlen = strlen(dst); + uint32_t parentlen = strlen(src); + struct xseg_request *req; + struct xseg_request_clone *xclone; + xseg_bind_port(xseg, srcport, NULL); + req = xseg_get_request(xseg, srcport, dstport, X_ALLOC); + if (!req) { + fprintf(stderr, "No request\n"); + return -1; + } + + int r = xseg_prep_request(xseg, req, targetlen, sizeof(struct xseg_request_clone)); + if (r < 0) { + fprintf(stderr, "Cannot prepare request!\n"); + xseg_put_request(xseg, req, srcport); + return -1; + } + + char *target = xseg_get_target(xseg, req); + char *data = xseg_get_data(xseg, req); + + strncpy(target, dst, targetlen); + xclone = (struct xseg_request_clone *) data; + strncpy(xclone->target, src, parentlen); + xclone->targetlen = parentlen; + xclone->size = -1; + req->offset = 0; + req->size = sizeof(struct xseg_request_clone); + req->op = X_CLONE; + + xport p = xseg_submit(xseg, req, srcport, X_ALLOC); + if (p == NoPort){ + fprintf(stderr, "Cannot submit request\n"); + return -1; + } + xseg_signal(xseg, p); + return 0; } @@ -438,28 +510,28 @@ int cmd_bridge(uint32_t portno1, uint32_t portno2, char *logfile, char *how) active = 0; //FIXME - req = xseg_accept(xseg, portno1); + req = xseg_accept(xseg, portno1, 0); if (req) { xseg_submit(xseg, req, portno2, X_ALLOC); log_req(logfd, portno1, portno2, LOG_ACCEPT, method, req); active += 1; } - req = xseg_accept(xseg, portno2); + req = xseg_accept(xseg, portno2, 0); if (req) { xseg_submit(xseg, req, portno1, X_ALLOC); log_req(logfd, portno2, portno1, LOG_ACCEPT, method, req); active += 1; } - req = xseg_receive(xseg, portno1); + req = xseg_receive(xseg, portno1, 0); if (req) { xseg_respond(xseg, req, portno2, X_ALLOC); log_req(logfd, portno1, portno2, LOG_RECEIVE, method, req); active += 1; } - req = xseg_receive(xseg, portno2); + req = xseg_receive(xseg, portno2, 0); if (req) { xseg_respond(xseg, req, portno1, X_ALLOC); log_req(logfd, portno2, portno1, LOG_RECEIVE, method, req); @@ -560,7 +632,7 @@ int cmd_rndwrite(long loops, int32_t seed, uint32_t targetlen, uint32_t chunksiz } } - received = xseg_receive(xseg, srcport); + received = xseg_receive(xseg, srcport, 0); if (received) { xseg_cancel_wait(xseg, srcport); nr_received += 1; @@ -666,7 +738,7 @@ int cmd_rndread(long loops, int32_t seed, uint32_t targetlen, uint32_t chunksize } } - received = xseg_receive(xseg, srcport); + received = xseg_receive(xseg, srcport, 0); if (received) { xseg_cancel_wait(xseg, srcport); nr_received += 1; @@ -717,7 +789,7 @@ int cmd_submit_reqs(long loops, long concurrent_reqs, int op) xport p; char *req_data, *req_target; - xseg_bind_port(xseg, srcport); + xseg_bind_port(xseg, srcport, NULL); gettimeofday(&tv1, NULL); for (;;) { @@ -760,7 +832,7 @@ int cmd_submit_reqs(long loops, long concurrent_reqs, int op) perror("Cannot signal peer"); } } - received = xseg_receive(xseg, srcport); + received = xseg_receive(xseg, srcport, 0); if (received) { xseg_cancel_wait(xseg, srcport); --nr_flying; @@ -883,7 +955,7 @@ int cmd_put_requests(void) struct xseg_request *req; for (;;) { - req = xseg_accept(xseg, dstport); + req = xseg_accept(xseg, dstport, 0); if (!req) break; if (xseg_put_request(xseg, req, srcport)) @@ -898,12 +970,12 @@ int cmd_finish(unsigned long nr, int fail) struct xseg_request *req; char *buf = malloc(sizeof(char) * 8128); char *req_target, *req_data; - xseg_bind_port(xseg, srcport); + xseg_bind_port(xseg, srcport, NULL); xport p; for (; nr--;) { xseg_prepare_wait(xseg, srcport); - req = xseg_accept(xseg, srcport); + req = xseg_accept(xseg, srcport, 0); if (req) { req_target = xseg_get_target(xseg, req); req_data = xseg_get_data(xseg, req); @@ -938,6 +1010,7 @@ int cmd_finish(unsigned long nr, int fail) void handle_reply(struct xseg_request *req) { char *req_data = xseg_get_data(xseg, req); + char *req_target = xseg_get_target(xseg, req); if (!(req->state & XS_SERVED)) { report_request(req); goto put; @@ -949,11 +1022,18 @@ void handle_reply(struct xseg_request *req) break; case X_WRITE: + fprintf(stdout, "wrote: "); + fwrite(req_data, 1, req->datalen, stdout); + break; case X_SYNC: case X_DELETE: + fprintf(stderr, "deleted %s\n", req_target); + break; case X_TRUNCATE: case X_COMMIT: case X_CLONE: + fprintf(stderr, "cloned %s\n", ((struct xseg_request_clone *)req_data)->target); + break; case X_INFO: fprintf(stderr, "size: %llu\n", (unsigned long long)*((uint64_t *)req_data)); break; @@ -971,9 +1051,10 @@ int cmd_wait(uint32_t nr) { struct xseg_request *req; long ret; + init_local_signal(); for (;;) { - req = xseg_receive(xseg, srcport); + req = xseg_receive(xseg, srcport, 0); if (req) { handle_reply(req); nr--; @@ -1000,7 +1081,7 @@ int cmd_put_replies(void) struct xseg_request *req; for (;;) { - req = xseg_receive(xseg, dstport); + req = xseg_receive(xseg, dstport, 0); if (!req) break; fprintf(stderr, "request: %08llx%08llx\n" @@ -1022,7 +1103,7 @@ int cmd_put_replies(void) int cmd_bind(long portno) { - struct xseg_port *port = xseg_bind_port(xseg, portno); + struct xseg_port *port = xseg_bind_port(xseg, portno, NULL); if (!port) { fprintf(stderr, "failed to bind port %ld\n", portno); return 1;