2 * See the file LICENSE for redistribution information.
4 * Copyright (c) 1999-2009 Oracle. All rights reserved.
12 #include "dbinc/log.h"
16 * Log specific initialization of the DB_ENV structure.
18 * PUBLIC: int __log_env_create __P((DB_ENV *));
21 __log_env_create(dbenv)
26 * Our caller has not yet had the opportunity to reset the panic
27 * state or turn off mutex locking, and so we can neither check
28 * the panic state or acquire a mutex in the DB_ENV create path.
31 dbenv->lg_regionmax = LG_BASE_REGION_SIZE;
37 * __log_env_destroy --
38 * Log specific destruction of the DB_ENV structure.
40 * PUBLIC: void __log_env_destroy __P((DB_ENV *));
43 __log_env_destroy(dbenv)
46 COMPQUIET(dbenv, NULL);
50 * PUBLIC: int __log_get_lg_bsize __P((DB_ENV *, u_int32_t *));
53 __log_get_lg_bsize(dbenv, lg_bsizep)
61 ENV_NOT_CONFIGURED(env,
62 env->lg_handle, "DB_ENV->get_lg_bsize", DB_INIT_LOG);
64 if (LOGGING_ON(env)) {
65 /* Cannot be set after open, no lock required to read. */
67 ((LOG *)env->lg_handle->reginfo.primary)->buffer_size;
69 *lg_bsizep = dbenv->lg_bsize;
74 * __log_set_lg_bsize --
75 * DB_ENV->set_lg_bsize.
77 * PUBLIC: int __log_set_lg_bsize __P((DB_ENV *, u_int32_t));
80 __log_set_lg_bsize(dbenv, lg_bsize)
88 ENV_ILLEGAL_AFTER_OPEN(env, "DB_ENV->set_lg_bsize");
90 dbenv->lg_bsize = lg_bsize;
95 * PUBLIC: int __log_get_lg_filemode __P((DB_ENV *, int *));
98 __log_get_lg_filemode(dbenv, lg_modep)
108 ENV_NOT_CONFIGURED(env,
109 env->lg_handle, "DB_ENV->get_lg_filemode", DB_INIT_LOG);
111 if (LOGGING_ON(env)) {
112 dblp = env->lg_handle;
114 LOG_SYSTEM_LOCK(env);
115 *lg_modep = ((LOG *)dblp->reginfo.primary)->filemode;
116 LOG_SYSTEM_UNLOCK(env);
119 *lg_modep = dbenv->lg_filemode;
125 * __log_set_lg_filemode --
126 * DB_ENV->set_lg_filemode.
128 * PUBLIC: int __log_set_lg_filemode __P((DB_ENV *, int));
131 __log_set_lg_filemode(dbenv, lg_mode)
142 ENV_NOT_CONFIGURED(env,
143 env->lg_handle, "DB_ENV->set_lg_filemode", DB_INIT_LOG);
145 if (LOGGING_ON(env)) {
146 dblp = env->lg_handle;
147 lp = dblp->reginfo.primary;
149 LOG_SYSTEM_LOCK(env);
150 lp->filemode = lg_mode;
151 LOG_SYSTEM_UNLOCK(env);
154 dbenv->lg_filemode = lg_mode;
160 * PUBLIC: int __log_get_lg_max __P((DB_ENV *, u_int32_t *));
163 __log_get_lg_max(dbenv, lg_maxp)
173 ENV_NOT_CONFIGURED(env,
174 env->lg_handle, "DB_ENV->get_lg_max", DB_INIT_LOG);
176 if (LOGGING_ON(env)) {
177 dblp = env->lg_handle;
179 LOG_SYSTEM_LOCK(env);
180 *lg_maxp = ((LOG *)dblp->reginfo.primary)->log_nsize;
181 LOG_SYSTEM_UNLOCK(env);
184 *lg_maxp = dbenv->lg_size;
190 * __log_set_lg_max --
191 * DB_ENV->set_lg_max.
193 * PUBLIC: int __log_set_lg_max __P((DB_ENV *, u_int32_t));
196 __log_set_lg_max(dbenv, lg_max)
209 ENV_NOT_CONFIGURED(env,
210 env->lg_handle, "DB_ENV->set_lg_max", DB_INIT_LOG);
212 if (LOGGING_ON(env)) {
213 dblp = env->lg_handle;
214 lp = dblp->reginfo.primary;
216 if ((ret = __log_check_sizes(env, lg_max, 0)) == 0) {
217 LOG_SYSTEM_LOCK(env);
218 lp->log_nsize = lg_max;
219 LOG_SYSTEM_UNLOCK(env);
223 dbenv->lg_size = lg_max;
229 * PUBLIC: int __log_get_lg_regionmax __P((DB_ENV *, u_int32_t *));
232 __log_get_lg_regionmax(dbenv, lg_regionmaxp)
234 u_int32_t *lg_regionmaxp;
240 ENV_NOT_CONFIGURED(env,
241 env->lg_handle, "DB_ENV->get_lg_regionmax", DB_INIT_LOG);
243 if (LOGGING_ON(env)) {
244 /* Cannot be set after open, no lock required to read. */
246 ((LOG *)env->lg_handle->reginfo.primary)->regionmax;
248 *lg_regionmaxp = dbenv->lg_regionmax;
253 * __log_set_lg_regionmax --
254 * DB_ENV->set_lg_regionmax.
256 * PUBLIC: int __log_set_lg_regionmax __P((DB_ENV *, u_int32_t));
259 __log_set_lg_regionmax(dbenv, lg_regionmax)
261 u_int32_t lg_regionmax;
267 ENV_ILLEGAL_AFTER_OPEN(env, "DB_ENV->set_lg_regionmax");
269 /* Let's not be silly. */
270 if (lg_regionmax != 0 && lg_regionmax < LG_BASE_REGION_SIZE) {
272 "log region size must be >= %d", LG_BASE_REGION_SIZE);
276 dbenv->lg_regionmax = lg_regionmax;
281 * PUBLIC: int __log_get_lg_dir __P((DB_ENV *, const char **));
284 __log_get_lg_dir(dbenv, dirp)
288 *dirp = dbenv->db_log_dir;
293 * __log_set_lg_dir --
294 * DB_ENV->set_lg_dir.
296 * PUBLIC: int __log_set_lg_dir __P((DB_ENV *, const char *));
299 __log_set_lg_dir(dbenv, dir)
307 if (dbenv->db_log_dir != NULL)
308 __os_free(env, dbenv->db_log_dir);
309 return (__os_strdup(env, dir, &dbenv->db_log_dir));
316 * PUBLIC: void __log_get_flags __P((DB_ENV *, u_int32_t *));
319 __log_get_flags(dbenv, flagsp)
330 if ((dblp = env->lg_handle) == NULL)
333 lp = dblp->reginfo.primary;
336 if (lp->db_log_autoremove)
337 LF_SET(DB_LOG_AUTO_REMOVE);
339 LF_CLR(DB_LOG_AUTO_REMOVE);
340 if (lp->db_log_inmemory)
341 LF_SET(DB_LOG_IN_MEMORY);
343 LF_CLR(DB_LOG_IN_MEMORY);
351 * PUBLIC: void __log_set_flags __P((ENV *, u_int32_t, int));
354 __log_set_flags(env, flags, on)
362 if ((dblp = env->lg_handle) == NULL)
365 lp = dblp->reginfo.primary;
367 if (LF_ISSET(DB_LOG_AUTO_REMOVE))
368 lp->db_log_autoremove = on ? 1 : 0;
369 if (LF_ISSET(DB_LOG_IN_MEMORY))
370 lp->db_log_inmemory = on ? 1 : 0;
374 * List of flags we can handle here. DB_LOG_INMEMORY must be
375 * processed before creating the region, leave it out for now.
379 (DB_LOG_AUTO_REMOVE | DB_LOG_DIRECT | \
380 DB_LOG_DSYNC | DB_LOG_IN_MEMORY | DB_LOG_ZERO)
384 const FLAG_MAP LogMap[] = {
385 { DB_LOG_AUTO_REMOVE, DBLOG_AUTOREMOVE},
386 { DB_LOG_DIRECT, DBLOG_DIRECT},
387 { DB_LOG_DSYNC, DBLOG_DSYNC},
388 { DB_LOG_IN_MEMORY, DBLOG_INMEMORY},
389 { DB_LOG_ZERO, DBLOG_ZERO}
392 * __log_get_config --
393 * Configure the logging subsystem.
395 * PUBLIC: int __log_get_config __P((DB_ENV *, u_int32_t, int *));
398 __log_get_config(dbenv, which, onp)
408 if (FLD_ISSET(which, ~OK_FLAGS))
409 return (__db_ferr(env, "DB_ENV->log_get_config", 0));
410 dblp = env->lg_handle;
411 ENV_REQUIRES_CONFIG(env, dblp, "DB_ENV->log_get_config", DB_INIT_LOG);
413 __env_fetch_flags(LogMap, sizeof(LogMap), &dblp->flags, &flags);
414 __log_get_flags(dbenv, &flags);
424 * __log_set_config --
425 * Configure the logging subsystem.
427 * PUBLIC: int __log_set_config __P((DB_ENV *, u_int32_t, int));
430 __log_set_config(dbenv, flags, on)
435 return (__log_set_config_int(dbenv, flags, on, 0));
438 * __log_set_config_int --
439 * Configure the logging subsystem.
441 * PUBLIC: int __log_set_config_int __P((DB_ENV *, u_int32_t, int, int));
444 __log_set_config_int(dbenv, flags, on, in_open)
452 u_int32_t mapped_flags;
455 dblp = env->lg_handle;
456 if (FLD_ISSET(flags, ~OK_FLAGS))
457 return (__db_ferr(env, "DB_ENV->log_set_config", 0));
458 ENV_NOT_CONFIGURED(env, dblp, "DB_ENV->log_set_config", DB_INIT_LOG);
459 if (LF_ISSET(DB_LOG_DIRECT) && __os_support_direct_io() == 0) {
461 "DB_ENV->log_set_config: direct I/O either not configured or not supported");
465 if (LOGGING_ON(env)) {
466 if (!in_open && LF_ISSET(DB_LOG_IN_MEMORY))
467 ENV_ILLEGAL_AFTER_OPEN(env,
468 "DB_ENV->log_set_config: DB_LOG_IN_MEMORY");
469 __log_set_flags(env, flags, on);
471 __env_map_flags(LogMap, sizeof(LogMap), &flags, &mapped_flags);
473 F_SET(dblp, mapped_flags);
475 F_CLR(dblp, mapped_flags);
478 * DB_LOG_IN_MEMORY, DB_TXN_NOSYNC and DB_TXN_WRITE_NOSYNC
479 * are mutually incompatible. If we're setting one of them,
480 * clear all current settings.
482 if (on && LF_ISSET(DB_LOG_IN_MEMORY))
484 DB_ENV_TXN_NOSYNC | DB_ENV_TXN_WRITE_NOSYNC);
487 FLD_SET(dbenv->lg_flags, flags);
489 FLD_CLR(dbenv->lg_flags, flags);
496 * __log_check_sizes --
497 * Makes sure that the log file size and log buffer size are compatible.
499 * PUBLIC: int __log_check_sizes __P((ENV *, u_int32_t, u_int32_t));
502 __log_check_sizes(env, lg_max, lg_bsize)
513 if (LOGGING_ON(env)) {
514 lp = env->lg_handle->reginfo.primary;
515 inmem = lp->db_log_inmemory;
516 lg_bsize = lp->buffer_size;
518 inmem = (FLD_ISSET(dbenv->lg_flags, DB_LOG_IN_MEMORY) != 0);
522 lg_bsize = LG_BSIZE_INMEM;
524 lg_max = LG_MAX_INMEM;
526 if (lg_bsize <= lg_max) {
528 "in-memory log buffer must be larger than the log file size");