loadgen.c

来自「lustre 1.6.5 source code」· C语言 代码 · 共 1,038 行 · 第 1/3 页

C
1,038
字号
                                       trigger_cmd.c_flags);                        trigger_count--;                        memcpy(&kid->k_cmd, &trigger_cmd, sizeof(trigger_cmd));                        pthread_mutex_unlock(&m_trigger);                        rc = do_work(kid);                } else {                        pthread_mutex_unlock(&m_trigger);                }        }        if (o_verbose > 1)                printf("%s: thread #%d done (%d)\n", cmdname, thread, rc);        if (rc)                stop_all(SIGINT);out:        err = cleanup(ename, 0);        if (!rc) rc = err;        err = cleanup(oname, 0);        if (!rc) rc = err;        pthread_exit((void *)(long)rc);}static int loadgen_start_clients(int argc, char **argv){        int rc = 0, i, numt;        struct timespec ts = {0, 1000*1000*100}; /* .1 sec */        pthread_attr_t attr;        if (argc != 2)                return CMD_HELP;        numt = strtoul(argv[1], NULL, 0);        if (numt < 1)                return CMD_HELP;        if (!target[0]) {                fprintf(stderr, "%s: target OST is not defined, use 'device' "                        "command\n", cmdname);                return -EINVAL;        }        rc = pthread_attr_init(&attr);        if (rc) {                fprintf(stderr, "%s: pthread_attr_init:(%d) %s\n",                        cmdname, rc, strerror(errno));                return -errno;        }        pthread_attr_setstacksize (&attr, PTHREAD_STACK_MIN);        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);        numt += live_threads;        i = live_threads;        printf("start %d to %d\n", i, numt);        while(!rc && !sig_received && (i < numt)) {                pthread_t thread;                i++;                rc = pthread_create(&thread, &attr, run_one_child,                                    (void *)(long)i);                if (rc) {                        fprintf(stderr, "%s: pthread: #%d - (%d) %s\n",                                cmdname, i, rc, strerror(rc));                        break;                }                /* give them slightly different start times */                nanosleep(&ts, NULL);        }        pthread_attr_destroy(&attr);        return -rc;}static int loadgen_target(int argc, char **argv){        char *args[3];        __u64 nidx = 0;        int rc = 0;        if (argc < 2 || argc > 3)                return CMD_HELP;        args[0] = cmdname;        if (argc == 3) {                nidx = libcfs_str2nid(argv[2]);                if (nidx == LNET_NID_ANY) {                        fprintf(stderr, "%s: invalid nid '%s'\n",                                cmdname, argv[2]);                        return -EINVAL;                }        } else {                /* Local device should be in list */                args[1] = argv[1];                rc = jt_obd_device(2, args);                if (rc) {                        fprintf(stderr, "%s: local device '%s' doesn't "                                "seem to exist. You must use obdfilter device "                                "names like 'lustre-OST0000'.  Use 'dl' to "                                "list all devices.\n",                                cmdname, argv[1]);                        return -EINVAL;                }                /* Use the first local nid */                args[1] = (char *)(&nidx);                args[1][0] = 1; /* hack to get back first nid */                rc = jt_ptl_list_nids(2, args);                if (rc) {                        fprintf(stderr, "%s: can't get local nid (%d)\n",                                cmdname, rc);                        return rc;                }        }        if (strcmp(nid, libcfs_nid2str(nidx)) != 0) {                /* if new, do an add_uuid */                sprintf(nid, "%s", libcfs_nid2str(nidx));                /* Fixme change the uuid for every new one */                args[1] = "OSS_UUID";                args[2] = nid;                rc = jt_lcfg_add_uuid(3, args);                if (rc) {                        fprintf(stderr, "%s: can't add uuid '%s' (%d)\n",                                cmdname, args[2], rc);                        return rc;                }        }        snprintf(target, sizeof(target), "%s", argv[1]);        printf("Target OST name is '%s'\n", target);        return rc;}static int loadgen_verbose(int argc, char **argv){        if (argc != 2)                return CMD_HELP;        o_verbose = atoi(argv[1]);        printf("verbosity set to %d\n", o_verbose);        return 0;}static int loadgen_write(int argc, char **argv){        int threads;        if (argc < 3 || argc > 4)                return CMD_HELP;        threads = atoi(argv[1]);        if (threads > live_threads) {                fprintf(stderr, "requested %d threads but only %d are running. "                        "Use 'start' to start some more.\n",                        threads, live_threads);                return -EOVERFLOW;        }        trigger(C_WRITE, threads, atoi(argv[2]),                 (argc == 4) ? atoi(argv[3]) : 0);        return 0;}char ecsname[] = "echosrv";static int loadgen_stop_echosrv(int argc, char **argv){        int verbose = (argc != 9);        if (my_oss) {                char name[]="OSS";                cleanup(name, verbose);                my_oss = 0;        }        if (my_ecs || (argc == 9)) {                cleanup(ecsname, verbose);                my_ecs = 0;        }        return 0;}static int loadgen_start_echosrv(int argc, char **argv){        char *args[5];        int rc;        pthread_mutex_lock(&m_config);        args[0] = cmdname;        /* attach obdecho echosrv echosrv_UUID */        args[1] = "obdecho";        args[2] = args[3] = ecsname;        rc = jt_lcfg_attach(4, args);        if (rc) {                fprintf(stderr, "%s: can't attach echo server (%d)\n",                        cmdname, rc);                /* Assume we want e.g. an old one cleaned anyhow. */                goto clean;        }        my_ecs = 1;        /* setup */        rc = jt_lcfg_setup(1, args);        if (rc) {                fprintf(stderr, "%s: can't setup echo server (%d)\n",                        cmdname, rc);                goto clean;        }          /* Create an OSS to handle the communications */        /* attach ost OSS OSS_UUID */        args[1] = "ost";        args[2] = args[3] = "OSS";        rc = jt_lcfg_attach(4, args);        if (rc == EEXIST) {                /* Already set up for somebody else, that's fine. */                printf("OSS already set up, no problem.\n");                pthread_mutex_unlock(&m_config);                return 0;        }        if (rc) {                fprintf(stderr, "%s: can't attach OSS (%d)\n",                        cmdname, rc);                goto clean;        }        my_oss = 1;        /* setup */        rc = jt_lcfg_setup(1, args);        if (rc) {                fprintf(stderr, "%s: can't setup OSS (%d)\n",                        cmdname, rc);                goto clean;        }        pthread_mutex_unlock(&m_config);        return rc;clean:        pthread_mutex_unlock(&m_config);        loadgen_stop_echosrv(9, argv);        return rc;}static int loadgen_wait(int argc, char **argv){        /* Give scripts a chance to start some threads */           sleep(1);        while (!all_done) {                sleep(1);        }        return 0;}static int loadgen_init(int argc, char **argv){        char *args[3];        int rc;        sprintf(cmdname, "%s", argv[0]);        signal(SIGTERM, sig_master);        signal(SIGINT, sig_master);        /* Test to make sure obdecho module is loaded */        args[0] = cmdname;        args[1] = "echo_client";        args[2] = args[3] = "ecc_test";        rc = jt_lcfg_attach(4, args);        if (rc) {                fprintf(stderr, "%s: can't attach echo client (%d)\n",                        cmdname, rc);                if (rc == ENODEV)                        fprintf(stderr, "%s: is the obdecho module loaded?\n",                                cmdname);        } else {                args[1] = args[2];                jt_obd_detach(1, args);        }        return rc;}static int loadgen_exit(){        int rc;                printf("stopping %d children\n", live_threads);        kill_kids();        rc = wait_for_threads();        loadgen_stop_echosrv(0, NULL);        return rc;}/* libptlctl interface */static int loadgen_main(int argc, char **argv){        int rc;        setlinebuf(stdout);        /* without this threaded errors cause segfault */        setlinebuf(stderr);        if ((rc = ptl_initialize(argc, argv)) < 0)                exit(rc);        if ((rc = obd_initialize(argc, argv)) < 0)                exit(rc);        if ((rc = dbg_initialize(argc, argv)) < 0)                exit(rc);        Parser_init("loadgen> ", cmdlist);        rc = loadgen_init(argc, argv);        if (rc)                goto out;        if (argc > 1) {                rc = Parser_execarg(argc - 1, argv + 1, cmdlist);        } else {                rc = Parser_commands();        }        rc = loadgen_exit();out:        obd_finalize(argc, argv);        return rc;}#ifndef LIBLUSTRE_TESTint main (int argc, char **argv){        int rc;        rc = loadgen_main(argc, argv);        pthread_exit((void *)(long)rc);        return rc;}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?