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);
239 fprintf(stderr, "No request\n");
243 r = xseg_prep_request(xseg, req, targetlen, size);
245 fprintf(stderr, "Cannot prepare request! (%lu, %llu)\n",
246 (unsigned long)targetlen, (unsigned long long)size);
247 xseg_put_request(xseg, srcport, req);
251 req_target = xseg_get_target(xseg, req);
252 strncpy(req_target, target, targetlen);
253 req->offset = offset;
257 srl = xseg_submit(xseg, dstport, req);
261 xseg_signal(xseg, dstport);
265 int cmd_write(char *target, uint64_t offset)
271 char *req_target, *req_data;
272 uint32_t targetlen = strlen(target);
273 struct xseg_request *req;
275 inputbuf(stdin, &buf, &size);
277 fprintf(stderr, "No input\n");
281 req = xseg_get_request(xseg, srcport);
283 fprintf(stderr, "No request\n");
287 r = xseg_prep_request(xseg, req, targetlen, size);
289 fprintf(stderr, "Cannot prepare request! (%lu, %llu)\n",
290 (unsigned long)targetlen, (unsigned long long)size);
291 xseg_put_request(xseg, srcport, req);
295 req_target = xseg_get_target(xseg, req);
296 strncpy(req_target, target, targetlen);
298 req_data = xseg_get_data(xseg, req);
299 memcpy(req_data, buf, size);
300 req->offset = offset;
304 srl = xseg_submit(xseg, dstport, req);
305 if (srl == Noneidx) {
306 fprintf(stderr, "Cannot submit\n");
313 int cmd_truncate(char *target, uint64_t offset)
318 int cmd_delete(char *target)
323 int cmd_acquire(char *target)
328 int cmd_release(char *target)
333 int cmd_copy(char *src, char *dst)
338 int cmd_clone(char *src, char *dst)
343 void log_req(int logfd, uint32_t portno2, uint32_t portno1, int op, int method,
344 struct xseg_request *req)
347 char target[64], data[64];
348 char *req_target, *req_data;
349 /* null terminate name in case of req->target is less than 63 characters,
350 * and next character after name (aka first byte of next buffer) is not
353 unsigned int end = (req->targetlen > 63) ? 63 : req->targetlen;
355 req_target = xseg_get_target(xseg, req);
356 req_data = xseg_get_data(xseg, req);
358 logfp = fdopen(logfd, "a");
364 strncpy(target, req_target, end);
366 strncpy(data, req_data, 63);
370 "src port: %u, dst port: %u, op:%u offset: %llu size: %lu, reqstate: %u\n"
371 "target[%u]: '%s', data[%llu]:\n%s------------------\n\n",
372 (unsigned int)portno1,
373 (unsigned int)portno2,
374 (unsigned int)req->op,
375 (unsigned long long)req->offset,
376 (unsigned long)req->size,
377 (unsigned int)req->state,
378 (unsigned int)req->targetlen, target,
379 (unsigned long long)req->datalen, data);
383 "src port: %u, dst port: %u, op: %u\n",
384 (unsigned int)portno1,
385 (unsigned int)portno2,
386 (unsigned int)req->op);
389 fprintf(logfp, "src port: %u, dst port: %u, reqs: %llu\n",
390 (unsigned int)portno1,
391 (unsigned int)portno2,
392 (unsigned long long)++reqs);
400 #define LOG_RECEIVE 1
402 int cmd_bridge(uint32_t portno1, uint32_t portno2, char *logfile, char *how)
404 struct xseg_request *req;
406 if (!strcmp(logfile, "-"))
409 logfd = open(logfile, O_WRONLY|O_APPEND|O_CREAT, 0600);
416 if (!strcmp(how, "full"))
418 else if (!strcmp(how, "summary"))
424 int reloop = 0, active;
425 xseg_prepare_wait(xseg, portno1);
426 xseg_prepare_wait(xseg, portno2);
432 req = xseg_accept(xseg, portno1);
434 xseg_submit(xseg, portno2, req);
435 log_req(logfd, portno1, portno2, LOG_ACCEPT, method, req);
439 req = xseg_accept(xseg, portno2);
441 xseg_submit(xseg, portno1, req);
442 log_req(logfd, portno2, portno1, LOG_ACCEPT, method, req);
446 req = xseg_receive(xseg, portno1);
448 xseg_respond(xseg, portno2, req);
449 log_req(logfd, portno1, portno2, LOG_RECEIVE, method, req);
453 req = xseg_receive(xseg, portno2);
455 xseg_respond(xseg, portno1, req);
456 log_req(logfd, portno2, portno1, LOG_RECEIVE, method, req);
463 /* wait on multiple queues? */
464 xseg_wait_signal(xseg, 100000);
467 xseg_cancel_wait(xseg, portno1);
468 xseg_cancel_wait(xseg, portno2);
479 int cmd_rndwrite(long loops, int32_t seed, uint32_t targetlen, uint32_t chunksize, uint64_t size)
484 if (targetlen >= chunksize) {
485 fprintf(stderr, "targetlen >= chunksize\n");
489 char *p = realloc(namebuf, targetlen+1);
491 fprintf(stderr, "Cannot allocate memory\n");
496 p = realloc(chunk, chunksize);
498 fprintf(stderr, "Cannot allocate memory\n");
502 memset(chunk, 0, chunksize);
506 struct xseg_request *submitted = NULL, *received;
507 long nr_submitted = 0, nr_received = 0, nr_failed = 0;
511 char *req_data, *req_target;
514 xseg_prepare_wait(xseg, srcport);
515 if (nr_submitted < loops &&
516 (submitted = xseg_get_request(xseg, srcport))) {
517 xseg_cancel_wait(xseg, srcport);
518 r = xseg_prep_request(xseg, submitted, targetlen, chunksize);
520 fprintf(stderr, "Cannot prepare request! (%u, %u)\n",
521 targetlen, chunksize);
522 xseg_put_request(xseg, submitted->portno, submitted);
526 req_target = xseg_get_target(xseg, submitted);
527 req_data = xseg_get_data(xseg, submitted);
532 mkname(namebuf, targetlen, seed);
533 namebuf[targetlen] = 0;
534 //printf("%ld: %s\n", nr_submitted, namebuf);
535 strncpy(req_target, namebuf, targetlen);
536 offset = 0;// pick(size);
537 mkchunk(req_data, chunksize, namebuf, targetlen, offset);
539 submitted->offset = offset;
540 submitted->size = chunksize;
541 submitted->op = X_WRITE;
542 submitted->flags |= XF_NOSYNC;
544 srl = xseg_submit(xseg, dstport, submitted);
546 xseg_signal(xseg, dstport);
549 received = xseg_receive(xseg, srcport);
551 xseg_cancel_wait(xseg, srcport);
553 if (!(received->state & XS_SERVED)) {
555 report_request(received);
557 if (xseg_put_request(xseg, received->portno, received))
558 fprintf(stderr, "Cannot put request at port %u\n", received->portno);
561 if (!submitted && !received)
562 xseg_wait_signal(xseg, 1000000);
564 if (nr_submitted % 1000 == 0 && !reported) {
566 fprintf(stderr, "submitted %ld, received %ld, failed %ld\n",
567 nr_submitted, nr_received, nr_failed);
570 if (nr_received >= loops)
574 fprintf(stderr, "submitted %ld, received %ld, failed %ld\n",
575 nr_submitted, nr_received, nr_failed);
580 * prepare/wait rhythm,
581 * files are converted to independent chunk access patterns,
584 int cmd_rndread(long loops, int32_t seed, uint32_t targetlen, uint32_t chunksize, uint64_t size)
589 if (targetlen >= chunksize) {
590 fprintf(stderr, "targetlen >= chunksize\n");
594 char *p = realloc(namebuf, targetlen+1);
596 fprintf(stderr, "Cannot allocate memory\n");
601 p = realloc(chunk, chunksize);
603 fprintf(stderr, "Cannot allocate memory\n");
607 memset(chunk, 0, chunksize);
611 struct xseg_request *submitted = NULL, *received;
612 long nr_submitted = 0, nr_received = 0, nr_failed = 0, nr_mismatch = 0;
616 char *req_data, *req_target;
620 xseg_prepare_wait(xseg, srcport);
621 if (nr_submitted < loops &&
622 (submitted = xseg_get_request(xseg, srcport))) {
623 xseg_cancel_wait(xseg, srcport);
624 r = xseg_prep_request(xseg, submitted, targetlen, chunksize);
626 fprintf(stderr, "Cannot prepare request! (%u, %u)\n",
627 targetlen, chunksize);
628 xseg_put_request(xseg, submitted->portno, submitted);
632 req_target = xseg_get_target(xseg, submitted);
636 mkname(namebuf, targetlen, seed);
637 namebuf[targetlen] = 0;
638 //printf("%ld: %s\n", nr_submitted, namebuf);
639 offset = 0;//pick(size);
641 strncpy(req_target, namebuf, targetlen);
642 submitted->offset = offset;
643 submitted->size = chunksize;
644 submitted->op = X_READ;
646 srl = xseg_submit(xseg, dstport, submitted);
648 xseg_signal(xseg, dstport);
651 received = xseg_receive(xseg, srcport);
653 xseg_cancel_wait(xseg, srcport);
655 req_target = xseg_get_target(xseg, received);
656 req_data = xseg_get_data(xseg, received);
657 if (!(received->state & XS_SERVED)) {
659 report_request(received);
660 } else if (!chkchunk(req_data, received->datalen,
661 req_target, received->targetlen, received->offset)) {
665 if (xseg_put_request(xseg, received->portno, received))
666 fprintf(stderr, "Cannot put request at port %u\n", received->portno);
669 if (!submitted && !received)
670 xseg_wait_signal(xseg, 1000000);
672 if (nr_submitted % 1000 == 0 && !reported) {
674 fprintf(stderr, "submitted %ld, received %ld, failed %ld, mismatched %ld\n",
675 nr_submitted, nr_received, nr_failed, nr_mismatch);
678 if (nr_received >= loops)
682 fprintf(stderr, "submitted %ld, received %ld, failed %ld, mismatched %ld\n",
683 nr_submitted, nr_received, nr_failed, nr_mismatch);
687 int cmd_submit_reqs(long loops, long concurrent_reqs, int op)
692 struct xseg_request *submitted = NULL, *received;
693 long nr_submitted = 0, nr_received = 0, nr_failed = 0, nr_mismatch = 0, nr_flying = 0;
696 uint32_t targetlen = 10, chunksize = 4096;
697 struct timeval tv1, tv2;
699 char *req_data, *req_target;
701 xseg_bind_port(xseg, srcport);
703 gettimeofday(&tv1, NULL);
706 xseg_prepare_wait(xseg, srcport);
707 if (nr_submitted < loops && nr_flying < concurrent_reqs &&
708 (submitted = xseg_get_request(xseg, srcport))) {
709 xseg_cancel_wait(xseg, srcport);
710 r = xseg_prep_request(xseg, submitted, targetlen, chunksize);
712 fprintf(stderr, "Cannot prepare request! (%u, %u)\n",
713 targetlen, chunksize);
714 xseg_put_request(xseg, submitted->portno, submitted);
721 offset = 0;//pick(size);
723 submitted->offset = offset;
724 submitted->size = chunksize;
725 req_target = xseg_get_target(xseg, submitted);
726 req_data = xseg_get_data(xseg, submitted);
729 submitted->op = X_INFO;
731 submitted->op = X_READ;
733 submitted->op = X_WRITE;
734 mkchunk(req_data, submitted->datalen, req_target, submitted->targetlen, submitted->offset);
737 srl = xseg_submit(xseg, dstport, submitted);
739 if (xseg_signal(xseg, dstport) < 0)
740 perror("Cannot signal peer");
742 received = xseg_receive(xseg, srcport);
744 xseg_cancel_wait(xseg, srcport);
746 if (nr_received == 0)
747 fprintf(stderr, "latency (time for the first req to complete): %llu usecs\n",
748 (unsigned long long)received->elapsed);
750 if (!(received->state & XS_SERVED)) {
752 //report_request(received);
755 if (xseg_put_request(xseg, received->portno, received))
756 fprintf(stderr, "Cannot put request at port %u\n", received->portno);
759 if (!submitted && !received)
760 xseg_wait_signal(xseg, 10000000L);
762 if (nr_received >= loops)
765 gettimeofday(&tv2, NULL);
767 fprintf(stderr, "submitted %ld, received %ld, failed %ld, mismatched %ld\n",
768 nr_submitted, nr_received, nr_failed, nr_mismatch);
769 long t = (tv2.tv_sec - tv1.tv_sec)*1000000 + (tv2.tv_usec - tv1.tv_usec);
770 fprintf(stderr, "elpased time: %lf secs, throughput: %lf reqs/sec\n", (double) t / 1000000.0, (double) nr_submitted / (t / 1000000.0));
775 int cmd_report(uint32_t portno)
777 struct xseg_port *port = xseg_get_port(xseg, portno);
779 printf("port %u is not assigned\n", portno);
782 struct xq *fq, *rq, *pq;
783 fq = xseg_get_queue(xseg, port, free_queue);
784 rq = xseg_get_queue(xseg, port, request_queue);
785 pq = xseg_get_queue(xseg, port, reply_queue);
786 fprintf(stderr, "port %u:\n"
787 " free_queue [%p] count : %u\n"
788 " request_queue [%p] count : %u\n"
789 " reply_queue [%p] count : %u\n",
791 (void *)fq, xq_count(fq),
792 (void *)rq, xq_count(rq),
793 (void *)pq, xq_count(pq));
802 xseg = xseg_join(cfg.type, cfg.name, "posix", NULL);
804 fprintf(stderr, "cannot join segment!\n");
810 int cmd_reportall(void)
817 //fprintf(stderr, "global free requests: %u\n", xq_count(xseg->free_requests));
818 for (t = 0; t < xseg->config.nr_ports; t++)
826 int r = xseg_create(&cfg);
828 fprintf(stderr, "cannot create segment!\n");
832 fprintf(stderr, "Segment initialized.\n");
836 int cmd_destroy(void)
838 if (!xseg && cmd_join())
843 fprintf(stderr, "Segment destroyed.\n");
847 int cmd_alloc_requests(unsigned long nr)
849 return xseg_alloc_requests(xseg, srcport, nr);
852 int cmd_free_requests(unsigned long nr)
854 return xseg_free_requests(xseg, srcport, nr);
857 int cmd_put_requests(void)
859 struct xseg_request *req;
862 req = xseg_accept(xseg, dstport);
865 if (xseg_put_request(xseg, req->portno, req))
866 fprintf(stderr, "Cannot put request at port %u\n", req->portno);
872 int cmd_finish(unsigned long nr, int fail)
874 struct xseg_request *req;
875 char *buf = malloc(sizeof(char) * 8128);
876 char *req_target, *req_data;
877 xseg_bind_port(xseg, srcport);
880 xseg_prepare_wait(xseg, srcport);
881 req = xseg_accept(xseg, srcport);
883 req_target = xseg_get_target(xseg, req);
884 req_data = xseg_get_data(xseg, req);
885 xseg_cancel_wait(xseg, srcport);
887 req->state &= ~XS_SERVED;
889 if (req->op == X_READ)
890 mkchunk(req_data, req->datalen, req_target, req->targetlen, req->offset);
891 else if (req->op == X_WRITE)
892 memcpy(buf, req_data, (sizeof(*buf) > req->datalen) ? req->datalen : sizeof(*buf));
893 else if (req->op == X_INFO)
894 *((uint64_t *) req->data) = 4294967296;
896 req->state |= XS_SERVED;
897 req->serviced = req->size;
900 xseg_respond(xseg, dstport, req);
901 xseg_signal(xseg, dstport);
905 xseg_wait_signal(xseg, 10000000L);
913 void handle_reply(struct xseg_request *req)
915 char *req_data = xseg_get_data(xseg, req);
916 if (!(req->state & XS_SERVED)) {
923 fwrite(req_data, 1, req->datalen, stdout);
933 fprintf(stderr, "size: %llu\n", (unsigned long long)*((uint64_t *)req_data));
941 if (xseg_put_request(xseg, req->portno, req))
942 fprintf(stderr, "Cannot put reply at port %u\n", req->portno);
945 int cmd_wait(uint32_t nr)
947 struct xseg_request *req;
951 req = xseg_receive(xseg, srcport);
960 ret = xseg_prepare_wait(xseg, srcport);
964 ret = xseg_wait_signal(xseg, 1000000);
965 ret = xseg_cancel_wait(xseg, srcport);
973 int cmd_put_replies(void)
975 struct xseg_request *req;
978 req = xseg_receive(xseg, dstport);
981 fprintf(stderr, "request: %08llx%08llx\n"
984 0LL, (unsigned long long)req->serial,
989 //fwrite(req->buffer, 1, req->bufferlen, stdout);
991 if (xseg_put_request(xseg, req->portno, req))
992 fprintf(stderr, "Cannot put reply\n");
998 int cmd_bind(long portno)
1000 struct xseg_port *port = xseg_bind_port(xseg, portno);
1002 fprintf(stderr, "failed to bind port %ld\n", portno);
1006 fprintf(stderr, "bound port %u\n", xseg_portno(xseg, port));
1010 int cmd_signal(uint32_t portno)
1012 return xseg_signal(xseg, portno);
1015 int parse_ports(char *str)
1026 if ((s > str) && isdigit(str[0])) {
1027 srcport = atol(str);
1040 if ((s > str) && isdigit(str[0])) {
1041 dstport = atol(str);
1052 int main(int argc, char **argv)
1064 if (xseg_parse_spec(spec, &cfg)) {
1065 fprintf(stderr, "Cannot parse spec\n");
1069 if (xseg_initialize()) {
1070 fprintf(stderr, "cannot initialize!\n");
1074 for (i = 2; i < argc; i++) {
1076 if (!strcmp(argv[i], "create")) {
1081 if (!strcmp(argv[i], "join")) {
1084 fprintf(stderr, "Segment joined.\n");
1088 if (!strcmp(argv[i], "destroy")) {
1089 ret = cmd_destroy();
1096 if (!strcmp(argv[i], "reportall")) {
1097 ret = cmd_reportall();
1101 if (!strcmp(argv[i], "bind") && (i + 1 < argc)) {
1102 ret = cmd_bind(atol(argv[i+1]));
1107 if (!strcmp(argv[i], "signal") && (i + 1 < argc)) {
1108 ret = cmd_signal(atol(argv[i+1]));
1113 if (!strcmp(argv[i], "bridge") && (i + 4 < argc)) {
1114 ret = cmd_bridge(atol(argv[i+1]),
1122 if (srcport == -1) {
1123 if (!parse_ports(argv[i]))
1124 fprintf(stderr, "source port undefined: %s\n", argv[i]);
1128 if (dstport == -1) {
1129 if (!parse_ports(argv[i]))
1130 fprintf(stderr, "destination port undefined: %s\n", argv[i]);
1134 if (!strcmp(argv[i], "report")) {
1135 ret = cmd_report(dstport);
1139 if (!strcmp(argv[i], "alloc_requests") && (i + 1 < argc)) {
1140 ret = cmd_alloc_requests(atol(argv[i+1]));
1145 if (!strcmp(argv[i], "free_requests") && (i + 1 < argc)) {
1146 ret = cmd_free_requests(atol(argv[i+1]));
1151 if (!strcmp(argv[i], "put_requests")) {
1152 ret = cmd_put_requests();
1156 if (!strcmp(argv[i], "put_replies")) {
1157 ret = cmd_put_replies();
1161 if (!strcmp(argv[i], "complete") && (i + 1 < argc)) {
1162 ret = cmd_finish(atol(argv[i+1]), 0);
1167 if (!strcmp(argv[i], "fail") && (i + 1 < argc)) {
1168 ret = cmd_finish(atol(argv[i+1]), 1);
1173 if (!strcmp(argv[i], "wait") && (i + 1 < argc)) {
1174 ret = cmd_wait(atol(argv[i+1]));
1179 if (!strcmp(argv[i], "rndwrite") && (i + 5 < argc)) {
1180 long nr_loops = atol(argv[i+1]);
1181 unsigned int seed = atoi(argv[i+2]);
1182 unsigned int targetlen = atoi(argv[i+3]);
1183 unsigned int chunksize = atoi(argv[i+4]);
1184 unsigned long objectsize = atol(argv[i+5]);
1185 ret = cmd_rndwrite(nr_loops, seed, targetlen, chunksize, objectsize);
1190 if (!strcmp(argv[i], "rndread") && (i + 5 < argc)) {
1191 long nr_loops = atol(argv[i+1]);
1192 unsigned int seed = atoi(argv[i+2]);
1193 unsigned int targetlen = atoi(argv[i+3]);
1194 unsigned int chunksize = atoi(argv[i+4]);
1195 unsigned long objectsize = atol(argv[i+5]);
1196 ret = cmd_rndread(nr_loops, seed, targetlen, chunksize, objectsize);
1201 if (!strcmp(argv[i], "submit_reqs") && (i + 3 < argc)) {
1202 long nr_loops = atol(argv[i+1]);
1203 long concurrent_reqs = atol(argv[i+2]);
1204 int op = atoi(argv[i+3]);
1205 ret = cmd_submit_reqs(nr_loops, concurrent_reqs, op);
1210 if (!strcmp(argv[i], "read") && (i + 3 < argc)) {
1211 char *target = argv[i+1];
1212 uint64_t offset = atol(argv[i+2]);
1213 uint64_t size = atol(argv[i+3]);
1214 ret = cmd_read(target, offset, size);
1219 if (!strcmp(argv[i], "write") && (i + 2 < argc)) {
1220 char *target = argv[i+1];
1221 uint64_t offset = atol(argv[i+2]);
1222 ret = cmd_write(target, offset);
1227 if (!strcmp(argv[i], "truncate") && (i + 2 < argc)) {
1228 char *target = argv[i+1];
1229 uint64_t offset = atol(argv[i+2]);
1230 ret = cmd_truncate(target, offset);
1235 if (!strcmp(argv[i], "delete") && (i + 1 < argc)) {
1236 char *target = argv[i+1];
1237 ret = cmd_delete(target);
1242 if (!strcmp(argv[i], "acquire") && (i + 1 < argc)) {
1243 char *target = argv[i+1];
1244 ret = cmd_acquire(target);
1249 if (!strcmp(argv[i], "release") && (i + 1 < argc)) {
1250 char *target = argv[i+1];
1251 ret = cmd_release(target);
1256 if (!strcmp(argv[i], "copy") && (i + 2) < argc) {
1257 char *src = argv[i+1];
1258 char *dst = argv[i+2];
1259 ret = cmd_copy(src, dst);
1264 if (!strcmp(argv[i], "clone") && (i + 2 < argc)) {
1265 char *src = argv[i+1];
1266 char *dst = argv[i+2];
1267 ret = cmd_clone(src, dst);
1272 if (!strcmp(argv[i], "info") && (i + 1 < argc)) {
1273 char *target = argv[i+1];
1274 ret = cmd_info(target);
1280 if (!parse_ports(argv[i]))
1281 fprintf(stderr, "invalid argument: %s\n", argv[i]);