670 lines
17 KiB
C
670 lines
17 KiB
C
/*-
|
|
* See the file LICENSE for redistribution information.
|
|
*
|
|
* Copyright (c) 1996,2007 Oracle. All rights reserved.
|
|
*
|
|
* $Id: env_stat.c,v 12.49 2007/05/17 17:17:59 bostic Exp $
|
|
*/
|
|
|
|
#include "db_config.h"
|
|
|
|
#include "db_int.h"
|
|
#include "dbinc/db_page.h"
|
|
#include "dbinc/db_am.h"
|
|
#include "dbinc/lock.h"
|
|
#include "dbinc/log.h"
|
|
#include "dbinc/mp.h"
|
|
#include "dbinc/txn.h"
|
|
|
|
#ifdef HAVE_STATISTICS
|
|
static int __env_print_all __P((DB_ENV *, u_int32_t));
|
|
static int __env_print_stats __P((DB_ENV *, u_int32_t));
|
|
static int __env_print_thread __P((DB_ENV *));
|
|
static int __env_stat_print __P((DB_ENV *, u_int32_t));
|
|
static char *__env_thread_state_print __P((DB_THREAD_STATE));
|
|
static const char *
|
|
__reg_type __P((reg_type_t));
|
|
|
|
/*
|
|
* __env_stat_print_pp --
|
|
* DB_ENV->stat_print pre/post processor.
|
|
*
|
|
* PUBLIC: int __env_stat_print_pp __P((DB_ENV *, u_int32_t));
|
|
*/
|
|
int
|
|
__env_stat_print_pp(dbenv, flags)
|
|
DB_ENV *dbenv;
|
|
u_int32_t flags;
|
|
{
|
|
DB_THREAD_INFO *ip;
|
|
int ret;
|
|
|
|
PANIC_CHECK(dbenv);
|
|
ENV_ILLEGAL_BEFORE_OPEN(dbenv, "DB_ENV->stat_print");
|
|
|
|
if ((ret = __db_fchk(dbenv, "DB_ENV->stat_print",
|
|
flags, DB_STAT_ALL | DB_STAT_CLEAR | DB_STAT_SUBSYSTEM)) != 0)
|
|
return (ret);
|
|
|
|
ENV_ENTER(dbenv, ip);
|
|
REPLICATION_WRAP(dbenv, (__env_stat_print(dbenv, flags)), ret);
|
|
ENV_LEAVE(dbenv, ip);
|
|
return (ret);
|
|
}
|
|
|
|
/*
|
|
* __env_stat_print --
|
|
* DB_ENV->stat_print method.
|
|
*/
|
|
static int
|
|
__env_stat_print(dbenv, flags)
|
|
DB_ENV *dbenv;
|
|
u_int32_t flags;
|
|
{
|
|
time_t now;
|
|
int ret;
|
|
char time_buf[CTIME_BUFLEN];
|
|
|
|
(void)time(&now);
|
|
__db_msg(dbenv, "%.24s\tLocal time", __db_ctime(&now, time_buf));
|
|
|
|
if ((ret = __env_print_stats(dbenv, flags)) != 0)
|
|
return (ret);
|
|
|
|
if (LF_ISSET(DB_STAT_ALL) &&
|
|
(ret = __env_print_all(dbenv, flags)) != 0)
|
|
return (ret);
|
|
|
|
if ((ret = __env_print_thread(dbenv)) != 0)
|
|
return (ret);
|
|
|
|
if (!LF_ISSET(DB_STAT_SUBSYSTEM))
|
|
return (0);
|
|
|
|
if (LOGGING_ON(dbenv)) {
|
|
__db_msg(dbenv, "%s", DB_GLOBAL(db_line));
|
|
if ((ret = __log_stat_print(dbenv, flags)) != 0)
|
|
return (ret);
|
|
|
|
__db_msg(dbenv, "%s", DB_GLOBAL(db_line));
|
|
if ((ret = __dbreg_stat_print(dbenv, flags)) != 0)
|
|
return (ret);
|
|
}
|
|
|
|
if (LOCKING_ON(dbenv)) {
|
|
__db_msg(dbenv, "%s", DB_GLOBAL(db_line));
|
|
if ((ret = __lock_stat_print(dbenv, flags)) != 0)
|
|
return (ret);
|
|
}
|
|
|
|
if (MPOOL_ON(dbenv)) {
|
|
__db_msg(dbenv, "%s", DB_GLOBAL(db_line));
|
|
if ((ret = __memp_stat_print(dbenv, flags)) != 0)
|
|
return (ret);
|
|
}
|
|
|
|
if (REP_ON(dbenv)) {
|
|
__db_msg(dbenv, "%s", DB_GLOBAL(db_line));
|
|
if ((ret = __rep_stat_print(dbenv, flags)) != 0)
|
|
return (ret);
|
|
}
|
|
|
|
if (TXN_ON(dbenv)) {
|
|
__db_msg(dbenv, "%s", DB_GLOBAL(db_line));
|
|
if ((ret = __txn_stat_print(dbenv, flags)) != 0)
|
|
return (ret);
|
|
}
|
|
|
|
#ifdef HAVE_MUTEX_SUPPORT
|
|
/*
|
|
* Dump the mutexes last. If DB_STAT_CLEAR is set this will
|
|
* clear out the mutex counters and we want to see them in
|
|
* the context of the other subsystems first.
|
|
*/
|
|
if (MUTEX_ON(dbenv)) {
|
|
__db_msg(dbenv, "%s", DB_GLOBAL(db_line));
|
|
if ((ret = __mutex_stat_print(dbenv, flags)) != 0)
|
|
return (ret);
|
|
}
|
|
#endif
|
|
|
|
return (0);
|
|
}
|
|
|
|
/*
|
|
* __env_print_stats --
|
|
* Display the default environment statistics.
|
|
*
|
|
*/
|
|
static int
|
|
__env_print_stats(dbenv, flags)
|
|
DB_ENV *dbenv;
|
|
u_int32_t flags;
|
|
{
|
|
REGENV *renv;
|
|
REGINFO *infop;
|
|
char time_buf[CTIME_BUFLEN];
|
|
|
|
infop = dbenv->reginfo;
|
|
renv = infop->primary;
|
|
|
|
if (LF_ISSET(DB_STAT_ALL)) {
|
|
__db_msg(dbenv, "%s", DB_GLOBAL(db_line));
|
|
__db_msg(dbenv, "Default database environment information:");
|
|
}
|
|
STAT_HEX("Magic number", renv->magic);
|
|
STAT_LONG("Panic value", renv->panic);
|
|
__db_msg(dbenv, "%d.%d.%d\tEnvironment version",
|
|
renv->majver, renv->minver, renv->patchver);
|
|
STAT_LONG("Btree version", DB_BTREEVERSION);
|
|
STAT_LONG("Hash version", DB_HASHVERSION);
|
|
STAT_LONG("Lock version", DB_LOCKVERSION);
|
|
STAT_LONG("Log version", DB_LOGVERSION);
|
|
STAT_LONG("Queue version", DB_QAMVERSION);
|
|
STAT_LONG("Sequence version", DB_SEQUENCE_VERSION);
|
|
STAT_LONG("Txn version", DB_TXNVERSION);
|
|
__db_msg(dbenv,
|
|
"%.24s\tCreation time", __db_ctime(&renv->timestamp, time_buf));
|
|
STAT_HEX("Environment ID", renv->envid);
|
|
__mutex_print_debug_single(dbenv,
|
|
"Primary region allocation and reference count mutex",
|
|
renv->mtx_regenv, flags);
|
|
STAT_LONG("References", renv->refcnt);
|
|
|
|
return (0);
|
|
}
|
|
|
|
/*
|
|
* __env_print_all --
|
|
* Display the debugging environment statistics.
|
|
*/
|
|
static int
|
|
__env_print_all(dbenv, flags)
|
|
DB_ENV *dbenv;
|
|
u_int32_t flags;
|
|
{
|
|
static const FN fn[] = {
|
|
{ DB_ENV_AUTO_COMMIT, "DB_ENV_AUTO_COMMIT" },
|
|
{ DB_ENV_CDB, "DB_ENV_CDB" },
|
|
{ DB_ENV_CDB_ALLDB, "DB_ENV_CDB_ALLDB" },
|
|
{ DB_ENV_DBLOCAL, "DB_ENV_DBLOCAL" },
|
|
{ DB_ENV_DIRECT_DB, "DB_ENV_DIRECT_DB" },
|
|
{ DB_ENV_DIRECT_LOG, "DB_ENV_DIRECT_LOG" },
|
|
{ DB_ENV_DSYNC_DB, "DB_ENV_DSYNC_DB" },
|
|
{ DB_ENV_DSYNC_LOG, "DB_ENV_DSYNC_LOG" },
|
|
{ DB_ENV_RECOVER_FATAL, "DB_ENV_RECOVER_FATAL" },
|
|
{ DB_ENV_LOCKDOWN, "DB_ENV_LOCKDOWN" },
|
|
{ DB_ENV_LOG_AUTOREMOVE, "DB_ENV_LOG_AUTOREMOVE" },
|
|
{ DB_ENV_LOG_INMEMORY, "DB_ENV_LOG_INMEMORY" },
|
|
{ DB_ENV_NOLOCKING, "DB_ENV_NOLOCKING" },
|
|
{ DB_ENV_NOMMAP, "DB_ENV_NOMMAP" },
|
|
{ DB_ENV_NOPANIC, "DB_ENV_NOPANIC" },
|
|
{ DB_ENV_OPEN_CALLED, "DB_ENV_OPEN_CALLED" },
|
|
{ DB_ENV_OVERWRITE, "DB_ENV_OVERWRITE" },
|
|
{ DB_ENV_PRIVATE, "DB_ENV_PRIVATE" },
|
|
{ DB_ENV_REGION_INIT, "DB_ENV_REGION_INIT" },
|
|
{ DB_ENV_RPCCLIENT, "DB_ENV_RPCCLIENT" },
|
|
{ DB_ENV_RPCCLIENT_GIVEN, "DB_ENV_RPCCLIENT_GIVEN" },
|
|
{ DB_ENV_SYSTEM_MEM, "DB_ENV_SYSTEM_MEM" },
|
|
{ DB_ENV_THREAD, "DB_ENV_THREAD" },
|
|
{ DB_ENV_TIME_NOTGRANTED, "DB_ENV_TIME_NOTGRANTED" },
|
|
{ DB_ENV_TXN_NOSYNC, "DB_ENV_TXN_NOSYNC" },
|
|
{ DB_ENV_TXN_NOWAIT, "DB_ENV_TXN_NOWAIT" },
|
|
{ DB_ENV_TXN_WRITE_NOSYNC, "DB_ENV_TXN_WRITE_NOSYNC" },
|
|
{ DB_ENV_YIELDCPU, "DB_ENV_YIELDCPU" },
|
|
{ 0, NULL }
|
|
};
|
|
static const FN ofn[] = {
|
|
{ DB_CREATE, "DB_CREATE" },
|
|
{ DB_FORCE, "DB_FORCE" },
|
|
{ DB_INIT_CDB, "DB_INIT_CDB" },
|
|
{ DB_INIT_LOCK, "DB_INIT_LOCK" },
|
|
{ DB_INIT_LOG, "DB_INIT_LOG" },
|
|
{ DB_INIT_MPOOL, "DB_INIT_MPOOL" },
|
|
{ DB_INIT_REP, "DB_INIT_REP" },
|
|
{ DB_INIT_TXN, "DB_INIT_TXN" },
|
|
{ DB_LOCKDOWN, "DB_LOCKDOWN" },
|
|
{ DB_NOMMAP, "DB_NOMMAP" },
|
|
{ DB_PRIVATE, "DB_PRIVATE" },
|
|
{ DB_RDONLY, "DB_RDONLY" },
|
|
{ DB_RECOVER, "DB_RECOVER" },
|
|
{ DB_RECOVER_FATAL, "DB_RECOVER_FATAL" },
|
|
{ DB_SYSTEM_MEM, "DB_SYSTEM_MEM" },
|
|
{ DB_THREAD, "DB_THREAD" },
|
|
{ DB_TRUNCATE, "DB_TRUNCATE" },
|
|
{ DB_TXN_NOSYNC, "DB_TXN_NOSYNC" },
|
|
{ DB_USE_ENVIRON, "DB_USE_ENVIRON" },
|
|
{ DB_USE_ENVIRON_ROOT, "DB_USE_ENVIRON_ROOT" },
|
|
{ 0, NULL }
|
|
};
|
|
static const FN vfn[] = {
|
|
{ DB_VERB_DEADLOCK, "DB_VERB_DEADLOCK" },
|
|
{ DB_VERB_FILEOPS, "DB_VERB_FILEOPS" },
|
|
{ DB_VERB_FILEOPS_ALL, "DB_VERB_FILEOPS_ALL" },
|
|
{ DB_VERB_RECOVERY, "DB_VERB_RECOVERY" },
|
|
{ DB_VERB_REGISTER, "DB_VERB_REGISTER" },
|
|
{ DB_VERB_REPLICATION, "DB_VERB_REPLICATION" },
|
|
{ DB_VERB_WAITSFOR, "DB_VERB_WAITSFOR" },
|
|
{ 0, NULL }
|
|
};
|
|
static const FN regenvfn[] = {
|
|
{ DB_REGENV_REPLOCKED, "DB_REGENV_REPLOCKED" },
|
|
{ 0, NULL }
|
|
};
|
|
DB_MSGBUF mb;
|
|
REGENV *renv;
|
|
REGINFO *infop;
|
|
REGION *rp;
|
|
u_int32_t i;
|
|
char **p, time_buf[CTIME_BUFLEN];
|
|
|
|
infop = dbenv->reginfo;
|
|
renv = infop->primary;
|
|
DB_MSGBUF_INIT(&mb);
|
|
|
|
__db_msg(dbenv, "%s", DB_GLOBAL(db_line));
|
|
__db_prflags(dbenv,
|
|
NULL, renv->init_flags, ofn, NULL, "\tInitialization flags");
|
|
STAT_ULONG("Region slots", renv->region_cnt);
|
|
__db_prflags(dbenv,
|
|
NULL, renv->flags, regenvfn, NULL, "\tReplication flags");
|
|
__db_msg(dbenv, "%.24s\tOperation timestamp",
|
|
renv->op_timestamp == 0 ?
|
|
"!Set" : __db_ctime(&renv->op_timestamp, time_buf));
|
|
__db_msg(dbenv, "%.24s\tReplication timestamp",
|
|
renv->rep_timestamp == 0 ?
|
|
"!Set" : __db_ctime(&renv->rep_timestamp, time_buf));
|
|
|
|
__db_msg(dbenv, "%s", DB_GLOBAL(db_line));
|
|
__db_msg(dbenv, "Per region database environment information:");
|
|
for (rp = R_ADDR(infop, renv->region_off),
|
|
i = 0; i < renv->region_cnt; ++i, ++rp) {
|
|
if (rp->id == INVALID_REGION_ID)
|
|
continue;
|
|
__db_msg(dbenv, "%s Region:", __reg_type(rp->type));
|
|
STAT_LONG("Region ID", rp->id);
|
|
STAT_LONG("Segment ID", rp->segid);
|
|
__db_dlbytes(dbenv,
|
|
"Size", (u_long)0, (u_long)0, (u_long)rp->size);
|
|
}
|
|
|
|
__db_msg(dbenv, "%s", DB_GLOBAL(db_line));
|
|
__db_msg(dbenv, "DB_ENV handle information:");
|
|
STAT_ISSET("Errfile", dbenv->db_errfile);
|
|
STAT_STRING("Errpfx", dbenv->db_errpfx);
|
|
STAT_ISSET("Errcall", dbenv->db_errcall);
|
|
STAT_ISSET("Event", dbenv->db_event_func);
|
|
STAT_ISSET("Feedback", dbenv->db_feedback);
|
|
STAT_ISSET("Panic", dbenv->db_paniccall);
|
|
STAT_ISSET("Malloc", dbenv->db_malloc);
|
|
STAT_ISSET("Realloc", dbenv->db_realloc);
|
|
STAT_ISSET("Free", dbenv->db_free);
|
|
__db_prflags(dbenv, NULL, dbenv->verbose, vfn, NULL, "\tVerbose flags");
|
|
|
|
STAT_ISSET("App private", dbenv->app_private);
|
|
STAT_ISSET("App dispatch", dbenv->app_dispatch);
|
|
STAT_STRING("Home", dbenv->db_home);
|
|
STAT_STRING("Log dir", dbenv->db_log_dir);
|
|
STAT_STRING("Tmp dir", dbenv->db_tmp_dir);
|
|
if (dbenv->db_data_dir == NULL)
|
|
STAT_ISSET("Data dir", dbenv->db_data_dir);
|
|
else {
|
|
for (p = dbenv->db_data_dir; *p != NULL; ++p)
|
|
__db_msgadd(dbenv, &mb, "%s\tData dir", *p);
|
|
DB_MSGBUF_FLUSH(dbenv, &mb);
|
|
}
|
|
STAT_FMT("Mode", "%#o", int, dbenv->db_mode);
|
|
__db_prflags(dbenv, NULL, dbenv->open_flags, ofn, NULL, "\tOpen flags");
|
|
STAT_ISSET("Lockfhp", dbenv->lockfhp);
|
|
STAT_ISSET("Recovery table", dbenv->recover_dtab);
|
|
STAT_ULONG("Number of recovery table slots", dbenv->recover_dtab_size);
|
|
STAT_ISSET("RPC client", dbenv->cl_handle);
|
|
STAT_LONG("RPC client ID", dbenv->cl_id);
|
|
STAT_LONG("DB reference count", dbenv->db_ref);
|
|
STAT_LONG("Shared memory key", dbenv->shm_key);
|
|
__mutex_print_debug_single(
|
|
dbenv, "DB_ENV handle mutex", dbenv->mtx_env, flags);
|
|
__mutex_print_debug_single(
|
|
dbenv, "DB handle mutex", dbenv->mtx_dblist, flags);
|
|
|
|
STAT_ISSET("api1 internal", dbenv->api1_internal);
|
|
STAT_ISSET("api2 internal", dbenv->api2_internal);
|
|
STAT_ISSET("password", dbenv->passwd);
|
|
STAT_ISSET("crypto handle", dbenv->crypto_handle);
|
|
__mutex_print_debug_single(dbenv, "MT mutex", dbenv->mtx_mt, flags);
|
|
|
|
__db_prflags(dbenv, NULL, dbenv->flags, fn, NULL, "\tFlags");
|
|
|
|
return (0);
|
|
}
|
|
|
|
static char *
|
|
__env_thread_state_print(state)
|
|
DB_THREAD_STATE state;
|
|
{
|
|
switch (state) {
|
|
case THREAD_ACTIVE:
|
|
return ("active");
|
|
case THREAD_BLOCKED:
|
|
return ("blocked");
|
|
case THREAD_OUT:
|
|
return ("out");
|
|
default:
|
|
return ("unknown");
|
|
}
|
|
/* NOTREACHED */
|
|
}
|
|
|
|
/*
|
|
* __env_print_thread --
|
|
* Display the thread block state.
|
|
*/
|
|
static int
|
|
__env_print_thread(dbenv)
|
|
DB_ENV *dbenv;
|
|
{
|
|
DB_HASHTAB *htab;
|
|
DB_THREAD_INFO *ip;
|
|
REGENV *renv;
|
|
REGINFO *infop;
|
|
THREAD_INFO *thread;
|
|
u_int32_t i;
|
|
char buf[DB_THREADID_STRLEN];
|
|
|
|
/* The thread table may not be configured. */
|
|
if ((htab = (DB_HASHTAB *)dbenv->thr_hashtab) == NULL)
|
|
return (0);
|
|
|
|
/* Dump out the info we have on thread tracking. */
|
|
infop = dbenv->reginfo;
|
|
renv = infop->primary;
|
|
thread = R_ADDR(infop, renv->thread_off);
|
|
STAT_ULONG("Thread blocks allocated", thread->thr_count);
|
|
STAT_ULONG("Thread allocation threshold", thread->thr_max);
|
|
STAT_ULONG("Thread hash buckets", thread->thr_nbucket);
|
|
|
|
/* Dump out the info we have on active threads. */
|
|
__db_msg(dbenv, "Thread status blocks:");
|
|
for (i = 0; i < dbenv->thr_nbucket; i++)
|
|
SH_TAILQ_FOREACH(ip, &htab[i], dbth_links, __db_thread_info) {
|
|
if (ip->dbth_state == THREAD_SLOT_NOT_IN_USE)
|
|
continue;
|
|
__db_msg(dbenv, "\tprocess/thread %s: %s",
|
|
dbenv->thread_id_string(
|
|
dbenv, ip->dbth_pid, ip->dbth_tid, buf),
|
|
__env_thread_state_print(ip->dbth_state));
|
|
}
|
|
return (0);
|
|
}
|
|
|
|
/*
|
|
* __db_print_fh --
|
|
* Print out a file handle.
|
|
*
|
|
* PUBLIC: void __db_print_fh __P((DB_ENV *, const char *, DB_FH *, u_int32_t));
|
|
*/
|
|
void
|
|
__db_print_fh(dbenv, tag, fh, flags)
|
|
DB_ENV *dbenv;
|
|
const char *tag;
|
|
DB_FH *fh;
|
|
u_int32_t flags;
|
|
{
|
|
static const FN fn[] = {
|
|
{ DB_FH_NOSYNC, "DB_FH_NOSYNC" },
|
|
{ DB_FH_OPENED, "DB_FH_OPENED" },
|
|
{ DB_FH_UNLINK, "DB_FH_UNLINK" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
if (fh == NULL) {
|
|
STAT_ISSET(tag, fh);
|
|
return;
|
|
}
|
|
|
|
__mutex_print_debug_single(
|
|
dbenv, "file-handle.mutex", fh->mtx_fh, flags);
|
|
|
|
STAT_LONG("file-handle.reference count", fh->ref);
|
|
STAT_LONG("file-handle.file descriptor", fh->fd);
|
|
STAT_STRING("file-handle.file name", fh->name);
|
|
|
|
STAT_ULONG("file-handle.page number", fh->pgno);
|
|
STAT_ULONG("file-handle.page size", fh->pgsize);
|
|
STAT_ULONG("file-handle.page offset", fh->offset);
|
|
|
|
__db_prflags(dbenv, NULL, fh->flags, fn, NULL, "\tfile-handle.flags");
|
|
}
|
|
|
|
/*
|
|
* __db_print_fileid --
|
|
* Print out a file ID.
|
|
*
|
|
* PUBLIC: void __db_print_fileid __P((DB_ENV *, u_int8_t *, const char *));
|
|
*/
|
|
void
|
|
__db_print_fileid(dbenv, id, suffix)
|
|
DB_ENV *dbenv;
|
|
u_int8_t *id;
|
|
const char *suffix;
|
|
{
|
|
DB_MSGBUF mb;
|
|
int i;
|
|
|
|
if (id == NULL) {
|
|
STAT_ISSET("ID", id);
|
|
return;
|
|
}
|
|
|
|
DB_MSGBUF_INIT(&mb);
|
|
for (i = 0; i < DB_FILE_ID_LEN; ++i, ++id) {
|
|
__db_msgadd(dbenv, &mb, "%x", (u_int)*id);
|
|
if (i < DB_FILE_ID_LEN - 1)
|
|
__db_msgadd(dbenv, &mb, " ");
|
|
}
|
|
if (suffix != NULL)
|
|
__db_msgadd(dbenv, &mb, "%s", suffix);
|
|
DB_MSGBUF_FLUSH(dbenv, &mb);
|
|
}
|
|
|
|
/*
|
|
* __db_dl --
|
|
* Display a big value.
|
|
*
|
|
* PUBLIC: void __db_dl __P((DB_ENV *, const char *, u_long));
|
|
*/
|
|
void
|
|
__db_dl(dbenv, msg, value)
|
|
DB_ENV *dbenv;
|
|
const char *msg;
|
|
u_long value;
|
|
{
|
|
/*
|
|
* Two formats: if less than 10 million, display as the number, if
|
|
* greater than 10 million display as ###M.
|
|
*/
|
|
if (value < 10000000)
|
|
__db_msg(dbenv, "%lu\t%s", value, msg);
|
|
else
|
|
__db_msg(dbenv, "%luM\t%s (%lu)", value / 1000000, msg, value);
|
|
}
|
|
|
|
/*
|
|
* __db_dl_pct --
|
|
* Display a big value, and related percentage.
|
|
*
|
|
* PUBLIC: void __db_dl_pct
|
|
* PUBLIC: __P((DB_ENV *, const char *, u_long, int, const char *));
|
|
*/
|
|
void
|
|
__db_dl_pct(dbenv, msg, value, pct, tag)
|
|
DB_ENV *dbenv;
|
|
const char *msg, *tag;
|
|
u_long value;
|
|
int pct;
|
|
{
|
|
DB_MSGBUF mb;
|
|
|
|
DB_MSGBUF_INIT(&mb);
|
|
|
|
/*
|
|
* Two formats: if less than 10 million, display as the number, if
|
|
* greater than 10 million, round it off and display as ###M.
|
|
*/
|
|
if (value < 10000000)
|
|
__db_msgadd(dbenv, &mb, "%lu\t%s", value, msg);
|
|
else
|
|
__db_msgadd(dbenv,
|
|
&mb, "%luM\t%s", (value + 500000) / 1000000, msg);
|
|
if (tag == NULL)
|
|
__db_msgadd(dbenv, &mb, " (%d%%)", pct);
|
|
else
|
|
__db_msgadd(dbenv, &mb, " (%d%% %s)", pct, tag);
|
|
|
|
DB_MSGBUF_FLUSH(dbenv, &mb);
|
|
}
|
|
|
|
/*
|
|
* __db_dlbytes --
|
|
* Display a big number of bytes.
|
|
*
|
|
* PUBLIC: void __db_dlbytes
|
|
* PUBLIC: __P((DB_ENV *, const char *, u_long, u_long, u_long));
|
|
*/
|
|
void
|
|
__db_dlbytes(dbenv, msg, gbytes, mbytes, bytes)
|
|
DB_ENV *dbenv;
|
|
const char *msg;
|
|
u_long gbytes, mbytes, bytes;
|
|
{
|
|
DB_MSGBUF mb;
|
|
const char *sep;
|
|
|
|
DB_MSGBUF_INIT(&mb);
|
|
|
|
/* Normalize the values. */
|
|
while (bytes >= MEGABYTE) {
|
|
++mbytes;
|
|
bytes -= MEGABYTE;
|
|
}
|
|
while (mbytes >= GIGABYTE / MEGABYTE) {
|
|
++gbytes;
|
|
mbytes -= GIGABYTE / MEGABYTE;
|
|
}
|
|
|
|
if (gbytes == 0 && mbytes == 0 && bytes == 0)
|
|
__db_msgadd(dbenv, &mb, "0");
|
|
else {
|
|
sep = "";
|
|
if (gbytes > 0) {
|
|
__db_msgadd(dbenv, &mb, "%luGB", gbytes);
|
|
sep = " ";
|
|
}
|
|
if (mbytes > 0) {
|
|
__db_msgadd(dbenv, &mb, "%s%luMB", sep, mbytes);
|
|
sep = " ";
|
|
}
|
|
if (bytes >= 1024) {
|
|
__db_msgadd(dbenv, &mb, "%s%luKB", sep, bytes / 1024);
|
|
bytes %= 1024;
|
|
sep = " ";
|
|
}
|
|
if (bytes > 0)
|
|
__db_msgadd(dbenv, &mb, "%s%luB", sep, bytes);
|
|
}
|
|
|
|
__db_msgadd(dbenv, &mb, "\t%s", msg);
|
|
|
|
DB_MSGBUF_FLUSH(dbenv, &mb);
|
|
}
|
|
|
|
/*
|
|
* __db_print_reginfo --
|
|
* Print out underlying shared region information.
|
|
*
|
|
* PUBLIC: void __db_print_reginfo
|
|
* PUBLIC: __P((DB_ENV *, REGINFO *, const char *, u_int32_t));
|
|
*/
|
|
void
|
|
__db_print_reginfo(dbenv, infop, s, flags)
|
|
DB_ENV *dbenv;
|
|
REGINFO *infop;
|
|
const char *s;
|
|
u_int32_t flags;
|
|
{
|
|
static const FN fn[] = {
|
|
{ REGION_CREATE, "REGION_CREATE" },
|
|
{ REGION_CREATE_OK, "REGION_CREATE_OK" },
|
|
{ REGION_JOIN_OK, "REGION_JOIN_OK" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
__db_msg(dbenv, "%s", DB_GLOBAL(db_line));
|
|
__db_msg(dbenv, "%s REGINFO information:", s);
|
|
STAT_STRING("Region type", __reg_type(infop->type));
|
|
STAT_ULONG("Region ID", infop->id);
|
|
STAT_STRING("Region name", infop->name);
|
|
STAT_POINTER("Original region address", infop->addr_orig);
|
|
STAT_POINTER("Region address", infop->addr);
|
|
STAT_POINTER("Region primary address", infop->primary);
|
|
STAT_ULONG("Region maximum allocation", infop->max_alloc);
|
|
STAT_ULONG("Region allocated", infop->allocated);
|
|
__env_alloc_print(infop, flags);
|
|
|
|
__db_prflags(dbenv, NULL, infop->flags, fn, NULL, "\tRegion flags");
|
|
}
|
|
|
|
/*
|
|
* __reg_type --
|
|
* Return the region type string.
|
|
*/
|
|
static const char *
|
|
__reg_type(t)
|
|
reg_type_t t;
|
|
{
|
|
switch (t) {
|
|
case REGION_TYPE_ENV:
|
|
return ("Environment");
|
|
case REGION_TYPE_LOCK:
|
|
return ("Lock");
|
|
case REGION_TYPE_LOG:
|
|
return ("Log");
|
|
case REGION_TYPE_MPOOL:
|
|
return ("Mpool");
|
|
case REGION_TYPE_MUTEX:
|
|
return ("Mutex");
|
|
case REGION_TYPE_TXN:
|
|
return ("Transaction");
|
|
case INVALID_REGION_TYPE:
|
|
return ("Invalid");
|
|
}
|
|
return ("Unknown");
|
|
}
|
|
|
|
#else /* !HAVE_STATISTICS */
|
|
|
|
/*
|
|
* __db_stat_not_built --
|
|
* Common error routine when library not built with statistics.
|
|
*
|
|
* PUBLIC: int __db_stat_not_built __P((DB_ENV *));
|
|
*/
|
|
int
|
|
__db_stat_not_built(dbenv)
|
|
DB_ENV *dbenv;
|
|
{
|
|
__db_errx(dbenv, "Library build did not include statistics support");
|
|
return (DB_OPNOTSUP);
|
|
}
|
|
|
|
int
|
|
__env_stat_print_pp(dbenv, flags)
|
|
DB_ENV *dbenv;
|
|
u_int32_t flags;
|
|
{
|
|
COMPQUIET(flags, 0);
|
|
|
|
return (__db_stat_not_built(dbenv));
|
|
}
|
|
#endif
|