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 + -
显示快捷键?