1*00b67f09SDavid van Moolenbroek /* $NetBSD: journal.h,v 1.5 2014/12/10 04:37:58 christos Exp $ */ 2*00b67f09SDavid van Moolenbroek 3*00b67f09SDavid van Moolenbroek /* 4*00b67f09SDavid van Moolenbroek * Copyright (C) 2004-2009, 2011, 2013 Internet Systems Consortium, Inc. ("ISC") 5*00b67f09SDavid van Moolenbroek * Copyright (C) 1999-2001 Internet Software Consortium. 6*00b67f09SDavid van Moolenbroek * 7*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and/or distribute this software for any 8*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above 9*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies. 10*00b67f09SDavid van Moolenbroek * 11*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 12*00b67f09SDavid van Moolenbroek * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 13*00b67f09SDavid van Moolenbroek * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 14*00b67f09SDavid van Moolenbroek * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 15*00b67f09SDavid van Moolenbroek * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 16*00b67f09SDavid van Moolenbroek * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17*00b67f09SDavid van Moolenbroek * PERFORMANCE OF THIS SOFTWARE. 18*00b67f09SDavid van Moolenbroek */ 19*00b67f09SDavid van Moolenbroek 20*00b67f09SDavid van Moolenbroek /* Id: journal.h,v 1.43 2011/12/22 07:32:41 each Exp */ 21*00b67f09SDavid van Moolenbroek 22*00b67f09SDavid van Moolenbroek #ifndef DNS_JOURNAL_H 23*00b67f09SDavid van Moolenbroek #define DNS_JOURNAL_H 1 24*00b67f09SDavid van Moolenbroek 25*00b67f09SDavid van Moolenbroek /***** 26*00b67f09SDavid van Moolenbroek ***** Module Info 27*00b67f09SDavid van Moolenbroek *****/ 28*00b67f09SDavid van Moolenbroek 29*00b67f09SDavid van Moolenbroek /*! \file dns/journal.h 30*00b67f09SDavid van Moolenbroek * \brief 31*00b67f09SDavid van Moolenbroek * Database journaling. 32*00b67f09SDavid van Moolenbroek */ 33*00b67f09SDavid van Moolenbroek 34*00b67f09SDavid van Moolenbroek /*** 35*00b67f09SDavid van Moolenbroek *** Imports 36*00b67f09SDavid van Moolenbroek ***/ 37*00b67f09SDavid van Moolenbroek 38*00b67f09SDavid van Moolenbroek #include <isc/lang.h> 39*00b67f09SDavid van Moolenbroek #include <isc/magic.h> 40*00b67f09SDavid van Moolenbroek 41*00b67f09SDavid van Moolenbroek #include <dns/name.h> 42*00b67f09SDavid van Moolenbroek #include <dns/diff.h> 43*00b67f09SDavid van Moolenbroek #include <dns/rdata.h> 44*00b67f09SDavid van Moolenbroek #include <dns/types.h> 45*00b67f09SDavid van Moolenbroek 46*00b67f09SDavid van Moolenbroek /*** 47*00b67f09SDavid van Moolenbroek *** Defines. 48*00b67f09SDavid van Moolenbroek ***/ 49*00b67f09SDavid van Moolenbroek #define DNS_JOURNALOPT_RESIGN 0x00000001 50*00b67f09SDavid van Moolenbroek 51*00b67f09SDavid van Moolenbroek #define DNS_JOURNAL_READ 0x00000000 /* ISC_FALSE */ 52*00b67f09SDavid van Moolenbroek #define DNS_JOURNAL_CREATE 0x00000001 /* ISC_TRUE */ 53*00b67f09SDavid van Moolenbroek #define DNS_JOURNAL_WRITE 0x00000002 54*00b67f09SDavid van Moolenbroek 55*00b67f09SDavid van Moolenbroek /*** 56*00b67f09SDavid van Moolenbroek *** Types 57*00b67f09SDavid van Moolenbroek ***/ 58*00b67f09SDavid van Moolenbroek 59*00b67f09SDavid van Moolenbroek /*% 60*00b67f09SDavid van Moolenbroek * A dns_journal_t represents an open journal file. This is an opaque type. 61*00b67f09SDavid van Moolenbroek * 62*00b67f09SDavid van Moolenbroek * A particular dns_journal_t object may be opened for writing, in which case 63*00b67f09SDavid van Moolenbroek * it can be used for writing transactions to a journal file, or it can be 64*00b67f09SDavid van Moolenbroek * opened for reading, in which case it can be used for reading transactions 65*00b67f09SDavid van Moolenbroek * from (iterating over) a journal file. A single dns_journal_t object may 66*00b67f09SDavid van Moolenbroek * not be used for both purposes. 67*00b67f09SDavid van Moolenbroek */ 68*00b67f09SDavid van Moolenbroek typedef struct dns_journal dns_journal_t; 69*00b67f09SDavid van Moolenbroek 70*00b67f09SDavid van Moolenbroek 71*00b67f09SDavid van Moolenbroek /*** 72*00b67f09SDavid van Moolenbroek *** Functions 73*00b67f09SDavid van Moolenbroek ***/ 74*00b67f09SDavid van Moolenbroek 75*00b67f09SDavid van Moolenbroek ISC_LANG_BEGINDECLS 76*00b67f09SDavid van Moolenbroek 77*00b67f09SDavid van Moolenbroek /**************************************************************************/ 78*00b67f09SDavid van Moolenbroek 79*00b67f09SDavid van Moolenbroek isc_result_t 80*00b67f09SDavid van Moolenbroek dns_db_createsoatuple(dns_db_t *db, dns_dbversion_t *ver, isc_mem_t *mctx, 81*00b67f09SDavid van Moolenbroek dns_diffop_t op, dns_difftuple_t **tp); 82*00b67f09SDavid van Moolenbroek /*!< brief 83*00b67f09SDavid van Moolenbroek * Create a diff tuple for the current database SOA. 84*00b67f09SDavid van Moolenbroek * XXX this probably belongs somewhere else. 85*00b67f09SDavid van Moolenbroek */ 86*00b67f09SDavid van Moolenbroek 87*00b67f09SDavid van Moolenbroek 88*00b67f09SDavid van Moolenbroek /*@{*/ 89*00b67f09SDavid van Moolenbroek #define DNS_SERIAL_GT(a, b) ((int)(((a) - (b)) & 0xFFFFFFFF) > 0) 90*00b67f09SDavid van Moolenbroek #define DNS_SERIAL_GE(a, b) ((int)(((a) - (b)) & 0xFFFFFFFF) >= 0) 91*00b67f09SDavid van Moolenbroek /*!< brief 92*00b67f09SDavid van Moolenbroek * Compare SOA serial numbers. DNS_SERIAL_GT(a, b) returns true iff 93*00b67f09SDavid van Moolenbroek * a is "greater than" b where "greater than" is as defined in RFC1982. 94*00b67f09SDavid van Moolenbroek * DNS_SERIAL_GE(a, b) returns true iff a is "greater than or equal to" b. 95*00b67f09SDavid van Moolenbroek */ 96*00b67f09SDavid van Moolenbroek /*@}*/ 97*00b67f09SDavid van Moolenbroek 98*00b67f09SDavid van Moolenbroek /**************************************************************************/ 99*00b67f09SDavid van Moolenbroek /* 100*00b67f09SDavid van Moolenbroek * Journal object creation and destruction. 101*00b67f09SDavid van Moolenbroek */ 102*00b67f09SDavid van Moolenbroek 103*00b67f09SDavid van Moolenbroek isc_result_t 104*00b67f09SDavid van Moolenbroek dns_journal_open(isc_mem_t *mctx, const char *filename, unsigned int mode, 105*00b67f09SDavid van Moolenbroek dns_journal_t **journalp); 106*00b67f09SDavid van Moolenbroek /*%< 107*00b67f09SDavid van Moolenbroek * Open the journal file 'filename' and create a dns_journal_t object for it. 108*00b67f09SDavid van Moolenbroek * 109*00b67f09SDavid van Moolenbroek * DNS_JOURNAL_CREATE open the journal for reading and writing and create 110*00b67f09SDavid van Moolenbroek * the journal if it does not exist. 111*00b67f09SDavid van Moolenbroek * DNS_JOURNAL_WRITE open the journal for reading and writing. 112*00b67f09SDavid van Moolenbroek * DNS_JOURNAL_READ open the journal for reading only. 113*00b67f09SDavid van Moolenbroek */ 114*00b67f09SDavid van Moolenbroek 115*00b67f09SDavid van Moolenbroek void 116*00b67f09SDavid van Moolenbroek dns_journal_destroy(dns_journal_t **journalp); 117*00b67f09SDavid van Moolenbroek /*%< 118*00b67f09SDavid van Moolenbroek * Destroy a dns_journal_t, closing any open files and freeing its memory. 119*00b67f09SDavid van Moolenbroek */ 120*00b67f09SDavid van Moolenbroek 121*00b67f09SDavid van Moolenbroek /**************************************************************************/ 122*00b67f09SDavid van Moolenbroek /* 123*00b67f09SDavid van Moolenbroek * Writing transactions to journals. 124*00b67f09SDavid van Moolenbroek */ 125*00b67f09SDavid van Moolenbroek 126*00b67f09SDavid van Moolenbroek isc_result_t 127*00b67f09SDavid van Moolenbroek dns_journal_begin_transaction(dns_journal_t *j); 128*00b67f09SDavid van Moolenbroek /*%< 129*00b67f09SDavid van Moolenbroek * Prepare to write a new transaction to the open journal file 'j'. 130*00b67f09SDavid van Moolenbroek * 131*00b67f09SDavid van Moolenbroek * Requires: 132*00b67f09SDavid van Moolenbroek * \li 'j' is open for writing. 133*00b67f09SDavid van Moolenbroek */ 134*00b67f09SDavid van Moolenbroek 135*00b67f09SDavid van Moolenbroek isc_result_t 136*00b67f09SDavid van Moolenbroek dns_journal_writediff(dns_journal_t *j, dns_diff_t *diff); 137*00b67f09SDavid van Moolenbroek /*%< 138*00b67f09SDavid van Moolenbroek * Write 'diff' to the current transaction of journal file 'j'. 139*00b67f09SDavid van Moolenbroek * 140*00b67f09SDavid van Moolenbroek * Requires: 141*00b67f09SDavid van Moolenbroek * \li 'j' is open for writing and dns_journal_begin_transaction() 142*00b67f09SDavid van Moolenbroek * has been called. 143*00b67f09SDavid van Moolenbroek * 144*00b67f09SDavid van Moolenbroek *\li 'diff' is a full or partial, correctly ordered IXFR 145*00b67f09SDavid van Moolenbroek * difference sequence. 146*00b67f09SDavid van Moolenbroek */ 147*00b67f09SDavid van Moolenbroek 148*00b67f09SDavid van Moolenbroek isc_result_t 149*00b67f09SDavid van Moolenbroek dns_journal_commit(dns_journal_t *j); 150*00b67f09SDavid van Moolenbroek /*%< 151*00b67f09SDavid van Moolenbroek * Commit the current transaction of journal file 'j'. 152*00b67f09SDavid van Moolenbroek * 153*00b67f09SDavid van Moolenbroek * Requires: 154*00b67f09SDavid van Moolenbroek * \li 'j' is open for writing and dns_journal_begin_transaction() 155*00b67f09SDavid van Moolenbroek * has been called. 156*00b67f09SDavid van Moolenbroek * 157*00b67f09SDavid van Moolenbroek * \li dns_journal_writediff() has been called one or more times 158*00b67f09SDavid van Moolenbroek * to form a complete, correctly ordered IXFR difference 159*00b67f09SDavid van Moolenbroek * sequence. 160*00b67f09SDavid van Moolenbroek */ 161*00b67f09SDavid van Moolenbroek 162*00b67f09SDavid van Moolenbroek isc_result_t 163*00b67f09SDavid van Moolenbroek dns_journal_write_transaction(dns_journal_t *j, dns_diff_t *diff); 164*00b67f09SDavid van Moolenbroek /*% 165*00b67f09SDavid van Moolenbroek * Write a complete transaction at once to a journal file, 166*00b67f09SDavid van Moolenbroek * sorting it if necessary, and commit it. Equivalent to calling 167*00b67f09SDavid van Moolenbroek * dns_diff_sort(), dns_journal_begin_transaction(), 168*00b67f09SDavid van Moolenbroek * dns_journal_writediff(), and dns_journal_commit(). 169*00b67f09SDavid van Moolenbroek * 170*00b67f09SDavid van Moolenbroek * Requires: 171*00b67f09SDavid van Moolenbroek *\li 'j' is open for writing. 172*00b67f09SDavid van Moolenbroek * 173*00b67f09SDavid van Moolenbroek * \li 'diff' contains exactly one SOA deletion, one SOA addition 174*00b67f09SDavid van Moolenbroek * with a greater serial number, and possibly other changes, 175*00b67f09SDavid van Moolenbroek * in arbitrary order. 176*00b67f09SDavid van Moolenbroek */ 177*00b67f09SDavid van Moolenbroek 178*00b67f09SDavid van Moolenbroek /**************************************************************************/ 179*00b67f09SDavid van Moolenbroek /* 180*00b67f09SDavid van Moolenbroek * Reading transactions from journals. 181*00b67f09SDavid van Moolenbroek */ 182*00b67f09SDavid van Moolenbroek 183*00b67f09SDavid van Moolenbroek isc_uint32_t 184*00b67f09SDavid van Moolenbroek dns_journal_first_serial(dns_journal_t *j); 185*00b67f09SDavid van Moolenbroek isc_uint32_t 186*00b67f09SDavid van Moolenbroek dns_journal_last_serial(dns_journal_t *j); 187*00b67f09SDavid van Moolenbroek /*%< 188*00b67f09SDavid van Moolenbroek * Get the first and last addressable serial number in the journal. 189*00b67f09SDavid van Moolenbroek */ 190*00b67f09SDavid van Moolenbroek 191*00b67f09SDavid van Moolenbroek isc_result_t 192*00b67f09SDavid van Moolenbroek dns_journal_iter_init(dns_journal_t *j, 193*00b67f09SDavid van Moolenbroek isc_uint32_t begin_serial, isc_uint32_t end_serial); 194*00b67f09SDavid van Moolenbroek /*%< 195*00b67f09SDavid van Moolenbroek * Prepare to iterate over the transactions that will bring the database 196*00b67f09SDavid van Moolenbroek * from SOA serial number 'begin_serial' to 'end_serial'. 197*00b67f09SDavid van Moolenbroek * 198*00b67f09SDavid van Moolenbroek * Returns: 199*00b67f09SDavid van Moolenbroek *\li ISC_R_SUCCESS 200*00b67f09SDavid van Moolenbroek *\li ISC_R_RANGE begin_serial is outside the addressable range. 201*00b67f09SDavid van Moolenbroek *\li ISC_R_NOTFOUND begin_serial is within the range of addressable 202*00b67f09SDavid van Moolenbroek * serial numbers covered by the journal, but 203*00b67f09SDavid van Moolenbroek * this particular serial number does not exist. 204*00b67f09SDavid van Moolenbroek */ 205*00b67f09SDavid van Moolenbroek 206*00b67f09SDavid van Moolenbroek /*@{*/ 207*00b67f09SDavid van Moolenbroek isc_result_t 208*00b67f09SDavid van Moolenbroek dns_journal_first_rr(dns_journal_t *j); 209*00b67f09SDavid van Moolenbroek isc_result_t 210*00b67f09SDavid van Moolenbroek dns_journal_next_rr(dns_journal_t *j); 211*00b67f09SDavid van Moolenbroek /*%< 212*00b67f09SDavid van Moolenbroek * Position the iterator at the first/next RR in a journal 213*00b67f09SDavid van Moolenbroek * transaction sequence established using dns_journal_iter_init(). 214*00b67f09SDavid van Moolenbroek * 215*00b67f09SDavid van Moolenbroek * Requires: 216*00b67f09SDavid van Moolenbroek * \li dns_journal_iter_init() has been called. 217*00b67f09SDavid van Moolenbroek * 218*00b67f09SDavid van Moolenbroek */ 219*00b67f09SDavid van Moolenbroek /*@}*/ 220*00b67f09SDavid van Moolenbroek 221*00b67f09SDavid van Moolenbroek void 222*00b67f09SDavid van Moolenbroek dns_journal_current_rr(dns_journal_t *j, dns_name_t **name, isc_uint32_t *ttl, 223*00b67f09SDavid van Moolenbroek dns_rdata_t **rdata); 224*00b67f09SDavid van Moolenbroek /*%< 225*00b67f09SDavid van Moolenbroek * Get the name, ttl, and rdata of the current journal RR. 226*00b67f09SDavid van Moolenbroek * 227*00b67f09SDavid van Moolenbroek * Requires: 228*00b67f09SDavid van Moolenbroek * \li The last call to dns_journal_first_rr() or dns_journal_next_rr() 229*00b67f09SDavid van Moolenbroek * returned ISC_R_SUCCESS. 230*00b67f09SDavid van Moolenbroek */ 231*00b67f09SDavid van Moolenbroek 232*00b67f09SDavid van Moolenbroek /**************************************************************************/ 233*00b67f09SDavid van Moolenbroek /* 234*00b67f09SDavid van Moolenbroek * Database roll-forward. 235*00b67f09SDavid van Moolenbroek */ 236*00b67f09SDavid van Moolenbroek 237*00b67f09SDavid van Moolenbroek isc_result_t 238*00b67f09SDavid van Moolenbroek dns_journal_rollforward(isc_mem_t *mctx, dns_db_t *db, unsigned int options, 239*00b67f09SDavid van Moolenbroek const char *filename); 240*00b67f09SDavid van Moolenbroek /*%< 241*00b67f09SDavid van Moolenbroek * Roll forward (play back) the journal file "filename" into the 242*00b67f09SDavid van Moolenbroek * database "db". This should be called when the server starts 243*00b67f09SDavid van Moolenbroek * after a shutdown or crash. 244*00b67f09SDavid van Moolenbroek * 245*00b67f09SDavid van Moolenbroek * Requires: 246*00b67f09SDavid van Moolenbroek *\li 'mctx' is a valid memory context. 247*00b67f09SDavid van Moolenbroek *\li 'db' is a valid database which does not have a version 248*00b67f09SDavid van Moolenbroek * open for writing. 249*00b67f09SDavid van Moolenbroek *\li 'filename' is the name of the journal file belonging to 'db'. 250*00b67f09SDavid van Moolenbroek * 251*00b67f09SDavid van Moolenbroek * Returns: 252*00b67f09SDavid van Moolenbroek *\li DNS_R_NOJOURNAL when journal does not exist. 253*00b67f09SDavid van Moolenbroek *\li ISC_R_NOTFOUND when current serial in not in journal. 254*00b67f09SDavid van Moolenbroek *\li ISC_R_RANGE when current serial in not in journals range. 255*00b67f09SDavid van Moolenbroek *\li ISC_R_SUCCESS journal has been applied successfully to database. 256*00b67f09SDavid van Moolenbroek * others 257*00b67f09SDavid van Moolenbroek */ 258*00b67f09SDavid van Moolenbroek 259*00b67f09SDavid van Moolenbroek isc_result_t 260*00b67f09SDavid van Moolenbroek dns_journal_print(isc_mem_t *mctx, const char *filename, FILE *file); 261*00b67f09SDavid van Moolenbroek /* For debugging not general use */ 262*00b67f09SDavid van Moolenbroek 263*00b67f09SDavid van Moolenbroek isc_result_t 264*00b67f09SDavid van Moolenbroek dns_db_diff(isc_mem_t *mctx, 265*00b67f09SDavid van Moolenbroek dns_db_t *dba, dns_dbversion_t *dbvera, 266*00b67f09SDavid van Moolenbroek dns_db_t *dbb, dns_dbversion_t *dbverb, 267*00b67f09SDavid van Moolenbroek const char *journal_filename); 268*00b67f09SDavid van Moolenbroek 269*00b67f09SDavid van Moolenbroek isc_result_t 270*00b67f09SDavid van Moolenbroek dns_db_diffx(dns_diff_t *diff, dns_db_t *dba, dns_dbversion_t *dbvera, 271*00b67f09SDavid van Moolenbroek dns_db_t *dbb, dns_dbversion_t *dbverb, 272*00b67f09SDavid van Moolenbroek const char *journal_filename); 273*00b67f09SDavid van Moolenbroek /*%< 274*00b67f09SDavid van Moolenbroek * Compare the databases 'dba' and 'dbb' and generate a diff/journal 275*00b67f09SDavid van Moolenbroek * entry containing the changes to make 'dba' from 'dbb' (note 276*00b67f09SDavid van Moolenbroek * the order). This journal entry will consist of a single, 277*00b67f09SDavid van Moolenbroek * possibly very large transaction. Append the journal 278*00b67f09SDavid van Moolenbroek * entry to the journal file specified by 'journal_filename' if 279*00b67f09SDavid van Moolenbroek * non-NULL. 280*00b67f09SDavid van Moolenbroek */ 281*00b67f09SDavid van Moolenbroek 282*00b67f09SDavid van Moolenbroek isc_result_t 283*00b67f09SDavid van Moolenbroek dns_journal_compact(isc_mem_t *mctx, char *filename, isc_uint32_t serial, 284*00b67f09SDavid van Moolenbroek isc_uint32_t target_size); 285*00b67f09SDavid van Moolenbroek /*%< 286*00b67f09SDavid van Moolenbroek * Attempt to compact the journal if it is greater that 'target_size'. 287*00b67f09SDavid van Moolenbroek * Changes from 'serial' onwards will be preserved. If the journal 288*00b67f09SDavid van Moolenbroek * exists and is non-empty 'serial' must exist in the journal. 289*00b67f09SDavid van Moolenbroek */ 290*00b67f09SDavid van Moolenbroek 291*00b67f09SDavid van Moolenbroek isc_boolean_t 292*00b67f09SDavid van Moolenbroek dns_journal_get_sourceserial(dns_journal_t *j, isc_uint32_t *sourceserial); 293*00b67f09SDavid van Moolenbroek void 294*00b67f09SDavid van Moolenbroek dns_journal_set_sourceserial(dns_journal_t *j, isc_uint32_t sourceserial); 295*00b67f09SDavid van Moolenbroek /*%< 296*00b67f09SDavid van Moolenbroek * Get and set source serial. 297*00b67f09SDavid van Moolenbroek * 298*00b67f09SDavid van Moolenbroek * Returns: 299*00b67f09SDavid van Moolenbroek * ISC_TRUE if sourceserial has previously been set. 300*00b67f09SDavid van Moolenbroek */ 301*00b67f09SDavid van Moolenbroek 302*00b67f09SDavid van Moolenbroek ISC_LANG_ENDDECLS 303*00b67f09SDavid van Moolenbroek 304*00b67f09SDavid van Moolenbroek #endif /* DNS_JOURNAL_H */ 305