llog_test.c

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

C
721
字号
                RETURN(-EINVAL);        }        cookie.lgc_lgl = llh->lgh_id;        cookie.lgc_index = rec->lrh_index;        llog_cat_cancel_records(llh->u.phd.phd_cat_handle, 1, &cookie);        i++;        if (i == 40000)                RETURN(-4711);        RETURN(0);}/* Test log and catalogue processing */static int llog_test_5(struct obd_device *obd){        struct llog_handle *llh = NULL;        char name[10];        int rc;        struct llog_mini_rec lmr;        struct llog_ctxt *ctxt = llog_get_context(obd, LLOG_TEST_ORIG_CTXT);        ENTRY;        lmr.lmr_hdr.lrh_len = lmr.lmr_tail.lrt_len = LLOG_MIN_REC_SIZE;        lmr.lmr_hdr.lrh_type = 0xf00f00;        CWARN("5a: re-open catalog by id\n");        rc = llog_create(ctxt, &llh, &cat_logid, NULL);        if (rc) {                CERROR("5a: llog_create with logid failed: %d\n", rc);                GOTO(out, rc);        }        llog_init_handle(llh, LLOG_F_IS_CAT, &uuid);        CWARN("5b: print the catalog entries.. we expect 2\n");        rc = llog_process(llh, cat_print_cb, "test 5", NULL);        if (rc) {                CERROR("5b: process with cat_print_cb failed: %d\n", rc);                GOTO(out, rc);        }        CWARN("5c: Cancel 40000 records, see one log zapped\n");        rc = llog_cat_process(llh, llog_cancel_rec_cb, "foobar");        if (rc != -4711) {                CERROR("5c: process with cat_cancel_cb failed: %d\n", rc);                GOTO(out, rc);        }        CWARN("5d: add 1 record to the log with many canceled empty pages\n");        rc = llog_cat_add_rec(llh, &lmr.lmr_hdr, NULL, NULL);        if (rc) {                CERROR("5d: add record to the log with many canceled empty\                       pages failed\n");                GOTO(out, rc);        }        CWARN("5b: print the catalog entries.. we expect 1\n");        rc = llog_process(llh, cat_print_cb, "test 5", NULL);        if (rc) {                CERROR("5b: process with cat_print_cb failed: %d\n", rc);                GOTO(out, rc);        }        CWARN("5e: print plain log entries.. expect 6\n");        rc = llog_cat_process(llh, plain_print_cb, "foobar");        if (rc) {                CERROR("5e: process with plain_print_cb failed: %d\n", rc);                GOTO(out, rc);        }        CWARN("5f: print plain log entries reversely.. expect 6\n");        rc = llog_cat_reverse_process(llh, plain_print_cb, "foobar");        if (rc) {                CERROR("5f: reversely process with plain_print_cb failed: %d\n", rc);                GOTO(out, rc);        } out:        CWARN("5: close re-opened catalog\n");        if (llh)                rc = llog_cat_put(llh);        if (rc)                CERROR("1b: close log %s failed: %d\n", name, rc);        llog_ctxt_put(ctxt);        RETURN(rc);}/* Test client api; open log by name and process */static int llog_test_6(struct obd_device *obd, char *name){        struct obd_device *mdc_obd;        struct llog_ctxt *ctxt = llog_get_context(obd, LLOG_TEST_ORIG_CTXT);        struct obd_uuid *mds_uuid = &ctxt->loc_exp->exp_obd->obd_uuid;        struct lustre_handle exph = {0, };        struct obd_export *exp;        struct obd_uuid uuid = {"LLOG_TEST6_UUID"};        struct llog_handle *llh = NULL;        struct llog_ctxt *nctxt;        int rc;        CWARN("6a: re-open log %s using client API\n", name);        mdc_obd = class_find_client_obd(mds_uuid, LUSTRE_MDC_NAME, NULL);        if (mdc_obd == NULL) {                CERROR("6: no MDC devices connected to %s found.\n",                       mds_uuid->uuid);                GOTO(ctxt_release, rc = -ENOENT);        }        rc = obd_connect(&exph, mdc_obd, &uuid, NULL /* obd_connect_data */,                         NULL);        if (rc) {                CERROR("6: failed to connect to MDC: %s\n", mdc_obd->obd_name);                GOTO(ctxt_release, rc);        }        exp = class_conn2export(&exph);        nctxt = llog_get_context(mdc_obd, LLOG_CONFIG_REPL_CTXT);        rc = llog_create(nctxt, &llh, NULL, name);        if (rc) {                CERROR("6: llog_create failed %d\n", rc);                llog_ctxt_put(nctxt);                GOTO(ctxt_release, rc);        }        rc = llog_init_handle(llh, LLOG_F_IS_PLAIN, NULL);        if (rc) {                CERROR("6: llog_init_handle failed %d\n", rc);                GOTO(parse_out, rc);        }        rc = llog_process(llh, plain_print_cb, NULL, NULL);        if (rc)                CERROR("6: llog_process failed %d\n", rc);        rc = llog_reverse_process(llh, plain_print_cb, NULL, NULL);        if (rc)                CERROR("6: llog_reverse_process failed %d\n", rc);parse_out:        rc = llog_close(llh);        llog_ctxt_put(nctxt);        if (rc) {                CERROR("6: llog_close failed: rc = %d\n", rc);        }        rc = obd_disconnect(exp);ctxt_release:        llog_ctxt_put(ctxt);        RETURN(rc);}static int llog_test_7(struct obd_device *obd){        struct llog_ctxt *ctxt = llog_get_context(obd, LLOG_TEST_ORIG_CTXT);        struct llog_handle *llh;        struct llog_create_rec lcr;        char name[10];        int rc;        ENTRY;        sprintf(name, "%x", llog_test_rand+2);        CWARN("7: create a log with name: %s\n", name);        LASSERT(ctxt);        rc = llog_create(ctxt, &llh, NULL, name);        if (rc) {                CERROR("7: llog_create with name %s failed: %d\n", name, rc);                GOTO(ctxt_release, rc);        }        llog_init_handle(llh, LLOG_F_IS_PLAIN, &uuid);        lcr.lcr_hdr.lrh_len = lcr.lcr_tail.lrt_len = sizeof(lcr);        lcr.lcr_hdr.lrh_type = OST_SZ_REC;        rc = llog_write_rec(llh,  &lcr.lcr_hdr, NULL, 0, NULL, -1);        if (rc) {                CERROR("7: write one log record failed: %d\n", rc);                GOTO(ctxt_release, rc);        }        rc = llog_destroy(llh);        if (rc)                 CERROR("7: llog_destroy failed: %d\n", rc);        else                llog_free_handle(llh); ctxt_release:        llog_ctxt_put(ctxt);        RETURN(rc);}/* ------------------------------------------------------------------------- * Tests above, boring obd functions below * ------------------------------------------------------------------------- */static int llog_run_tests(struct obd_device *obd){        struct llog_handle *llh;        struct lvfs_run_ctxt saved;        struct llog_ctxt *ctxt = llog_get_context(obd, LLOG_TEST_ORIG_CTXT);        int rc, err, cleanup_phase = 0;        char name[10];        ENTRY;        sprintf(name, "%x", llog_test_rand);        push_ctxt(&saved, &ctxt->loc_exp->exp_obd->obd_lvfs_ctxt, NULL);        rc = llog_test_1(obd, name);        if (rc)                GOTO(cleanup, rc);        rc = llog_test_2(obd, name, &llh);        if (rc)                GOTO(cleanup, rc);        cleanup_phase = 1; /* close llh */        rc = llog_test_3(obd, llh);        if (rc)                GOTO(cleanup, rc);        rc = llog_test_4(obd);        if (rc)                GOTO(cleanup, rc);        rc = llog_test_5(obd);        if (rc)                GOTO(cleanup, rc);        rc = llog_test_6(obd, name);        if (rc)                GOTO(cleanup, rc);        rc = llog_test_7(obd);        if (rc)                GOTO(cleanup, rc); cleanup:        switch (cleanup_phase) {        case 1:                err = llog_close(llh);                if (err)                        CERROR("cleanup: llog_close failed: %d\n", err);                if (!rc)                        rc = err;        case 0:                pop_ctxt(&saved, &ctxt->loc_exp->exp_obd->obd_lvfs_ctxt, NULL);        }        llog_ctxt_put(ctxt);        return rc;}static int llog_test_llog_init(struct obd_device *obd, struct obd_device *tgt,                               int count, struct llog_catid *logid,                               struct obd_uuid *uuid){        int rc;        ENTRY;        rc = llog_setup(obd, LLOG_TEST_ORIG_CTXT, tgt, 0, NULL, &llog_lvfs_ops);        RETURN(rc);}static int llog_test_llog_finish(struct obd_device *obd, int count){        int rc;        ENTRY;        rc = llog_cleanup(llog_get_context(obd, LLOG_TEST_ORIG_CTXT));        RETURN(rc);}static int llog_test_cleanup(struct obd_device *obd){        int rc = obd_llog_finish(obd, 0);        if (rc)                CERROR("failed to llog_test_llog_finish: %d\n", rc);        lprocfs_obd_cleanup(obd);        return rc;}#ifdef LPROCFSstatic struct lprocfs_vars lprocfs_llog_test_obd_vars[] = { {0} };static struct lprocfs_vars lprocfs_llog_test_module_vars[] = { {0} };static void lprocfs_llog_test_init_vars(struct lprocfs_static_vars *lvars){    lvars->module_vars  = lprocfs_llog_test_module_vars;    lvars->obd_vars     = lprocfs_llog_test_obd_vars;}#endifstatic int llog_test_setup(struct obd_device *obd, obd_count len, void *buf){        struct lprocfs_static_vars lvars;        struct lustre_cfg *lcfg = buf;        struct obd_device *tgt;        int rc;        ENTRY;        if (lcfg->lcfg_bufcount < 2) {                CERROR("requires a TARGET OBD name\n");                RETURN(-EINVAL);        }        if (lcfg->lcfg_buflens[1] < 1) {                CERROR("requires a TARGET OBD name\n");                RETURN(-EINVAL);        }        tgt = class_name2obd(lustre_cfg_string(lcfg, 1));        if (!tgt || !tgt->obd_attached || !tgt->obd_set_up) {                CERROR("target device not attached or not set up (%s)\n",                       lustre_cfg_string(lcfg, 1));                RETURN(-EINVAL);        }        rc = obd_llog_init(obd, tgt, 0, NULL, NULL);        if (rc)                RETURN(rc);        llog_test_rand = ll_rand();        rc = llog_run_tests(obd);        if (rc)                llog_test_cleanup(obd);        lprocfs_llog_test_init_vars(&lvars);        lprocfs_obd_setup(obd, lvars.obd_vars);        RETURN(rc);}static struct obd_ops llog_obd_ops = {        .o_owner       = THIS_MODULE,        .o_setup       = llog_test_setup,        .o_cleanup     = llog_test_cleanup,        .o_llog_init   = llog_test_llog_init,        .o_llog_finish = llog_test_llog_finish,};static int __init llog_test_init(void){        struct lprocfs_static_vars lvars;        lprocfs_llog_test_init_vars(&lvars);        return class_register_type(&llog_obd_ops,lvars.module_vars,"llog_test");}static void __exit llog_test_exit(void){        class_unregister_type("llog_test");}MODULE_AUTHOR("Cluster File Systems, Inc. <info@clusterfs.com>");MODULE_DESCRIPTION("llog test module");MODULE_LICENSE("GPL");module_init(llog_test_init);module_exit(llog_test_exit);

⌨️ 快捷键说明

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