CUBRID Engine  latest
disk_manager.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  * disk_manager.h - Disk management module (at server)
21  */
22 
23 #ifndef _DISK_MANAGER_H_
24 #define _DISK_MANAGER_H_
25 
26 #ident "$Id$"
27 
28 #include "config.h"
29 #include "error_manager.h"
30 #include "log_lsa.hpp"
31 #include "recovery.h"
32 #include "storage_common.h"
33 #include "thread_compat.hpp"
34 
35 #define DISK_VOLHEADER_PAGE 0 /* Page of the volume header */
36 
37 /*
38  * Disk sectors
39  */
40 
41 #define VSID_SET_NULL(vsidp) (vsidp)->sectid = NULL_SECTID; (vsidp)->volid = NULL_VOLID
42 #define VSID_IS_NULL(vsidp) ((vsidp)->sectid == NULL_SECTID || (vsidp)->volid == NULL_VOLID)
43 #define VSID_COPY(dest, src) *((VSID *) dest) = *((VSID *) src)
44 #define VSID_EQ(first, second) ((first)->volid == (second)->volid && (first)->sectid == (second)->sectid)
45 
46 typedef enum
47 {
52 
53 typedef enum
54 {
58 } DISK_ISVALID;
59 
62 {
63  INT32 n_max_sects;
65  INT32 n_free_sects;
66 };
67 #define DISK_VOLUME_SPACE_INFO_INITIALIZER { 0, 0, 0 }
68 
69 #define DISK_SECTS_SIZE(nsects) ((INT64) (nsects) * IO_SECTORSIZE)
70 #define DISK_SECTS_NPAGES(nsects) ((nsects) * DISK_SECTOR_NPAGES)
71 #define DISK_PAGES_TO_SECTS(npages) (CEIL_PTVDIV (npages, DISK_SECTOR_NPAGES))
72 
73 /* structure used to clone disk sector bitmaps to cross check against file tables */
76 {
77  int size_map;
78  char *map;
79 };
80 
81 extern int disk_manager_init (THREAD_ENTRY * thread_p, bool load_form_disk);
82 extern void disk_manager_final (void);
83 
84 extern int disk_format_first_volume (THREAD_ENTRY * thread_p, const char *full_dbname, const char *dbcomments,
85  DKNPAGES npages);
86 extern int disk_add_volume_extension (THREAD_ENTRY * thread_p, DB_VOLPURPOSE purpose, DKNPAGES npages,
87  const char *path, const char *name, const char *comments,
88  int max_write_size_in_sec, bool overwrite, VOLID * volid_out);
89 extern void disk_lock_extend (void);
90 extern void disk_unlock_extend (void);
91 #if defined (SERVER_MODE)
92 /* todo: auto-volume extension thread needs transaction descriptor */
93 extern int disk_auto_expand (THREAD_ENTRY * thread_p);
94 #endif /* SERVER_MODE */
95 extern int disk_unformat (THREAD_ENTRY * thread_p, const char *vol_fullname);
96 extern int disk_set_creation (THREAD_ENTRY * thread_p, INT16 volid, const char *new_vol_fullname,
97  const INT64 * new_dbcreation, const LOG_LSA * new_chkptlsa, bool logchange,
98  DISK_FLUSH_TYPE flush_page);
99 extern int disk_set_link (THREAD_ENTRY * thread_p, INT16 volid, INT16 next_volid, const char *next_volext_fullname,
100  bool logchange, DISK_FLUSH_TYPE flush);
101 extern int disk_set_checkpoint (THREAD_ENTRY * thread_p, INT16 volid, const LOG_LSA * log_chkpt_lsa);
102 extern int disk_set_boot_hfid (THREAD_ENTRY * thread_p, INT16 volid, const HFID * hfid);
103 
104 extern int disk_reserve_sectors (THREAD_ENTRY * thread_p, DB_VOLPURPOSE purpose, VOLID volid_hint, int n_sectors,
105  VSID * reserved_sectors);
106 extern int disk_unreserve_ordered_sectors (THREAD_ENTRY * thread_p, DB_VOLPURPOSE purpose, int nsects, VSID * vsids);
107 extern DISK_ISVALID disk_is_page_sector_reserved (THREAD_ENTRY * thread_p, VOLID volid, PAGEID pageid);
109  bool debug_crash);
110 extern DISK_ISVALID disk_check_sectors_are_reserved (THREAD_ENTRY * thread_p, VSID * vsids, int nsects);
111 
112 extern INT16 xdisk_get_purpose_and_sys_lastpage (THREAD_ENTRY * thread_p, INT16 volid, DISK_VOLPURPOSE * vol_purpose,
113  INT32 * sys_lastpage);
114 extern int disk_get_checkpoint (THREAD_ENTRY * thread_p, INT16 volid, LOG_LSA * vol_lsa);
115 extern int disk_get_creation_time (THREAD_ENTRY * thread_p, INT16 volid, INT64 * db_creation);
116 extern INT32 disk_get_total_numsectors (THREAD_ENTRY * thread_p, INT16 volid);
117 extern HFID *disk_get_boot_hfid (THREAD_ENTRY * thread_p, INT16 volid, HFID * hfid);
118 extern char *disk_get_link (THREAD_ENTRY * thread_p, INT16 volid, INT16 * next_volid, char *next_volext_fullname);
119 extern DISK_ISVALID disk_check (THREAD_ENTRY * thread_p, bool repair);
120 extern int disk_dump_all (THREAD_ENTRY * thread_p, FILE * fp);
121 extern int disk_spacedb (THREAD_ENTRY * thread_p, SPACEDB_ALL * spaceall, SPACEDB_ONEVOL ** spacevols);
122 
123 extern int disk_volume_header_start_scan (THREAD_ENTRY * thread_p, int type, DB_VALUE ** arg_values, int arg_cnt,
124  void **ctx);
125 extern int disk_volume_header_end_scan (THREAD_ENTRY * thread_p, void **ctx);
126 extern SCAN_CODE disk_volume_header_next_scan (THREAD_ENTRY * thread_p, int cursor, DB_VALUE ** out_values, int out_cnt,
127  void *ctx);
128 
129 extern int disk_compare_vsids (const void *a, const void *b);
130 
131 #if defined (SA_MODE)
132 extern int disk_map_clone_create (THREAD_ENTRY * thread_p, DISK_VOLMAP_CLONE ** disk_map_clone);
133 extern void disk_map_clone_free (DISK_VOLMAP_CLONE ** disk_map_clone);
134 extern DISK_ISVALID disk_map_clone_clear (VSID * vsid, DISK_VOLMAP_CLONE * disk_map_clone);
135 extern DISK_ISVALID disk_map_clone_check_leaks (DISK_VOLMAP_CLONE * disk_map_clone);
136 #endif /* SA_MODE */
137 
138 extern int disk_rv_redo_dboutside_newvol (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
139 extern int disk_rv_undo_format (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
140 extern int disk_rv_redo_format (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
141 extern void disk_rv_dump_hdr (FILE * fp, int length_ignore, void *data);
142 extern int disk_rv_redo_init_map (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
143 extern void disk_rv_dump_init_map (FILE * fp, int length_ignore, void *data);
144 extern int disk_rv_undoredo_set_creation_time (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
145 extern void disk_rv_dump_set_creation_time (FILE * fp, int length_ignore, void *data);
146 extern int disk_rv_undoredo_set_boot_hfid (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
147 extern void disk_rv_dump_set_boot_hfid (FILE * fp, int length_ignore, void *data);
148 extern int disk_rv_undoredo_link (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
149 extern void disk_rv_dump_link (FILE * fp, int length_ignore, void *data);
150 extern int disk_rv_redo_volume_expand (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
151 extern void disk_rv_dump_volume_expand (FILE * fp, int length_ignore, void *data);
152 extern int disk_rv_reserve_sectors (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
153 extern int disk_rv_unreserve_sectors (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
154 extern int disk_rv_volhead_extend_redo (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
155 extern int disk_rv_volhead_extend_undo (THREAD_ENTRY * thread_p, LOG_RCV * rcv);
156 
157 #if !defined (NDEBUG)
158 extern void disk_volheader_check_magic (THREAD_ENTRY * thread_p, const PAGE_PTR page_volheader);
159 #endif /* !NDEBUG */
160 
161 extern int disk_sectors_to_extend_npages (const int num_pages);
162 
163 #endif /* _DISK_MANAGER_H_ */
char * PAGE_PTR
void disk_rv_dump_set_creation_time(FILE *fp, int length_ignore, void *data)
DISK_ISVALID disk_is_page_sector_reserved_with_debug_crash(THREAD_ENTRY *thread_p, VOLID volid, PAGEID pageid, bool debug_crash)
SCAN_CODE
INT16 xdisk_get_purpose_and_sys_lastpage(THREAD_ENTRY *thread_p, INT16 volid, DISK_VOLPURPOSE *vol_purpose, INT32 *sys_lastpage)
int disk_rv_volhead_extend_redo(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
DISK_ISVALID disk_check(THREAD_ENTRY *thread_p, bool repair)
int disk_set_boot_hfid(THREAD_ENTRY *thread_p, INT16 volid, const HFID *hfid)
int disk_unformat(THREAD_ENTRY *thread_p, const char *vol_fullname)
Definition: disk_manager.c:820
SCAN_CODE disk_volume_header_next_scan(THREAD_ENTRY *thread_p, int cursor, DB_VALUE **out_values, int out_cnt, void *ctx)
int disk_add_volume_extension(THREAD_ENTRY *thread_p, DB_VOLPURPOSE purpose, DKNPAGES npages, const char *path, const char *name, const char *comments, int max_write_size_in_sec, bool overwrite, VOLID *volid_out)
PAGEID DKNPAGES
DISK_ISVALID disk_check_sectors_are_reserved(THREAD_ENTRY *thread_p, VSID *vsids, int nsects)
INT32 disk_get_total_numsectors(THREAD_ENTRY *thread_p, INT16 volid)
#define DISK_VOLPURPOSE
void disk_unlock_extend(void)
int disk_volume_header_end_scan(THREAD_ENTRY *thread_p, void **ctx)
int disk_sectors_to_extend_npages(const int num_pages)
void disk_rv_dump_init_map(FILE *fp, int length_ignore, void *data)
int disk_spacedb(THREAD_ENTRY *thread_p, SPACEDB_ALL *spaceall, SPACEDB_ONEVOL **spacevols)
char * disk_get_link(THREAD_ENTRY *thread_p, INT16 volid, INT16 *next_volid, char *next_volext_fullname)
int disk_get_checkpoint(THREAD_ENTRY *thread_p, INT16 volid, LOG_LSA *vol_lsa)
int disk_rv_redo_format(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
INT16 VOLID
int disk_rv_volhead_extend_undo(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
HFID * disk_get_boot_hfid(THREAD_ENTRY *thread_p, INT16 volid, HFID *hfid)
int disk_set_creation(THREAD_ENTRY *thread_p, INT16 volid, const char *new_vol_fullname, const INT64 *new_dbcreation, const LOG_LSA *new_chkptlsa, bool logchange, DISK_FLUSH_TYPE flush_page)
Definition: disk_manager.c:850
int disk_rv_redo_init_map(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
void THREAD_ENTRY
int disk_rv_redo_volume_expand(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
int disk_set_link(THREAD_ENTRY *thread_p, INT16 volid, INT16 next_volid, const char *next_volext_fullname, bool logchange, DISK_FLUSH_TYPE flush)
Definition: disk_manager.c:969
DISK_FLUSH_TYPE
Definition: disk_manager.h:46
int disk_rv_redo_dboutside_newvol(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
int disk_rv_undoredo_link(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
int disk_rv_undoredo_set_creation_time(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
void disk_rv_dump_set_boot_hfid(FILE *fp, int length_ignore, void *data)
int disk_dump_all(THREAD_ENTRY *thread_p, FILE *fp)
int disk_rv_unreserve_sectors(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
void disk_volheader_check_magic(THREAD_ENTRY *thread_p, const PAGE_PTR page_volheader)
int disk_manager_init(THREAD_ENTRY *thread_p, bool load_form_disk)
int disk_get_creation_time(THREAD_ENTRY *thread_p, INT16 volid, INT64 *db_creation)
void disk_lock_extend(void)
DB_VOLPURPOSE
Definition: dbtype_def.h:185
int disk_format_first_volume(THREAD_ENTRY *thread_p, const char *full_dbname, const char *dbcomments, DKNPAGES npages)
int disk_rv_undoredo_set_boot_hfid(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
int disk_volume_header_start_scan(THREAD_ENTRY *thread_p, int type, DB_VALUE **arg_values, int arg_cnt, void **ctx)
void disk_rv_dump_hdr(FILE *fp, int length_ignore, void *data)
int disk_reserve_sectors(THREAD_ENTRY *thread_p, DB_VOLPURPOSE purpose, VOLID volid_hint, int n_sectors, VSID *reserved_sectors)
void disk_manager_final(void)
void disk_rv_dump_volume_expand(FILE *fp, int length_ignore, void *data)
DISK_ISVALID disk_is_page_sector_reserved(THREAD_ENTRY *thread_p, VOLID volid, PAGEID pageid)
int disk_compare_vsids(const void *a, const void *b)
void disk_rv_dump_link(FILE *fp, int length_ignore, void *data)
INT32 PAGEID
int disk_unreserve_ordered_sectors(THREAD_ENTRY *thread_p, DB_VOLPURPOSE purpose, int nsects, VSID *vsids)
int disk_rv_reserve_sectors(THREAD_ENTRY *thread_p, LOG_RCV *rcv)
int disk_set_checkpoint(THREAD_ENTRY *thread_p, INT16 volid, const LOG_LSA *log_chkpt_lsa)
DISK_ISVALID
Definition: disk_manager.h:53
int disk_rv_undo_format(THREAD_ENTRY *thread_p, LOG_RCV *rcv)