1
/* Copyright (c) 2007 PrimeBase Technologies GmbH
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
* 2007-11-12 Paul McCullagh
23
* Restart and write data to the database.
26
#ifndef __restart_xt_h__
27
#define __restart_xt_h__
29
#include "pthread_xt.h"
30
#include "filesys_xt.h"
31
#include "sortedlist_xt.h"
33
#include "xactlog_xt.h"
40
#ifdef XT_SORT_REC_WRITES
41
#ifdef TEST_SORT_REC_OVERFLOW
42
#define XT_TABLE_LIST_SIZE 5
44
#define XT_TABLE_LIST_SIZE 223
46
#define XT_TABLE_LIST_INC 23
49
extern int pbxt_recovery_state;
51
typedef struct XTWriterState {
52
struct XTDatabase *ws_db;
54
xtLogID ws_ind_rec_log_id;
55
xtLogOffset ws_ind_rec_log_offset;
56
XTXactSeqReadRec ws_seqread;
57
XTDataBufferRec ws_databuf;
58
XTInfoBufferRec ws_rec_buf;
59
xtTableID ws_tab_gone; /* Cache the ID of the last table that does not exist. */
60
xtTableID ws_tab_temp; /* Cache the ID of the last temporary table. */
61
struct XTOpenTable *ws_ot;
62
#ifdef XT_SORT_REC_WRITES
63
xtTableID ws_tab_flush_list[XT_TABLE_LIST_SIZE];
65
} XTWriterStateRec, *XTWriterStatePtr;
67
#define XT_CHECKPOINT_VERSION 1
69
typedef struct XTXlogCheckpoint {
70
XTDiskValue2 xcp_checksum_2; /* The checksum of the all checkpoint data. */
71
XTDiskValue4 xcp_head_size_4;
72
XTDiskValue2 xcp_version_2; /* The version of the checkpoint record. */
73
XTDiskValue6 xcp_chkpnt_no_6; /* Incremented for each checkpoint. */
74
XTDiskValue4 xcp_log_id_4; /* The restart log ID. */
75
XTDiskValue6 xcp_log_offs_6; /* The restart log offset. */
76
XTDiskValue4 xcp_tab_id_4; /* The current high table ID. */
77
XTDiskValue4 xcp_xact_id_4; /* The current high transaction ID. */
78
XTDiskValue4 xcp_ind_rec_log_id_4; /* The index recovery log ID. */
79
XTDiskValue6 xcp_ind_rec_log_offs_6; /* The index recovery log offset. */
80
XTDiskValue2 xcp_log_count_2; /* Number of logs to be deleted in the area below. */
81
XTDiskValue2 xcp_del_log[XT_VAR_LENGTH];
82
} XTXlogCheckpointDRec, *XTXlogCheckpointDPtr;
84
typedef struct XTXactRestart {
85
struct XTDatabase *xres_db;
86
int xres_next_res_no; /* The next restart file to be written. */
87
xtLogID xres_cp_log_id; /* Log number of the last checkpoint. */
88
xtLogOffset xres_cp_log_offset; /* Log offset of the last checkpoint */
89
xtBool xres_cp_required; /* Checkpoint required (startup and shutdown). */
90
xtWord8 xres_cp_number; /* The checkpoint number (used to decide which is the latest checkpoint). */
93
void xres_init(struct XTThread *self, struct XTDatabase *db, xtLogID *log_id, xtLogOffset *log_offset, xtLogID *max_log_id);
94
void xres_exit(struct XTThread *self);
95
xtBool xres_is_checkpoint_pending(xtLogID log_id, xtLogOffset log_offset);
96
void xres_checkpoint_pending(xtLogID log_id, xtLogOffset log_offset);
97
xtBool xres_checkpoint(struct XTThread *self);
98
void xres_name(size_t size, char *path, xtLogID log_id);
101
xtBool xres_check_checksum(XTXlogCheckpointDPtr buffer, size_t size);
102
void xres_recover_progress(XTThreadPtr self, XTOpenFilePtr *of, int perc);
103
xtBool xres_restart(struct XTThread *self, xtLogID *log_id, xtLogOffset *log_offset, xtLogID ind_rec_log_id, off_t ind_rec_log_offset, xtLogID *max_log_id);
104
off_t xres_bytes_to_read(struct XTThread *self, struct XTDatabase *db, u_int *log_count, xtLogID *max_log_id);
105
} XTXactRestartRec, *XTXactRestartPtr;
107
typedef struct XTCheckPointState {
108
xtBool cp_inited; /* TRUE if structure was inited */
109
xt_mutex_type cp_state_lock; /* Lock and the entire checkpoint state. */
110
xtBool cp_running; /* TRUE if a checkpoint is running. */
112
xtLogOffset cp_log_offset;
113
xtLogID cp_ind_rec_log_id;
114
xtLogOffset cp_ind_rec_log_offset;
115
XTSortedListPtr cp_table_ids; /* List of tables to be flushed for the checkpoint. */
116
u_int cp_flush_count; /* The number of tables flushed. */
117
u_int cp_next_to_flush; /* The next table to be flushed. */
118
} XTCheckPointStateRec, *XTCheckPointStatePtr;
120
#define XT_CPT_NONE_FLUSHED 0
121
#define XT_CPT_REC_ROW_FLUSHED 1
122
#define XT_CPT_INDEX_FLUSHED 2
123
#define XT_CPT_REC_ROW_FLUSHING 4
124
#define XT_CPT_INDEX_FLUSHING 8
125
#define XT_CPT_ALL_FLUSHED (XT_CPT_REC_ROW_FLUSHED | XT_CPT_INDEX_FLUSHED)
127
#define XT_CPT_STATE_START_REC_ROW 1
128
#define XT_CPT_STATE_STOP_REC_ROW 2
129
#define XT_CPT_STATE_DONE_REC_ROW 3
130
#define XT_CPT_STATE_START_INDEX 4
131
#define XT_CPT_STATE_STOP_INDEX 5
132
#define XT_CPT_STATE_DONE_INDEX 6
133
#define XT_CPT_STATE_DONE_ALL 7
135
typedef struct XTCheckPointTable {
137
xtTableID cpt_tab_id;
138
} XTCheckPointTableRec, *XTCheckPointTablePtr;
140
void xt_xres_init(struct XTThread *self, struct XTDatabase *db);
141
void xt_xres_exit(struct XTThread *self, struct XTDatabase *db);
143
void xt_xres_init_tab(struct XTThread *self, struct XTTable *tab);
144
void xt_xres_exit_tab(struct XTThread *self, struct XTTable *tab);
146
#ifdef XT_SORT_REC_WRITES
147
xtBool xt_xres_delay_flush(struct XTOpenTable *ot, xtBool lock);
148
void xt_xres_flush_all(struct XTThread *self, XTWriterStatePtr ws);
151
void xt_xres_apply_in_order(struct XTThread *self, XTWriterStatePtr ws, xtLogID log_id, xtLogOffset log_offset, XTXactLogBufferDPtr record);
153
xtBool xt_begin_checkpoint(struct XTDatabase *db, xtBool have_table_lock, struct XTThread *thread);
154
xtBool xt_end_checkpoint(struct XTDatabase *db, struct XTThread *thread, xtBool *checkpoint_done);
155
void xt_checkpoint_set_flush_state(struct XTDatabase *db, xtTableID tab_id, int state);
156
void xt_checkpoint_flush_done(struct XTDatabase *db, xtTableID tab_id, int flush_bit);
157
void xt_start_checkpointer(struct XTThread *self, struct XTDatabase *db);
158
void xt_wait_for_checkpointer(struct XTThread *self, struct XTDatabase *db);
159
void xt_stop_checkpointer(struct XTThread *self, struct XTDatabase *db);
160
void xt_wake_checkpointer(struct XTThread *self, struct XTDatabase *db);
161
void xt_free_writer_state(struct XTThread *self, XTWriterStatePtr ws);
162
xtWord8 xt_bytes_since_last_checkpoint(struct XTDatabase *db, xtLogID curr_log_id, xtLogOffset curr_log_offset);
164
void xt_print_log_record(xtLogID log, off_t offset, XTXactLogBufferDPtr record);
165
void xt_dump_xlogs(struct XTDatabase *db, xtLogID start_log);
167
void xt_xres_start_database_recovery(XTThreadPtr self);
168
void xt_xres_terminate_recovery(XTThreadPtr self);
170
void xt_start_flusher(struct XTThread *self, struct XTDatabase *db);
171
void xt_stop_flusher(struct XTThread *self, struct XTDatabase *db);
173
#define XT_RECOVER_PENDING 0
174
#define XT_RECOVER_DONE 1
175
#define XT_RECOVER_SWEPT 2
176
#define XT_RECOVER_ERROR 3
178
inline void xt_xres_wait_for_recovery(XTThreadPtr XT_UNUSED(self), int state)
180
while (pbxt_recovery_state < state)
181
xt_sleep_milli_second(100);