3
#ifndef NO_SYSTEM_INCLUDES
10
#include "dbinc/db_page.h"
11
#include "dbinc/__db.h"
12
#include "dbinc/log.h"
15
* __db_addrem_recover --
16
* Recovery function for addrem.
18
* PUBLIC: int __db_addrem_recover
19
* PUBLIC: __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
22
__db_addrem_recover(dbenv, dbtp, lsnp, op, info)
29
__db_addrem_args *argp;
34
int cmp_n, cmp_p, modified, ret;
36
REC_PRINT(__db_addrem_print);
37
REC_INTRO(__db_addrem_read, 1);
39
if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0)
41
if ((ret = mpf->get(mpf,
42
&argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
45
*lsnp = argp->prev_lsn;
51
cmp_n = log_compare(lsnp, &LSN(pagep));
54
* Use this when there is something like "pagelsn" in the argp
55
* structure. Sometimes, you might need to compare meta-data
58
* cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
60
if (cmp_p == 0 && DB_REDO(op)) {
61
/* Need to redo update described. */
63
} else if (cmp_n == 0 && !DB_REDO(op)) {
64
/* Need to undo update described. */
67
if (ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
70
*lsnp = argp->prev_lsn;
78
* Recovery function for big.
80
* PUBLIC: int __db_big_recover
81
* PUBLIC: __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
84
__db_big_recover(dbenv, dbtp, lsnp, op, info)
96
int cmp_n, cmp_p, modified, ret;
98
REC_PRINT(__db_big_print);
99
REC_INTRO(__db_big_read, 1);
101
if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0)
103
if ((ret = mpf->get(mpf,
104
&argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
107
*lsnp = argp->prev_lsn;
113
cmp_n = log_compare(lsnp, &LSN(pagep));
116
* Use this when there is something like "pagelsn" in the argp
117
* structure. Sometimes, you might need to compare meta-data
120
* cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
122
if (cmp_p == 0 && DB_REDO(op)) {
123
/* Need to redo update described. */
125
} else if (cmp_n == 0 && !DB_REDO(op)) {
126
/* Need to undo update described. */
129
if (ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
132
*lsnp = argp->prev_lsn;
139
* __db_ovref_recover --
140
* Recovery function for ovref.
142
* PUBLIC: int __db_ovref_recover
143
* PUBLIC: __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
146
__db_ovref_recover(dbenv, dbtp, lsnp, op, info)
153
__db_ovref_args *argp;
158
int cmp_n, cmp_p, modified, ret;
160
REC_PRINT(__db_ovref_print);
161
REC_INTRO(__db_ovref_read, 1);
163
if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0)
165
if ((ret = mpf->get(mpf,
166
&argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
169
*lsnp = argp->prev_lsn;
175
cmp_n = log_compare(lsnp, &LSN(pagep));
178
* Use this when there is something like "pagelsn" in the argp
179
* structure. Sometimes, you might need to compare meta-data
182
* cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
184
if (cmp_p == 0 && DB_REDO(op)) {
185
/* Need to redo update described. */
187
} else if (cmp_n == 0 && !DB_REDO(op)) {
188
/* Need to undo update described. */
191
if (ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
194
*lsnp = argp->prev_lsn;
201
* __db_relink_recover --
202
* Recovery function for relink.
204
* PUBLIC: int __db_relink_recover
205
* PUBLIC: __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
208
__db_relink_recover(dbenv, dbtp, lsnp, op, info)
215
__db_relink_args *argp;
220
int cmp_n, cmp_p, modified, ret;
222
REC_PRINT(__db_relink_print);
223
REC_INTRO(__db_relink_read, 1);
225
if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0)
227
if ((ret = mpf->get(mpf,
228
&argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
231
*lsnp = argp->prev_lsn;
237
cmp_n = log_compare(lsnp, &LSN(pagep));
240
* Use this when there is something like "pagelsn" in the argp
241
* structure. Sometimes, you might need to compare meta-data
244
* cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
246
if (cmp_p == 0 && DB_REDO(op)) {
247
/* Need to redo update described. */
249
} else if (cmp_n == 0 && !DB_REDO(op)) {
250
/* Need to undo update described. */
253
if (ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
256
*lsnp = argp->prev_lsn;
263
* __db_debug_recover --
264
* Recovery function for debug.
266
* PUBLIC: int __db_debug_recover
267
* PUBLIC: __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
270
__db_debug_recover(dbenv, dbtp, lsnp, op, info)
277
__db_debug_args *argp;
282
int cmp_n, cmp_p, modified, ret;
284
REC_PRINT(__db_debug_print);
285
REC_INTRO(__db_debug_read, 1);
287
if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0)
289
if ((ret = mpf->get(mpf,
290
&argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
293
*lsnp = argp->prev_lsn;
299
cmp_n = log_compare(lsnp, &LSN(pagep));
302
* Use this when there is something like "pagelsn" in the argp
303
* structure. Sometimes, you might need to compare meta-data
306
* cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
308
if (cmp_p == 0 && DB_REDO(op)) {
309
/* Need to redo update described. */
311
} else if (cmp_n == 0 && !DB_REDO(op)) {
312
/* Need to undo update described. */
315
if (ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
318
*lsnp = argp->prev_lsn;
325
* __db_noop_recover --
326
* Recovery function for noop.
328
* PUBLIC: int __db_noop_recover
329
* PUBLIC: __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
332
__db_noop_recover(dbenv, dbtp, lsnp, op, info)
339
__db_noop_args *argp;
344
int cmp_n, cmp_p, modified, ret;
346
REC_PRINT(__db_noop_print);
347
REC_INTRO(__db_noop_read, 1);
349
if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0)
351
if ((ret = mpf->get(mpf,
352
&argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
355
*lsnp = argp->prev_lsn;
361
cmp_n = log_compare(lsnp, &LSN(pagep));
364
* Use this when there is something like "pagelsn" in the argp
365
* structure. Sometimes, you might need to compare meta-data
368
* cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
370
if (cmp_p == 0 && DB_REDO(op)) {
371
/* Need to redo update described. */
373
} else if (cmp_n == 0 && !DB_REDO(op)) {
374
/* Need to undo update described. */
377
if (ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
380
*lsnp = argp->prev_lsn;
387
* __db_pg_alloc_recover --
388
* Recovery function for pg_alloc.
390
* PUBLIC: int __db_pg_alloc_recover
391
* PUBLIC: __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
394
__db_pg_alloc_recover(dbenv, dbtp, lsnp, op, info)
401
__db_pg_alloc_args *argp;
406
int cmp_n, cmp_p, modified, ret;
408
REC_PRINT(__db_pg_alloc_print);
409
REC_INTRO(__db_pg_alloc_read, 1);
411
if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0)
413
if ((ret = mpf->get(mpf,
414
&argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
417
*lsnp = argp->prev_lsn;
423
cmp_n = log_compare(lsnp, &LSN(pagep));
426
* Use this when there is something like "pagelsn" in the argp
427
* structure. Sometimes, you might need to compare meta-data
430
* cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
432
if (cmp_p == 0 && DB_REDO(op)) {
433
/* Need to redo update described. */
435
} else if (cmp_n == 0 && !DB_REDO(op)) {
436
/* Need to undo update described. */
439
if (ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
442
*lsnp = argp->prev_lsn;
449
* __db_pg_free_recover --
450
* Recovery function for pg_free.
452
* PUBLIC: int __db_pg_free_recover
453
* PUBLIC: __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
456
__db_pg_free_recover(dbenv, dbtp, lsnp, op, info)
463
__db_pg_free_args *argp;
468
int cmp_n, cmp_p, modified, ret;
470
REC_PRINT(__db_pg_free_print);
471
REC_INTRO(__db_pg_free_read, 1);
473
if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0)
475
if ((ret = mpf->get(mpf,
476
&argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
479
*lsnp = argp->prev_lsn;
485
cmp_n = log_compare(lsnp, &LSN(pagep));
488
* Use this when there is something like "pagelsn" in the argp
489
* structure. Sometimes, you might need to compare meta-data
492
* cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
494
if (cmp_p == 0 && DB_REDO(op)) {
495
/* Need to redo update described. */
497
} else if (cmp_n == 0 && !DB_REDO(op)) {
498
/* Need to undo update described. */
501
if (ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
504
*lsnp = argp->prev_lsn;
511
* __db_cksum_recover --
512
* Recovery function for cksum.
514
* PUBLIC: int __db_cksum_recover
515
* PUBLIC: __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
518
__db_cksum_recover(dbenv, dbtp, lsnp, op, info)
525
__db_cksum_args *argp;
530
int cmp_n, cmp_p, modified, ret;
532
REC_PRINT(__db_cksum_print);
533
REC_INTRO(__db_cksum_read, 1);
535
if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0)
537
if ((ret = mpf->get(mpf,
538
&argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
541
*lsnp = argp->prev_lsn;
547
cmp_n = log_compare(lsnp, &LSN(pagep));
550
* Use this when there is something like "pagelsn" in the argp
551
* structure. Sometimes, you might need to compare meta-data
554
* cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
556
if (cmp_p == 0 && DB_REDO(op)) {
557
/* Need to redo update described. */
559
} else if (cmp_n == 0 && !DB_REDO(op)) {
560
/* Need to undo update described. */
563
if (ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
566
*lsnp = argp->prev_lsn;