1/*- 2 * See the file LICENSE for redistribution information. 3 * 4 * Copyright (c) 1997-2009 Oracle. All rights reserved. 5 * 6 * $Id$ 7 */ 8 9#include "db_config.h" 10 11#include "db_int.h" 12#include "dbinc/db_page.h" 13#include "dbinc/db_am.h" 14#include "dbinc/log.h" 15#include "dbinc/txn.h" 16 17#ifdef HAVE_STATISTICS 18static int __dbreg_print_all __P((ENV *, u_int32_t)); 19 20/* 21 * __dbreg_stat_print -- 22 * Print the dbreg statistics. 23 * 24 * PUBLIC: int __dbreg_stat_print __P((ENV *, u_int32_t)); 25 */ 26int 27__dbreg_stat_print(env, flags) 28 ENV *env; 29 u_int32_t flags; 30{ 31 int ret; 32 33 if (LF_ISSET(DB_STAT_ALL) && 34 (ret = __dbreg_print_all(env, flags)) != 0) 35 return (ret); 36 37 return (0); 38} 39 40/* 41 * __dbreg_print_fname -- 42 * Display the contents of an FNAME structure. 43 * 44 * PUBLIC: void __dbreg_print_fname __P((ENV *, FNAME *)); 45 */ 46void 47__dbreg_print_fname(env, fnp) 48 ENV *env; 49 FNAME *fnp; 50{ 51 static const FN fn[] = { 52 { DB_FNAME_DURABLE, "DB_FNAME_DURABLE" }, 53 { DB_FNAME_NOTLOGGED, "DB_FNAME_NOTLOGGED" }, 54 { 0, NULL } 55 }; 56 57 __db_msg(env, "%s", DB_GLOBAL(db_line)); 58 __db_msg(env, "DB handle FNAME contents:"); 59 STAT_LONG("log ID", fnp->id); 60 STAT_ULONG("Meta pgno", fnp->meta_pgno); 61 __db_print_fileid(env, fnp->ufid, "\tFile ID"); 62 STAT_ULONG("create txn", fnp->create_txnid); 63 __db_prflags(env, NULL, fnp->flags, fn, NULL, "\tFlags"); 64} 65 66/* 67 * __dbreg_print_all -- 68 * Display the ENV's list of files. 69 */ 70static int 71__dbreg_print_all(env, flags) 72 ENV *env; 73 u_int32_t flags; 74{ 75 DB *dbp; 76 DB_LOG *dblp; 77 FNAME *fnp; 78 LOG *lp; 79 int32_t *stack; 80 int del, first; 81 u_int32_t i; 82 83 dblp = env->lg_handle; 84 lp = dblp->reginfo.primary; 85 86 __db_msg(env, "LOG FNAME list:"); 87 __mutex_print_debug_single( 88 env, "File name mutex", lp->mtx_filelist, flags); 89 90 STAT_LONG("Fid max", lp->fid_max); 91 STAT_LONG("Log buffer size", lp->buffer_size); 92 93 MUTEX_LOCK(env, lp->mtx_filelist); 94 first = 1; 95 SH_TAILQ_FOREACH(fnp, &lp->fq, q, __fname) { 96 if (first) { 97 first = 0; 98 __db_msg(env, 99 "ID\tName\t\tType\tPgno\tPid\tTxnid\tFlags\tDBP-info"); 100 } 101 dbp = fnp->id >= dblp->dbentry_cnt ? NULL : 102 dblp->dbentry[fnp->id].dbp; 103 del = fnp->id >= dblp->dbentry_cnt ? 0 : 104 dblp->dbentry[fnp->id].deleted; 105 __db_msg(env, 106 "%ld\t%-8s%s%-8s%s\t%lu\t%lu\t%lx\t%lx\t%s (%d %lx %lx)", 107 (long)fnp->id, 108 fnp->fname_off == INVALID_ROFF ? 109 "" : (char *)R_ADDR(&dblp->reginfo, fnp->fname_off), 110 fnp->dname_off == INVALID_ROFF ? "" : ":", 111 fnp->dname_off == INVALID_ROFF ? 112 "" : (char *)R_ADDR(&dblp->reginfo, fnp->dname_off), 113 __db_dbtype_to_string(fnp->s_type), 114 (u_long)fnp->meta_pgno, (u_long)fnp->pid, 115 (u_long)fnp->create_txnid, (u_long)fnp->flags, 116 dbp == NULL ? "No DBP" : "DBP", del, P_TO_ULONG(dbp), 117 (u_long)(dbp == NULL ? 0 : dbp->flags)); 118 } 119 MUTEX_UNLOCK(env, lp->mtx_filelist); 120 121 __db_msg(env, "%s", DB_GLOBAL(db_line)); 122 __db_msg(env, "LOG region list of free IDs."); 123 if (lp->free_fid_stack == INVALID_ROFF) 124 __db_msg(env, "Free id stack is empty."); 125 else { 126 STAT_ULONG("Free id array size", lp->free_fids_alloced); 127 STAT_ULONG("Number of ids on the free stack", lp->free_fids); 128 stack = R_ADDR(&dblp->reginfo, lp->free_fid_stack); 129 for (i = 0; i < lp->free_fids; i++) 130 STAT_LONG("fid", stack[i]); 131 } 132 133 return (0); 134} 135#endif 136