CUBRID Engine  latest
vacuum.h
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 /*
20  * vacuum.h - Vacuuming system (at Server).
21  *
22  */
23 #ifndef _VACUUM_H_
24 #define _VACUUM_H_
25 
26 #if !defined (SERVER_MODE) && !defined (SA_MODE)
27 #error Belongs to server module
28 #endif /* !defined (SERVER_MODE) && !defined (SA_MODE) */
29 
30 #include "dbtype_def.h"
31 #include "disk_manager.h"
32 #include "log_impl.h"
33 #include "log_lsa.hpp"
34 #include "log_postpone_cache.hpp"
35 #include "porting_inline.hpp"
36 #include "recovery.h"
37 #include "storage_common.h"
38 #include "system_parameter.h"
39 #include "thread_entry.hpp"
40 
41 #include <assert.h>
42 
43 /* Vacuum logging function (can only be used when SERVER_MODE is defined).
44  */
45 #define VACUUM_ER_LOG_NONE 0 /* No logging */
46 #define VACUUM_ER_LOG_ERROR 1 /* Log vacuum errors */
47 #define VACUUM_ER_LOG_WARNING 2 /* Log vacuum warnings */
48 #define VACUUM_ER_LOG_LOGGING 4 /* Log adding MVCC op log entries. */
49 #define VACUUM_ER_LOG_BTREE 8 /* Log vacuum b-trees */
50 #define VACUUM_ER_LOG_HEAP 16 /* Log vacuum heap */
51 #define VACUUM_ER_LOG_DROPPED_FILES 32 /* Log dropped classes */
52 #define VACUUM_ER_LOG_VACUUM_DATA 64 /* Log vacuum data */
53 #define VACUUM_ER_LOG_WORKER 128 /* Log vacuum worker specific activity. */
54 #define VACUUM_ER_LOG_MASTER 256 /* Log vacuum master specific activity. */
55 #define VACUUM_ER_LOG_RECOVERY 512 /* Log recovery of vacuum data and dropped classes/indexes */
56 #define VACUUM_ER_LOG_TOPOPS 1024 /* Log starting/ending system operations and their recovery. */
57 #define VACUUM_ER_LOG_ARCHIVES 2048 /* Log when archives are removed or when vacuum fails to find archives. */
58 #define VACUUM_ER_LOG_JOBS 4096 /* Log job generation, interrupt, finish */
59 #define VACUUM_ER_LOG_FLUSH_DATA 8192 /* Log flushing vacuum data. */
60 
61 #define VACUUM_ER_LOG_VERBOSE 0xFFFFFFFF /* Log all activity related to vacuum. */
62 #define VACUUM_IS_ER_LOG_LEVEL_SET(er_log_level) \
63  ((prm_get_integer_value (PRM_ID_ER_LOG_VACUUM) & (er_log_level)) != 0)
64 
65 #define vacuum_er_log(er_log_level, msg, ...) \
66  if (VACUUM_IS_ER_LOG_LEVEL_SET (er_log_level)) \
67  _er_log_debug (ARG_FILE_LINE, "VACUUM " LOG_THREAD_TRAN_MSG ": " msg "\n", \
68  LOG_THREAD_TRAN_ARGS (thread_get_thread_entry_info ()), __VA_ARGS__)
69 #define vacuum_er_log_error(er_log_level, msg, ...) \
70  if (VACUUM_IS_ER_LOG_LEVEL_SET (VACUUM_ER_LOG_ERROR | er_log_level)) \
71  _er_log_debug (ARG_FILE_LINE, "VACUUM ERROR " LOG_THREAD_TRAN_MSG ": " msg "\n", \
72  LOG_THREAD_TRAN_ARGS (thread_get_thread_entry_info ()), __VA_ARGS__)
73 #define vacuum_er_log_warning(er_log_level, msg, ...) \
74  if (VACUUM_IS_ER_LOG_LEVEL_SET (VACUUM_ER_LOG_WARNING | er_log_level)) \
75  _er_log_debug (ARG_FILE_LINE, "VACUUM WARNING " LOG_THREAD_TRAN_MSG ": " msg "\n", \
76  LOG_THREAD_TRAN_ARGS (thread_get_thread_entry_info ()), __VA_ARGS__)
77 
78 #define VACUUM_LOG_ADD_DROPPED_FILE_POSTPONE true
79 #define VACUUM_LOG_ADD_DROPPED_FILE_UNDO false
80 
81 /* number of log pages in each vacuum block */
82 #define VACUUM_LOG_BLOCK_PAGES_DEFAULT 31
83 
84 /* VACUUM_WORKER_STATE - State of vacuum workers */
86 {
87  VACUUM_WORKER_STATE_INACTIVE, /* Vacuum worker is inactive */
88  VACUUM_WORKER_STATE_PROCESS_LOG, /* Vacuum worker processes log data */
89  VACUUM_WORKER_STATE_EXECUTE, /* Vacuum worker executes cleanup based on processed data */
90 };
92 
93 struct log_tdes;
94 struct log_zip;
95 
96 /* VACUUM_HEAP_OBJECT - Required information on each object to be vacuumed. */
99 {
100  VFID vfid; /* File ID of heap file. */
101  OID oid; /* Object OID. */
102 };
103 
104 /* VACUUM_WORKER - Vacuum worker information */
107 {
108  VACUUM_WORKER_STATE state; /* Current worker state */
109  INT32 drop_files_version; /* Last checked dropped files version */
110 
111  /* Buffers that need to be persistent over vacuum jobs (to avoid memory reallocation). */
112  struct log_zip *log_zip_p; /* Zip structure used to unzip log data */
113 
114  VACUUM_HEAP_OBJECT *heap_objects; /* Heap objects collected during a vacuum job. */
115  int heap_objects_capacity; /* Capacity of heap objects buffer. */
116  int n_heap_objects; /* Number of stored heap objects. */
117 
118  char *undo_data_buffer; /* Buffer to save log undo data */
119  int undo_data_buffer_capacity; /* Capacity of log undo data buffer */
120 
121  // page buffer private lru list
123 
124  char *prefetch_log_buffer; /* buffer for prefetching log pages */
125  LOG_PAGEID prefetch_first_pageid; /* first prefetched log pageid */
126  LOG_PAGEID prefetch_last_pageid; /* last prefetch log pageid */
127 
129 };
130 
131 #define VACUUM_MAX_WORKER_COUNT 50
132 
133 // inline vacuum functions replacing old macros
145 
146 /* Get vacuum worker from thread entry */
149 {
150  assert (vacuum_is_thread_vacuum (thread_p));
151  return thread_p->vacuum_worker;
152 }
153 
154 bool
156 {
157  assert (thread_p != NULL);
158  return thread_p != NULL && (thread_p->type == TT_VACUUM_MASTER || thread_p->type == TT_VACUUM_WORKER);
159 }
160 
161 bool
163 {
164  assert (thread_p != NULL);
165  return thread_p != NULL && thread_p->type == TT_VACUUM_WORKER;
166 }
167 
168 bool
170 {
171  assert (thread_p != NULL);
172  return thread_p != NULL && thread_p->type == TT_VACUUM_MASTER;
173 }
174 
175 /* Get a vacuum worker's state */
178 {
179  return vacuum_get_vacuum_worker (thread_p)->state;
180 }
181 
182 /* Set a vacuum worker's state */
183 void
185 {
186  vacuum_get_vacuum_worker (thread_p)->state = state;
187 }
188 
189 bool
191 {
193 }
194 
195 bool
197 {
199 }
200 
201 bool
203 {
205 }
206 
207 // todo: remove me; check LOG_CS_OWN
208 bool
210 {
211  return vacuum_is_thread_vacuum (thread_p) && vacuum_worker_state_is_process_log (thread_p);
212 }
213 
214 //todo: remove me; many references
215 #define VACUUM_IS_THREAD_VACUUM vacuum_is_thread_vacuum
216 #define VACUUM_IS_THREAD_VACUUM_WORKER vacuum_is_thread_vacuum_worker
217 #define VACUUM_IS_THREAD_VACUUM_MASTER vacuum_is_thread_vacuum_master
218 
219 extern int vacuum_initialize (THREAD_ENTRY * thread_p, int vacuum_log_block_npages, VFID * vacuum_data_vfid,
220  VFID * dropped_files_vfid, bool is_restore);
221 extern void vacuum_finalize (THREAD_ENTRY * thread_p);
222 extern int vacuum_boot (THREAD_ENTRY * thread_p);
223 extern void vacuum_stop_workers (THREAD_ENTRY * thread_p);
224 extern void vacuum_stop_master (THREAD_ENTRY * thread_p);
225 extern int xvacuum (THREAD_ENTRY * thread_p);
226 extern void xvacuum_dump (THREAD_ENTRY * thread_p, FILE * outfp);
227 
228 extern int vacuum_create_file_for_vacuum_data (THREAD_ENTRY * thread_p, VFID * vacuum_data_vfid);
229 extern int vacuum_data_load_and_recover (THREAD_ENTRY * thread_p);
231 extern void vacuum_produce_log_block_data (THREAD_ENTRY * thread_p);
232 extern int vacuum_consume_buffer_log_blocks (THREAD_ENTRY * thread_p);
234 extern bool vacuum_is_safe_to_remove_archives (void);
235 extern void vacuum_notify_server_crashed (LOG_LSA * recovery_lsa);
236 extern void vacuum_notify_server_shutdown (void);
237 extern int vacuum_rv_redo_vacuum_complete (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
238 extern int vacuum_rv_redo_initialize_data_page (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
239 extern int vacuum_rv_redo_data_finished (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
240 extern void vacuum_rv_redo_data_finished_dump (FILE * fp, int length, void *data);
241 extern int vacuum_rv_undoredo_data_set_link (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
242 extern void vacuum_rv_undoredo_data_set_link_dump (FILE * fp, int length, void *data);
243 extern int vacuum_rv_redo_append_data (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
244 extern void vacuum_rv_redo_append_data_dump (FILE * fp, int length, void *data);
245 extern int vacuum_rv_redo_start_job (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
246 
247 extern int vacuum_heap_page (THREAD_ENTRY * thread_p, VACUUM_HEAP_OBJECT * heap_objects, int n_heap_objects,
248  MVCCID threshold_mvccid, HFID * hfid, bool * reusable, bool was_interrupted);
249 extern int vacuum_rv_redo_vacuum_heap_page (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
250 extern int vacuum_rv_redo_remove_ovf_insid (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
251 extern int vacuum_rv_undo_vacuum_heap_record (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
252 extern int vacuum_rv_redo_vacuum_heap_record (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
253 
254 extern int vacuum_create_file_for_dropped_files (THREAD_ENTRY * thread_p, VFID * dropped_files_vfid);
255 extern int vacuum_load_dropped_files_from_disk (THREAD_ENTRY * thread_p);
256 extern int vacuum_is_file_dropped (THREAD_ENTRY * thread_p, bool * is_file_dropped, VFID * vfid, MVCCID mvccid);
257 extern int vacuum_rv_notify_dropped_file (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
258 extern void vacuum_log_add_dropped_file (THREAD_ENTRY * thread_p, const VFID * vfid, const OID * class_oid,
259  bool postpone_or_undo);
260 extern int vacuum_rv_redo_add_dropped_file (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
261 extern int vacuum_rv_undo_add_dropped_file (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
262 extern int vacuum_rv_replace_dropped_file (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
263 extern int vacuum_rv_redo_cleanup_dropped_files (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
264 extern int vacuum_rv_set_next_page_dropped_files (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
265 
266 extern DISK_ISVALID vacuum_check_not_vacuumed_recdes (THREAD_ENTRY * thread_p, OID * oid, OID * class_oid,
267  RECDES * recdes, int btree_node_type);
268 extern DISK_ISVALID vacuum_check_not_vacuumed_rec_header (THREAD_ENTRY * thread_p, OID * oid, OID * class_oid,
269  MVCC_REC_HEADER * rec_header, int btree_node_type);
270 extern bool vacuum_is_mvccid_vacuumed (MVCCID id);
271 extern int vacuum_rv_check_at_undo (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, INT16 slotid, INT16 rec_type);
272 
273 extern int vacuum_rv_es_nop (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
274 #if defined (SERVER_MODE)
275 extern void vacuum_notify_es_deleted (THREAD_ENTRY * thread_p, const char *uri);
276 #endif /* SERVER_MODE */
277 
278 extern int vacuum_reset_data_after_copydb (THREAD_ENTRY * thread_p);
279 
280 extern void vacuum_sa_reflect_last_blockid (THREAD_ENTRY * thread_p);
281 #endif /* _VACUUM_H_ */
char * PAGE_PTR
int vacuum_rv_undo_vacuum_heap_record(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: vacuum.c:7422
LOG_PAGEID prefetch_last_pageid
Definition: vacuum.h:126
int vacuum_reset_data_after_copydb(THREAD_ENTRY *thread_p)
Definition: vacuum.c:7849
#define __attribute__(X)
Definition: porting.h:36
bool vacuum_is_safe_to_remove_archives(void)
Definition: vacuum.c:5650
VACUUM_HEAP_OBJECT * heap_objects
Definition: vacuum.h:114
void vacuum_rv_redo_data_finished_dump(FILE *fp, int length, void *data)
Definition: vacuum.c:4965
enum vacuum_worker_state VACUUM_WORKER_STATE
Definition: vacuum.h:91
DISK_ISVALID vacuum_check_not_vacuumed_recdes(THREAD_ENTRY *thread_p, OID *oid, OID *class_oid, RECDES *recdes, int btree_node_type)
Definition: vacuum.c:7255
int private_lru_index
Definition: vacuum.h:122
#define ALWAYS_INLINE
int vacuum_load_dropped_files_from_disk(THREAD_ENTRY *thread_p)
Definition: vacuum.c:4261
LOG_PAGEID prefetch_first_pageid
Definition: vacuum.h:125
VACUUM_LOG_BLOCKID vacuum_get_log_blockid(LOG_PAGEID pageid)
Definition: vacuum.c:5612
int vacuum_data_load_and_recover(THREAD_ENTRY *thread_p)
Definition: vacuum.c:4095
int vacuum_consume_buffer_log_blocks(THREAD_ENTRY *thread_p)
Definition: vacuum.c:5006
int vacuum_initialize(THREAD_ENTRY *thread_p, int vacuum_log_block_npages, VFID *vacuum_data_vfid, VFID *dropped_files_vfid, bool is_restore)
Definition: vacuum.c:1160
int undo_data_buffer_capacity
Definition: vacuum.h:119
int vacuum_rv_undoredo_data_set_link(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: vacuum.c:5271
bool vacuum_is_mvccid_vacuumed(MVCCID id)
Definition: vacuum.c:7361
int vacuum_rv_es_nop(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: vacuum.c:7774
struct log_zip * log_zip_p
Definition: vacuum.h:112
char * undo_data_buffer
Definition: vacuum.h:118
void vacuum_notify_server_shutdown(void)
Definition: vacuum.c:7480
DISK_ISVALID vacuum_check_not_vacuumed_rec_header(THREAD_ENTRY *thread_p, OID *oid, OID *class_oid, MVCC_REC_HEADER *rec_header, int btree_node_type)
Definition: vacuum.c:7314
int vacuum_rv_redo_vacuum_heap_record(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: vacuum.c:7437
void vacuum_sa_reflect_last_blockid(THREAD_ENTRY *thread_p)
Definition: vacuum.c:7647
int heap_objects_capacity
Definition: vacuum.h:115
void vacuum_rv_undoredo_data_set_link_dump(FILE *fp, int length, void *data)
Definition: vacuum.c:5301
STATIC_INLINE bool vacuum_is_thread_vacuum_master(const THREAD_ENTRY *thread_p) __attribute__((ALWAYS_INLINE))
Definition: vacuum.h:169
void THREAD_ENTRY
STATIC_INLINE VACUUM_WORKER * vacuum_get_vacuum_worker(THREAD_ENTRY *thread_p) __attribute__((ALWAYS_INLINE))
Definition: vacuum.h:148
STATIC_INLINE bool vacuum_is_process_log_for_vacuum(THREAD_ENTRY *thread_p) __attribute__((ALWAYS_INLINE))
Definition: vacuum.h:209
int vacuum_rv_redo_vacuum_complete(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: vacuum.c:3144
int vacuum_create_file_for_vacuum_data(THREAD_ENTRY *thread_p, VFID *vacuum_data_vfid)
Definition: vacuum.c:4357
STATIC_INLINE bool vacuum_worker_state_is_inactive(THREAD_ENTRY *thread_p) __attribute__((ALWAYS_INLINE))
Definition: vacuum.h:190
#define assert(x)
void vacuum_notify_server_crashed(LOG_LSA *recovery_lsa)
Definition: vacuum.c:7468
std::int64_t VACUUM_LOG_BLOCKID
Definition: log_storage.hpp:91
int n_heap_objects
Definition: vacuum.h:116
#define STATIC_INLINE
int xvacuum(THREAD_ENTRY *thread_p)
Definition: vacuum.c:962
int vacuum_rv_redo_add_dropped_file(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: vacuum.c:6065
void xvacuum_dump(THREAD_ENTRY *thread_p, FILE *outfp)
Definition: vacuum.c:1104
int vacuum_rv_redo_initialize_data_page(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: vacuum.c:4432
STATIC_INLINE bool vacuum_is_thread_vacuum(const THREAD_ENTRY *thread_p) __attribute__((ALWAYS_INLINE))
Definition: vacuum.h:155
int vacuum_rv_redo_data_finished(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: vacuum.c:4896
INT64 LOG_PAGEID
#define NULL
Definition: freelistheap.h:34
UINT64 MVCCID
void vacuum_produce_log_block_data(THREAD_ENTRY *thread_p)
Definition: vacuum.c:2867
int vacuum_is_file_dropped(THREAD_ENTRY *thread_p, bool *is_file_dropped, VFID *vfid, MVCCID mvccid)
Definition: vacuum.c:6485
int vacuum_heap_page(THREAD_ENTRY *thread_p, VACUUM_HEAP_OBJECT *heap_objects, int n_heap_objects, MVCCID threshold_mvccid, HFID *hfid, bool *reusable, bool was_interrupted)
Definition: vacuum.c:1546
LOG_PAGEID vacuum_min_log_pageid_to_keep(THREAD_ENTRY *thread_p)
Definition: vacuum.c:5625
void vacuum_stop_workers(THREAD_ENTRY *thread_p)
Definition: vacuum.c:1332
VACUUM_WORKER_STATE state
Definition: vacuum.h:108
STATIC_INLINE bool vacuum_worker_state_is_process_log(THREAD_ENTRY *thread_p) __attribute__((ALWAYS_INLINE))
Definition: vacuum.h:196
INT32 drop_files_version
Definition: vacuum.h:109
void vacuum_stop_master(THREAD_ENTRY *thread_p)
Definition: vacuum.c:1359
char * prefetch_log_buffer
Definition: vacuum.h:124
int vacuum_boot(THREAD_ENTRY *thread_p)
Definition: vacuum.c:1261
int vacuum_rv_notify_dropped_file(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: vacuum.c:6289
int vacuum_rv_redo_start_job(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: vacuum.c:5663
STATIC_INLINE bool vacuum_worker_state_is_execute(THREAD_ENTRY *thread_p) __attribute__((ALWAYS_INLINE))
Definition: vacuum.h:202
int vacuum_rv_redo_cleanup_dropped_files(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: vacuum.c:6652
int vacuum_rv_redo_append_data(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: vacuum.c:5321
int vacuum_rv_redo_remove_ovf_insid(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: vacuum.c:2831
int vacuum_rv_set_next_page_dropped_files(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: vacuum.c:6732
void vacuum_finalize(THREAD_ENTRY *thread_p)
Definition: vacuum.c:1385
void vacuum_rv_redo_append_data_dump(FILE *fp, int length, void *data)
Definition: vacuum.c:5346
int vacuum_create_file_for_dropped_files(THREAD_ENTRY *thread_p, VFID *dropped_files_vfid)
Definition: vacuum.c:4456
int vacuum_rv_undo_add_dropped_file(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: vacuum.c:6133
STATIC_INLINE bool vacuum_is_thread_vacuum_worker(const THREAD_ENTRY *thread_p) __attribute__((ALWAYS_INLINE))
Definition: vacuum.h:162
int vacuum_rv_redo_vacuum_heap_page(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: vacuum.c:2682
int vacuum_rv_check_at_undo(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, INT16 slotid, INT16 rec_type)
Definition: vacuum.c:7525
int vacuum_rv_replace_dropped_file(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
Definition: vacuum.c:6167
STATIC_INLINE void vacuum_set_worker_state(THREAD_ENTRY *thread_p, VACUUM_WORKER_STATE state) __attribute__((ALWAYS_INLINE))
Definition: vacuum.h:184
DISK_ISVALID
Definition: disk_manager.h:53
void vacuum_log_add_dropped_file(THREAD_ENTRY *thread_p, const VFID *vfid, const OID *class_oid, bool postpone_or_undo)
Definition: vacuum.c:6024
bool allocated_resources
Definition: vacuum.h:128
STATIC_INLINE VACUUM_WORKER_STATE vacuum_get_worker_state(THREAD_ENTRY *thread_p) __attribute__((ALWAYS_INLINE))
Definition: vacuum.h:177
vacuum_worker_state
Definition: vacuum.h:85