12 #include <xseg/xseg.h>
16 printf("xseg <spec> [[[<src_port>]:[<dst_port>]] [<command> <arg>*] ]*\n"
18 " <type:name:nr_ports:nr_requests:request_size:extra_size:page_shift>\n"
25 " bridge <portno1> <portno2> <logfile> {full|summary|stats}\n"
28 " alloc_requests (to source) <nr>\n"
29 " free_requests (from source) <nr>\n"
30 " put_requests (all from dest)\n"
31 " put_replies (all from dest)\n"
32 " wait <nr_replies>\n"
33 " complete <nr_requests>\n"
34 " fail <nr_requests>\n"
35 " rndwrite <nr_loops> <seed> <targetlen> <datalen> <objectsize>\n"
36 " rndread <nr_loops> <seed> <targetlen> <datalen> <objectsize>\n"
37 " submit_reqs <nr_loops> <concurrent_reqs>\n"
39 " read <target> <offset> <size>\n"
40 " write <target> <offset> < data\n"
41 " truncate <target> <size>\n"
46 " clone <src> <dst>\n"
53 struct xseg_config cfg;
55 uint32_t srcport, dstport;
57 #define mkname mkname_heavy
58 /* heavy distributes duplicates much more widely than light
59 * ./xseg-tool random 100000 | cut -d' ' -f2- | sort | uniq -d -c |wc -l
62 void mkname_heavy(char *name, uint32_t namelen, uint32_t seed)
66 for (i = 0; i < namelen; i += 1) {
67 c = seed + (seed >> 8) + (seed >> 16) + (seed >> 24);
68 c = '0' + ((c + (c >> 4)) & 0xf);
72 seed *= ((seed % 137911) | 1) * 137911;
76 void mkname_light(char *name, uint32_t namelen, uint32_t seed)
80 for (i = 0; i < namelen; i += 1) {
82 name[i] = 'A' + (c & 0xf);
87 uint64_t pick(uint64_t size)
89 return (uint64_t)((double)(RAND_MAX) / random());
92 void mkchunk( char *chunk, uint32_t datalen,
93 char *target, uint32_t targetlen, uint64_t offset)
95 long i, r, bufsize = targetlen + 16;
97 r = datalen % bufsize;
98 snprintf(buf, bufsize, "%016llx%s", (unsigned long long)offset, target);
100 for (i = 0; i <= (long)datalen - bufsize; i += bufsize)
101 memcpy(chunk + i, buf, bufsize);
103 memcpy(chunk + datalen - r, buf, r);
106 int chkchunk( char *chunk, uint32_t datalen,
107 char *target, uint32_t targetlen, uint64_t offset)
110 int bufsize = targetlen + 16;
112 r = datalen % targetlen;
113 snprintf(buf, bufsize, "%016llx%s", (unsigned long long)offset, target);
115 for (i = 0; i <= (long)datalen - bufsize; i += bufsize)
116 if (memcmp(chunk + i, buf, bufsize)) {
117 /*printf("mismatch: '%*s'* vs '%*s'\n",
118 bufsize, buf, datalen, chunk);
123 if (memcmp(chunk + datalen - r, buf, r))
130 #define ALLOC_MIN 4096
131 #define ALLOC_MAX 1048576
133 void inputbuf(FILE *fp, char **retbuf, uint64_t *retsize)
135 static uint64_t alloc_size;
141 if (alloc_size < ALLOC_MIN)
142 alloc_size = ALLOC_MIN;
144 if (alloc_size > ALLOC_MAX)
145 alloc_size = ALLOC_MAX;
147 p = realloc(buf, alloc_size);
158 r = fread(buf + size, 1, alloc_size - size, fp);
162 if (size >= alloc_size) {
163 p = realloc(buf, alloc_size * 2);
181 void report_request(struct xseg_request *req)
183 uint32_t max = req->datalen;
184 char *data = xseg_get_data(xseg, req);
188 fprintf(stderr, "request %llu state %u\n", (unsigned long long)req->serial, req->state);
189 fprintf(stderr, "data: %s\n", data);
192 int cmd_info(char *target)
194 uint32_t targetlen = strlen(target);
195 size_t size = sizeof(uint64_t);
198 struct xseg_request *req;
201 req = xseg_get_request(xseg, srcport);
203 fprintf(stderr, "No request!\n");
207 r = xseg_prep_request(xseg, req, targetlen, size);
209 fprintf(stderr, "Cannot prepare request! (%lu, %lu)\n",
210 (unsigned long) targetlen, (unsigned long) size);
211 xseg_put_request(xseg, srcport, req);
215 req_target = xseg_get_target(xseg, req);
216 strncpy(req_target, target, targetlen);
221 srl = xseg_submit(xseg, dstport, req);
225 xseg_signal(xseg, dstport);
230 int cmd_read(char *target, uint64_t offset, uint64_t size)
232 uint32_t targetlen = strlen(target);
236 struct xseg_request *req = xseg_get_request(xseg, srcport);
238 fprintf(stderr, "No request\n");
242 r = xseg_prep_request(xseg, req, targetlen, size);
244 fprintf(stderr, "Cannot prepare request! (%lu, %llu)\n",
245 (unsigned long)targetlen, (unsigned long long)size);
246 xseg_put_request(xseg, srcport, req);
250 req_target = xseg_get_target(xseg, req);
251 strncpy(req_target, target, targetlen);
252 req->offset = offset;
256 srl = xseg_submit(xseg, dstport, req);
260 xseg_signal(xseg, dstport);
264 int cmd_write(char *target, uint64_t offset)
270 char *req_target, *req_data;
271 uint32_t targetlen = strlen(target);
272 struct xseg_request *req;
274 inputbuf(stdin, &buf, &size);
276 fprintf(stderr, "No input\n");
280 req = xseg_get_request(xseg, srcport);
282 fprintf(stderr, "No request\n");
286 r = xseg_prep_request(xseg, req, targetlen, size);
288 fprintf(stderr, "Cannot prepare request! (%lu, %llu)\n",
289 (unsigned long)targetlen, (unsigned long long)size);
290 xseg_put_request(xseg, srcport, req);
294 req_target = xseg_get_target(xseg, req);
295 strncpy(req_target, target, targetlen);
297 req_data = xseg_get_data(xseg, req);
298 memcpy(req_data, buf, size);
299 req->offset = offset;
303 srl = xseg_submit(xseg, dstport, req);
304 if (srl == Noneidx) {
305 fprintf(stderr, "Cannot submit\n");
312 int cmd_truncate(char *target, uint64_t offset)
317 int cmd_delete(char *target)
322 int cmd_acquire(char *target)
327 int cmd_release(char *target)
332 int cmd_copy(char *src, char *dst)
337 int cmd_clone(char *src, char *dst)
342 void log_req(int logfd, uint32_t portno2, uint32_t portno1, int op, int method,
343 struct xseg_request *req)
346 char target[64], data[64];
347 char *req_target, *req_data;
348 /* null terminate name in case of req->target is less than 63 characters,
349 * and next character after name (aka first byte of next buffer) is not
352 unsigned int end = (req->targetlen > 63) ? 63 : req->targetlen;
354 req_target = xseg_get_target(xseg, req);
355 req_data = xseg_get_data(xseg, req);
357 logfp = fdopen(logfd, "a");
363 strncpy(target, req_target, end);
365 strncpy(data, req_data, 63);
369 "src port: %u, dst port: %u, op:%u offset: %llu size: %lu, reqstate: %u\n"
370 "target[%u]: '%s', data[%llu]:\n%s------------------\n\n",
371 (unsigned int)portno1,
372 (unsigned int)portno2,
373 (unsigned int)req->op,
374 (unsigned long long)req->offset,
375 (unsigned long)req->size,
376 (unsigned int)req->state,
377 (unsigned int)req->targetlen, target,
378 (unsigned long long)req->datalen, data);
382 "src port: %u, dst port: %u, op: %u\n",
383 (unsigned int)portno1,
384 (unsigned int)portno2,
385 (unsigned int)req->op);
388 fprintf(logfp, "src port: %u, dst port: %u, reqs: %llu\n",
389 (unsigned int)portno1,
390 (unsigned int)portno2,
391 (unsigned long long)++reqs);
399 #define LOG_RECEIVE 1
401 int cmd_bridge(uint32_t portno1, uint32_t portno2, char *logfile, char *how)
403 struct xseg_request *req;
405 if (!strcmp(logfile, "-"))
408 logfd = open(logfile, O_WRONLY|O_APPEND|O_CREAT, 0600);
415 if (!strcmp(how, "full"))
417 else if (!strcmp(how, "summary"))
423 int reloop = 0, active;
424 xseg_prepare_wait(xseg, portno1);
425 xseg_prepare_wait(xseg, portno2);
431 req = xseg_accept(xseg, portno1);
433 xseg_submit(xseg, portno2, req);
434 log_req(logfd, portno1, portno2, LOG_ACCEPT, method, req);
438 req = xseg_accept(xseg, portno2);
440 xseg_submit(xseg, portno1, req);
441 log_req(logfd, portno2, portno1, LOG_ACCEPT, method, req);
445 req = xseg_receive(xseg, portno1);
447 xseg_respond(xseg, portno2, req);
448 log_req(logfd, portno1, portno2, LOG_RECEIVE, method, req);
452 req = xseg_receive(xseg, portno2);
454 xseg_respond(xseg, portno1, req);
455 log_req(logfd, portno2, portno1, LOG_RECEIVE, method, req);
462 /* wait on multiple queues? */
463 xseg_wait_signal(xseg, 100000);
466 xseg_cancel_wait(xseg, portno1);
467 xseg_cancel_wait(xseg, portno2);
478 int cmd_rndwrite(long loops, int32_t seed, uint32_t targetlen, uint32_t chunksize, uint64_t size)
483 if (targetlen >= chunksize) {
484 fprintf(stderr, "targetlen >= chunksize\n");
488 char *p = realloc(namebuf, targetlen+1);
490 fprintf(stderr, "Cannot allocate memory\n");
495 p = realloc(chunk, chunksize);
497 fprintf(stderr, "Cannot allocate memory\n");
501 memset(chunk, 0, chunksize);
505 struct xseg_request *submitted = NULL, *received;
506 long nr_submitted = 0, nr_received = 0, nr_failed = 0;
510 char *req_data, *req_target;
513 xseg_prepare_wait(xseg, srcport);
514 if (nr_submitted < loops &&
515 (submitted = xseg_get_request(xseg, srcport))) {
516 xseg_cancel_wait(xseg, srcport);
517 r = xseg_prep_request(xseg, submitted, targetlen, chunksize);
519 fprintf(stderr, "Cannot prepare request! (%u, %u)\n",
520 targetlen, chunksize);
521 xseg_put_request(xseg, submitted->portno, submitted);
525 req_target = xseg_get_target(xseg, submitted);
526 req_data = xseg_get_data(xseg, submitted);
531 mkname(namebuf, targetlen, seed);
532 namebuf[targetlen] = 0;
533 //printf("%ld: %s\n", nr_submitted, namebuf);
534 strncpy(req_target, namebuf, targetlen);
535 offset = 0;// pick(size);
536 mkchunk(req_data, chunksize, namebuf, targetlen, offset);
538 submitted->offset = offset;
539 submitted->size = chunksize;
540 submitted->op = X_WRITE;
541 submitted->flags |= XF_NOSYNC;
543 srl = xseg_submit(xseg, dstport, submitted);
545 xseg_signal(xseg, dstport);
548 received = xseg_receive(xseg, srcport);
550 xseg_cancel_wait(xseg, srcport);
552 if (!(received->state & XS_SERVED)) {
554 report_request(received);
556 if (xseg_put_request(xseg, received->portno, received))
557 fprintf(stderr, "Cannot put request at port %u\n", received->portno);
560 if (!submitted && !received)
561 xseg_wait_signal(xseg, 1000000);
563 if (nr_submitted % 1000 == 0 && !reported) {
565 fprintf(stderr, "submitted %ld, received %ld, failed %ld\n",
566 nr_submitted, nr_received, nr_failed);
569 if (nr_received >= loops)
573 fprintf(stderr, "submitted %ld, received %ld, failed %ld\n",
574 nr_submitted, nr_received, nr_failed);
579 * prepare/wait rhythm,
580 * files are converted to independent chunk access patterns,
583 int cmd_rndread(long loops, int32_t seed, uint32_t targetlen, uint32_t chunksize, uint64_t size)
588 if (targetlen >= chunksize) {
589 fprintf(stderr, "targetlen >= chunksize\n");
593 char *p = realloc(namebuf, targetlen+1);
595 fprintf(stderr, "Cannot allocate memory\n");
600 p = realloc(chunk, chunksize);
602 fprintf(stderr, "Cannot allocate memory\n");
606 memset(chunk, 0, chunksize);
610 struct xseg_request *submitted = NULL, *received;
611 long nr_submitted = 0, nr_received = 0, nr_failed = 0, nr_mismatch = 0;
615 char *req_data, *req_target;
619 xseg_prepare_wait(xseg, srcport);
620 if (nr_submitted < loops &&
621 (submitted = xseg_get_request(xseg, srcport))) {
622 xseg_cancel_wait(xseg, srcport);
623 r = xseg_prep_request(xseg, submitted, targetlen, chunksize);
625 fprintf(stderr, "Cannot prepare request! (%u, %u)\n",
626 targetlen, chunksize);
627 xseg_put_request(xseg, submitted->portno, submitted);
631 req_target = xseg_get_target(xseg, submitted);
635 mkname(namebuf, targetlen, seed);
636 namebuf[targetlen] = 0;
637 //printf("%ld: %s\n", nr_submitted, namebuf);
638 offset = 0;//pick(size);
640 strncpy(req_target, namebuf, targetlen);
641 submitted->offset = offset;
642 submitted->size = chunksize;
643 submitted->op = X_READ;
645 srl = xseg_submit(xseg, dstport, submitted);
647 xseg_signal(xseg, dstport);
650 received = xseg_receive(xseg, srcport);
652 xseg_cancel_wait(xseg, srcport);
654 req_target = xseg_get_target(xseg, received);
655 req_data = xseg_get_data(xseg, received);
656 if (!(received->state & XS_SERVED)) {
658 report_request(received);
659 } else if (!chkchunk(req_data, received->datalen,
660 req_target, received->targetlen, received->offset)) {
664 if (xseg_put_request(xseg, received->portno, received))
665 fprintf(stderr, "Cannot put request at port %u\n", received->portno);
668 if (!submitted && !received)
669 xseg_wait_signal(xseg, 1000000);
671 if (nr_submitted % 1000 == 0 && !reported) {
673 fprintf(stderr, "submitted %ld, received %ld, failed %ld, mismatched %ld\n",
674 nr_submitted, nr_received, nr_failed, nr_mismatch);
677 if (nr_received >= loops)
681 fprintf(stderr, "submitted %ld, received %ld, failed %ld, mismatched %ld\n",
682 nr_submitted, nr_received, nr_failed, nr_mismatch);
686 int cmd_submit_reqs(long loops, long concurrent_reqs, int op)
691 struct xseg_request *submitted = NULL, *received;
692 long nr_submitted = 0, nr_received = 0, nr_failed = 0, nr_mismatch = 0, nr_flying = 0;
695 uint32_t targetlen = 10, chunksize = 4096;
696 struct timeval tv1, tv2;
698 char *req_data, *req_target;
700 xseg_bind_port(xseg, srcport);
702 gettimeofday(&tv1, NULL);
705 xseg_prepare_wait(xseg, srcport);
706 if (nr_submitted < loops && nr_flying < concurrent_reqs &&
707 (submitted = xseg_get_request(xseg, srcport))) {
708 xseg_cancel_wait(xseg, srcport);
709 r = xseg_prep_request(xseg, submitted, targetlen, chunksize);
711 fprintf(stderr, "Cannot prepare request! (%u, %u)\n",
712 targetlen, chunksize);
713 xseg_put_request(xseg, submitted->portno, submitted);
720 offset = 0;//pick(size);
722 submitted->offset = offset;
723 submitted->size = chunksize;
724 req_target = xseg_get_target(xseg, submitted);
725 req_data = xseg_get_data(xseg, submitted);
728 submitted->op = X_INFO;
730 submitted->op = X_READ;
732 submitted->op = X_WRITE;
733 mkchunk(req_data, submitted->datalen, req_target, submitted->targetlen, submitted->offset);
736 srl = xseg_submit(xseg, dstport, submitted);
738 if (xseg_signal(xseg, dstport) < 0)
739 perror("Cannot signal peer");
741 received = xseg_receive(xseg, srcport);
743 xseg_cancel_wait(xseg, srcport);
745 if (nr_received == 0)
746 fprintf(stderr, "latency (time for the first req to complete): %llu usecs\n",
747 (unsigned long long)received->elapsed);
749 if (!(received->state & XS_SERVED)) {
751 //report_request(received);
754 if (xseg_put_request(xseg, received->portno, received))
755 fprintf(stderr, "Cannot put request at port %u\n", received->portno);
758 if (!submitted && !received)
759 xseg_wait_signal(xseg, 10000000L);
761 if (nr_received >= loops)
764 gettimeofday(&tv2, NULL);
766 fprintf(stderr, "submitted %ld, received %ld, failed %ld, mismatched %ld\n",
767 nr_submitted, nr_received, nr_failed, nr_mismatch);
768 long t = (tv2.tv_sec - tv1.tv_sec)*1000000 + (tv2.tv_usec - tv1.tv_usec);
769 fprintf(stderr, "elpased time: %lf secs, throughput: %lf reqs/sec\n", (double) t / 1000000.0, (double) nr_submitted / (t / 1000000.0));
774 int cmd_report(uint32_t portno)
776 struct xseg_port *port = xseg_get_port(xseg, portno);
777 struct xq *fq, *rq, *pq;
778 fq = xseg_get_queue(xseg, port, free_queue);
779 rq = xseg_get_queue(xseg, port, request_queue);
780 pq = xseg_get_queue(xseg, port, reply_queue);
781 fprintf(stderr, "port %u:\n"
782 " free_queue [%p] count : %u\n"
783 " request_queue [%p] count : %u\n"
784 " reply_queue [%p] count : %u\n",
786 (void *)fq, xq_count(fq),
787 (void *)rq, xq_count(rq),
788 (void *)pq, xq_count(pq));
797 xseg = xseg_join(cfg.type, cfg.name, "posix", NULL);
799 fprintf(stderr, "cannot join segment!\n");
805 int cmd_reportall(void)
812 //fprintf(stderr, "global free requests: %u\n", xq_count(xseg->free_requests));
813 for (t = 0; t < xseg->config.nr_ports; t++)
821 int r = xseg_create(&cfg);
823 fprintf(stderr, "cannot create segment!\n");
827 fprintf(stderr, "Segment initialized.\n");
831 int cmd_destroy(void)
833 if (!xseg && cmd_join())
838 fprintf(stderr, "Segment destroyed.\n");
842 int cmd_alloc_requests(unsigned long nr)
844 return xseg_alloc_requests(xseg, srcport, nr);
847 int cmd_free_requests(unsigned long nr)
849 return xseg_free_requests(xseg, srcport, nr);
852 int cmd_put_requests(void)
854 struct xseg_request *req;
857 req = xseg_accept(xseg, dstport);
860 if (xseg_put_request(xseg, req->portno, req))
861 fprintf(stderr, "Cannot put request at port %u\n", req->portno);
867 int cmd_finish(unsigned long nr, int fail)
869 struct xseg_request *req;
870 char *buf = malloc(sizeof(char) * 8128);
871 char *req_target, *req_data;
872 xseg_bind_port(xseg, srcport);
875 xseg_prepare_wait(xseg, srcport);
876 req = xseg_accept(xseg, srcport);
878 req_target = xseg_get_target(xseg, req);
879 req_data = xseg_get_data(xseg, req);
880 xseg_cancel_wait(xseg, srcport);
882 req->state &= ~XS_SERVED;
884 if (req->op == X_READ)
885 mkchunk(req_data, req->datalen, req_target, req->targetlen, req->offset);
886 else if (req->op == X_WRITE)
887 memcpy(buf, req_data, (sizeof(*buf) > req->datalen) ? req->datalen : sizeof(*buf));
888 else if (req->op == X_INFO)
889 *((uint64_t *) req->data) = 4294967296;
891 req->state |= XS_SERVED;
892 req->serviced = req->size;
895 xseg_respond(xseg, dstport, req);
896 xseg_signal(xseg, dstport);
900 xseg_wait_signal(xseg, 10000000L);
908 void handle_reply(struct xseg_request *req)
910 char *req_data = xseg_get_data(xseg, req);
911 if (!(req->state & XS_SERVED)) {
918 fwrite(req_data, 1, req->datalen, stdout);
928 fprintf(stderr, "size: %llu\n", (unsigned long long)*((uint64_t *)req_data));
936 if (xseg_put_request(xseg, req->portno, req))
937 fprintf(stderr, "Cannot put reply at port %u\n", req->portno);
940 int cmd_wait(uint32_t nr)
942 struct xseg_request *req;
946 req = xseg_receive(xseg, srcport);
955 ret = xseg_prepare_wait(xseg, srcport);
959 ret = xseg_wait_signal(xseg, 1000000);
960 ret = xseg_cancel_wait(xseg, srcport);
968 int cmd_put_replies(void)
970 struct xseg_request *req;
973 req = xseg_receive(xseg, dstport);
976 fprintf(stderr, "request: %08llx%08llx\n"
979 0LL, (unsigned long long)req->serial,
984 //fwrite(req->buffer, 1, req->bufferlen, stdout);
986 if (xseg_put_request(xseg, req->portno, req))
987 fprintf(stderr, "Cannot put reply\n");
993 int cmd_bind(long portno)
995 struct xseg_port *port = xseg_bind_port(xseg, portno);
997 fprintf(stderr, "failed to bind port %ld\n", portno);
1001 fprintf(stderr, "bound port %u\n", xseg_portno(xseg, port));
1005 int cmd_signal(uint32_t portno)
1007 return xseg_signal(xseg, portno);
1010 int parse_ports(char *str)
1021 if ((s > str) && isdigit(str[0])) {
1022 srcport = atol(str);
1035 if ((s > str) && isdigit(str[0])) {
1036 dstport = atol(str);
1047 int main(int argc, char **argv)
1059 if (xseg_parse_spec(spec, &cfg)) {
1060 fprintf(stderr, "Cannot parse spec\n");
1064 if (xseg_initialize()) {
1065 fprintf(stderr, "cannot initialize!\n");
1069 for (i = 2; i < argc; i++) {
1071 if (!strcmp(argv[i], "create")) {
1076 if (!strcmp(argv[i], "join")) {
1079 fprintf(stderr, "Segment joined.\n");
1083 if (!strcmp(argv[i], "destroy")) {
1084 ret = cmd_destroy();
1091 if (!strcmp(argv[i], "reportall")) {
1092 ret = cmd_reportall();
1096 if (!strcmp(argv[i], "bind") && (i + 1 < argc)) {
1097 ret = cmd_bind(atol(argv[i+1]));
1102 if (!strcmp(argv[i], "signal") && (i + 1 < argc)) {
1103 ret = cmd_signal(atol(argv[i+1]));
1108 if (!strcmp(argv[i], "bridge") && (i + 4 < argc)) {
1109 ret = cmd_bridge(atol(argv[i+1]),
1117 if (srcport == -1) {
1118 if (!parse_ports(argv[i]))
1119 fprintf(stderr, "source port undefined: %s\n", argv[i]);
1123 if (dstport == -1) {
1124 if (!parse_ports(argv[i]))
1125 fprintf(stderr, "destination port undefined: %s\n", argv[i]);
1129 if (!strcmp(argv[i], "report")) {
1130 ret = cmd_report(dstport);
1134 if (!strcmp(argv[i], "alloc_requests") && (i + 1 < argc)) {
1135 ret = cmd_alloc_requests(atol(argv[i+1]));
1140 if (!strcmp(argv[i], "free_requests") && (i + 1 < argc)) {
1141 ret = cmd_free_requests(atol(argv[i+1]));
1146 if (!strcmp(argv[i], "put_requests")) {
1147 ret = cmd_put_requests();
1151 if (!strcmp(argv[i], "put_replies")) {
1152 ret = cmd_put_replies();
1156 if (!strcmp(argv[i], "complete") && (i + 1 < argc)) {
1157 ret = cmd_finish(atol(argv[i+1]), 0);
1162 if (!strcmp(argv[i], "fail") && (i + 1 < argc)) {
1163 ret = cmd_finish(atol(argv[i+1]), 1);
1168 if (!strcmp(argv[i], "wait") && (i + 1 < argc)) {
1169 ret = cmd_wait(atol(argv[i+1]));
1174 if (!strcmp(argv[i], "rndwrite") && (i + 5 < argc)) {
1175 long nr_loops = atol(argv[i+1]);
1176 unsigned int seed = atoi(argv[i+2]);
1177 unsigned int targetlen = atoi(argv[i+3]);
1178 unsigned int chunksize = atoi(argv[i+4]);
1179 unsigned long objectsize = atol(argv[i+5]);
1180 ret = cmd_rndwrite(nr_loops, seed, targetlen, chunksize, objectsize);
1185 if (!strcmp(argv[i], "rndread") && (i + 5 < argc)) {
1186 long nr_loops = atol(argv[i+1]);
1187 unsigned int seed = atoi(argv[i+2]);
1188 unsigned int targetlen = atoi(argv[i+3]);
1189 unsigned int chunksize = atoi(argv[i+4]);
1190 unsigned long objectsize = atol(argv[i+5]);
1191 ret = cmd_rndread(nr_loops, seed, targetlen, chunksize, objectsize);
1196 if (!strcmp(argv[i], "submit_reqs") && (i + 3 < argc)) {
1197 long nr_loops = atol(argv[i+1]);
1198 long concurrent_reqs = atol(argv[i+2]);
1199 int op = atoi(argv[i+3]);
1200 ret = cmd_submit_reqs(nr_loops, concurrent_reqs, op);
1205 if (!strcmp(argv[i], "read") && (i + 3 < argc)) {
1206 char *target = argv[i+1];
1207 uint64_t offset = atol(argv[i+2]);
1208 uint64_t size = atol(argv[i+3]);
1209 ret = cmd_read(target, offset, size);
1214 if (!strcmp(argv[i], "write") && (i + 2 < argc)) {
1215 char *target = argv[i+1];
1216 uint64_t offset = atol(argv[i+2]);
1217 ret = cmd_write(target, offset);
1222 if (!strcmp(argv[i], "truncate") && (i + 2 < argc)) {
1223 char *target = argv[i+1];
1224 uint64_t offset = atol(argv[i+2]);
1225 ret = cmd_truncate(target, offset);
1230 if (!strcmp(argv[i], "delete") && (i + 1 < argc)) {
1231 char *target = argv[i+1];
1232 ret = cmd_delete(target);
1237 if (!strcmp(argv[i], "acquire") && (i + 1 < argc)) {
1238 char *target = argv[i+1];
1239 ret = cmd_acquire(target);
1244 if (!strcmp(argv[i], "release") && (i + 1 < argc)) {
1245 char *target = argv[i+1];
1246 ret = cmd_release(target);
1251 if (!strcmp(argv[i], "copy") && (i + 2) < argc) {
1252 char *src = argv[i+1];
1253 char *dst = argv[i+2];
1254 ret = cmd_copy(src, dst);
1259 if (!strcmp(argv[i], "clone") && (i + 2 < argc)) {
1260 char *src = argv[i+1];
1261 char *dst = argv[i+2];
1262 ret = cmd_clone(src, dst);
1267 if (!strcmp(argv[i], "info") && (i + 1 < argc)) {
1268 char *target = argv[i+1];
1269 ret = cmd_info(target);
1275 if (!parse_ports(argv[i]))
1276 fprintf(stderr, "invalid argument: %s\n", argv[i]);