llog_test.c

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

C
721
字号
/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * *  Copyright (C) 2003 Cluster File Systems, Inc. *   Author: Phil Schwan <phil@clusterfs.com> * *   This file is part of the Lustre file system, http://www.lustre.org *   Lustre is a trademark of Cluster File Systems, Inc. * *   You may have signed or agreed to another license before downloading *   this software.  If so, you are bound by the terms and conditions *   of that agreement, and the following does not apply to you.  See the *   LICENSE file included with this distribution for more information. * *   If you did not agree to a different license, then this copy of Lustre *   is open source software; you can redistribute it and/or modify it *   under the terms of version 2 of the GNU General Public License as *   published by the Free Software Foundation. * *   In either case, Lustre is distributed in the hope that it will be *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *   license text for more details. * * A kernel module which tests the llog API from the OBD setup function. */#ifndef EXPORT_SYMTAB# define EXPORT_SYMTAB#endif#define DEBUG_SUBSYSTEM S_CLASS#include <linux/module.h>#include <linux/init.h>#include <obd_class.h>#include <lustre_log.h>static int llog_test_rand;static struct obd_uuid uuid = { .uuid = "test_uuid" };static struct llog_logid cat_logid;struct llog_mini_rec {        struct llog_rec_hdr     lmr_hdr;        struct llog_rec_tail    lmr_tail;} __attribute__((packed));static int verify_handle(char *test, struct llog_handle *llh, int num_recs){        int i;        int last_idx = 0;        int active_recs = 0;        for (i = 0; i < LLOG_BITMAP_BYTES * 8; i++) {                if (ext2_test_bit(i, llh->lgh_hdr->llh_bitmap)) {                        last_idx = i;                        active_recs++;                }        }        if (active_recs != num_recs) {                CERROR("%s: expected %d active recs after write, found %d\n",                       test, num_recs, active_recs);                RETURN(-ERANGE);        }        if (llh->lgh_hdr->llh_count != num_recs) {                CERROR("%s: handle->count is %d, expected %d after write\n",                       test, llh->lgh_hdr->llh_count, num_recs);                RETURN(-ERANGE);        }        if (llh->lgh_last_idx < last_idx) {                CERROR("%s: handle->last_idx is %d, expected %d after write\n",                       test, llh->lgh_last_idx, last_idx);                RETURN(-ERANGE);        }        RETURN(0);}/* Test named-log create/open, close */static int llog_test_1(struct obd_device *obd, char *name){        struct llog_handle *llh;        struct llog_ctxt *ctxt = llog_get_context(obd, LLOG_TEST_ORIG_CTXT);        int rc;        int rc2;        ENTRY;        CWARN("1a: create a log with name: %s\n", name);        LASSERT(ctxt);        rc = llog_create(ctxt, &llh, NULL, name);        if (rc) {                CERROR("1a: llog_create with name %s failed: %d\n", name, rc);                llog_ctxt_put(ctxt);                RETURN(rc);        }        llog_init_handle(llh, LLOG_F_IS_PLAIN, &uuid);        if ((rc = verify_handle("1", llh, 1)))                GOTO(out, rc); out:        CWARN("1b: close newly-created log\n");        rc2 = llog_close(llh);        llog_ctxt_put(ctxt);        if (rc2) {                CERROR("1b: close log %s failed: %d\n", name, rc2);                if (rc == 0)                        rc = rc2;        }        RETURN(rc);}/* Test named-log reopen; returns opened log on success */static int llog_test_2(struct obd_device *obd, char *name,                       struct llog_handle **llh){        struct llog_handle *loghandle;        struct llog_logid logid;        int rc;        struct llog_ctxt *ctxt = llog_get_context(obd, LLOG_TEST_ORIG_CTXT);        ENTRY;        CWARN("2a: re-open a log with name: %s\n", name);        rc = llog_create(ctxt, llh, NULL, name);        if (rc) {                CERROR("2a: re-open log with name %s failed: %d\n", name, rc);                GOTO(out, rc);        }        llog_init_handle(*llh, LLOG_F_IS_PLAIN, &uuid);        if ((rc = verify_handle("2", *llh, 1)))                GOTO(out, rc);        CWARN("2b: create a log without specified NAME & LOGID\n");        rc = llog_create(ctxt, &loghandle, NULL, NULL);        if (rc) {                CERROR("2b: create log failed\n");                GOTO(out, rc);        }        llog_init_handle(loghandle, LLOG_F_IS_PLAIN, &uuid);        logid = loghandle->lgh_id;        llog_close(loghandle);        CWARN("2b: re-open the log by LOGID\n");        rc = llog_create(ctxt, &loghandle, &logid, NULL);        if (rc) {                CERROR("2b: re-open log by LOGID failed\n");                GOTO(out, rc);        }        llog_init_handle(loghandle, LLOG_F_IS_PLAIN, &uuid);        CWARN("2b: destroy this log\n");        rc = llog_destroy(loghandle);        if (rc) {                CERROR("2b: destroy log failed\n");                GOTO(out, rc);        }        llog_free_handle(loghandle);out:        llog_ctxt_put(ctxt);        RETURN(rc);}/* Test record writing, single and in bulk */static int llog_test_3(struct obd_device *obd, struct llog_handle *llh){        struct llog_create_rec lcr;        int rc, i;        int num_recs = 1;       /* 1 for the header */        ENTRY;        lcr.lcr_hdr.lrh_len = lcr.lcr_tail.lrt_len = sizeof(lcr);        lcr.lcr_hdr.lrh_type = OST_SZ_REC;        CWARN("3a: write one create_rec\n");        rc = llog_write_rec(llh,  &lcr.lcr_hdr, NULL, 0, NULL, -1);        num_recs++;        if (rc) {                CERROR("3a: write one log record failed: %d\n", rc);                RETURN(rc);        }        if ((rc = verify_handle("3a", llh, num_recs)))                RETURN(rc);        CWARN("3b: write 10 cfg log records with 8 bytes bufs\n");        for (i = 0; i < 10; i++) {                struct llog_rec_hdr hdr;                char buf[8];                hdr.lrh_len = 8;                hdr.lrh_type = OBD_CFG_REC;                memset(buf, 0, sizeof buf);                rc = llog_write_rec(llh, &hdr, NULL, 0, buf, -1);                if (rc) {                        CERROR("3b: write 10 records failed at #%d: %d\n",                               i + 1, rc);                        RETURN(rc);                }                num_recs++;                if ((rc = verify_handle("3c", llh, num_recs)))                        RETURN(rc);        }        if ((rc = verify_handle("3b", llh, num_recs)))                RETURN(rc);        CWARN("3c: write 1000 more log records\n");        for (i = 0; i < 1000; i++) {                rc = llog_write_rec(llh, &lcr.lcr_hdr, NULL, 0, NULL, -1);                if (rc) {                        CERROR("3c: write 1000 records failed at #%d: %d\n",                               i + 1, rc);                        RETURN(rc);                }                num_recs++;                if ((rc = verify_handle("3b", llh, num_recs)))                        RETURN(rc);        }        if ((rc = verify_handle("3c", llh, num_recs)))                RETURN(rc);        RETURN(rc);}/* Test catalogue additions */static int llog_test_4(struct obd_device *obd){        struct llog_handle *cath;        char name[10];        int rc, i, buflen;        struct llog_mini_rec lmr;        struct llog_cookie cookie;        struct llog_ctxt *ctxt = llog_get_context(obd, LLOG_TEST_ORIG_CTXT);        int num_recs = 0;        char *buf;        struct llog_rec_hdr rec;        ENTRY;        lmr.lmr_hdr.lrh_len = lmr.lmr_tail.lrt_len = LLOG_MIN_REC_SIZE;        lmr.lmr_hdr.lrh_type = 0xf00f00;        sprintf(name, "%x", llog_test_rand+1);        CWARN("4a: create a catalog log with name: %s\n", name);        rc = llog_create(ctxt, &cath, NULL, name);        if (rc) {                CERROR("1a: llog_create with name %s failed: %d\n", name, rc);                GOTO(out, rc);        }        llog_init_handle(cath, LLOG_F_IS_CAT, &uuid);        num_recs++;        cat_logid = cath->lgh_id;        CWARN("4b: write 1 record into the catalog\n");        rc = llog_cat_add_rec(cath, &lmr.lmr_hdr, &cookie, NULL);        if (rc != 1) {                CERROR("4b: write 1 catalog record failed at: %d\n", rc);                GOTO(out, rc);        }        num_recs++;        if ((rc = verify_handle("4b", cath, 2)))                GOTO(ctxt_release, rc);        if ((rc = verify_handle("4b", cath->u.chd.chd_current_log, num_recs)))                GOTO(ctxt_release, rc);        CWARN("4c: cancel 1 log record\n");        rc = llog_cat_cancel_records(cath, 1, &cookie);        if (rc) {                CERROR("4c: cancel 1 catalog based record failed: %d\n", rc);                GOTO(out, rc);        }        num_recs--;        if ((rc = verify_handle("4c", cath->u.chd.chd_current_log, num_recs)))                GOTO(ctxt_release, rc);        CWARN("4d: write 40,000 more log records\n");        for (i = 0; i < 40000; i++) {                rc = llog_cat_add_rec(cath, &lmr.lmr_hdr, NULL, NULL);                if (rc) {                        CERROR("4d: write 40000 records failed at #%d: %d\n",                               i + 1, rc);                        GOTO(out, rc);                }                num_recs++;        }        CWARN("4e: add 5 large records, one record per block\n");        buflen = LLOG_CHUNK_SIZE - sizeof(struct llog_rec_hdr)                        - sizeof(struct llog_rec_tail);        OBD_ALLOC(buf, buflen);        if (buf == NULL)                GOTO(out, rc = -ENOMEM);        for (i = 0; i < 5; i++) {                rec.lrh_len = buflen;                rec.lrh_type = OBD_CFG_REC;                rc = llog_cat_add_rec(cath, &rec, NULL, buf);                if (rc) {                        CERROR("4e: write 5 records failed at #%d: %d\n",                               i + 1, rc);                        OBD_FREE(buf, buflen);                        GOTO(out, rc);                }                num_recs++;        }        OBD_FREE(buf, buflen); out:        CWARN("4f: put newly-created catalog\n");        rc = llog_cat_put(cath);ctxt_release:        llog_ctxt_put(ctxt);        if (rc)                CERROR("1b: close log %s failed: %d\n", name, rc);        RETURN(rc);}static int cat_print_cb(struct llog_handle *llh, struct llog_rec_hdr *rec,                        void *data){        struct llog_logid_rec *lir = (struct llog_logid_rec *)rec;        if (rec->lrh_type != LLOG_LOGID_MAGIC) {                CERROR("invalid record in catalog\n");                RETURN(-EINVAL);        }        CWARN("seeing record at index %d - "LPX64":%x in log "LPX64"\n",               rec->lrh_index, lir->lid_id.lgl_oid,               lir->lid_id.lgl_ogen, llh->lgh_id.lgl_oid);        RETURN(0);}static int plain_print_cb(struct llog_handle *llh, struct llog_rec_hdr *rec,                          void *data){        if (!(llh->lgh_hdr->llh_flags & LLOG_F_IS_PLAIN)) {                CERROR("log is not plain\n");                RETURN(-EINVAL);        }        CWARN("seeing record at index %d in log "LPX64"\n",               rec->lrh_index, llh->lgh_id.lgl_oid);        RETURN(0);}static int llog_cancel_rec_cb(struct llog_handle *llh, struct llog_rec_hdr *rec,                              void *data){        struct llog_cookie cookie;        static int i = 0;        if (!(llh->lgh_hdr->llh_flags & LLOG_F_IS_PLAIN)) {                CERROR("log is not plain\n");

⌨️ 快捷键说明

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