PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
pg_upgrade.h
Go to the documentation of this file.
1 /*
2  * pg_upgrade.h
3  *
4  * Copyright (c) 2010-2017, PostgreSQL Global Development Group
5  * src/bin/pg_upgrade/pg_upgrade.h
6  */
7 
8 #include <unistd.h>
9 #include <assert.h>
10 #include <sys/stat.h>
11 #include <sys/time.h>
12 
13 #include "libpq-fe.h"
14 
15 /* Use port in the private/dynamic port number range */
16 #define DEF_PGUPORT 50432
17 
18 /* Allocate for null byte */
19 #define USER_NAME_SIZE 128
20 
21 #define MAX_STRING 1024
22 #define LINE_ALLOC 4096
23 #define QUERY_ALLOC 8192
24 
25 #define MIGRATOR_API_VERSION 1
26 
27 #define MESSAGE_WIDTH 60
28 
29 #define GET_MAJOR_VERSION(v) ((v) / 100)
30 
31 /* contains both global db information and CREATE DATABASE commands */
32 #define GLOBALS_DUMP_FILE "pg_upgrade_dump_globals.sql"
33 #define DB_DUMP_FILE_MASK "pg_upgrade_dump_%u.custom"
34 
35 #define DB_DUMP_LOG_FILE_MASK "pg_upgrade_dump_%u.log"
36 #define SERVER_LOG_FILE "pg_upgrade_server.log"
37 #define UTILITY_LOG_FILE "pg_upgrade_utility.log"
38 #define INTERNAL_LOG_FILE "pg_upgrade_internal.log"
39 
40 extern char *output_files[];
41 
42 /*
43  * WIN32 files do not accept writes from multiple processes
44  *
45  * On Win32, we can't send both pg_upgrade output and command output to the
46  * same file because we get the error: "The process cannot access the file
47  * because it is being used by another process." so send the pg_ctl
48  * command-line output to a new file, rather than into the server log file.
49  * Ideally we could use UTILITY_LOG_FILE for this, but some Windows platforms
50  * keep the pg_ctl output file open by the running postmaster, even after
51  * pg_ctl exits.
52  *
53  * We could use the Windows pgwin32_open() flags to allow shared file
54  * writes but is unclear how all other tools would use those flags, so
55  * we just avoid it and log a little differently on Windows; we adjust
56  * the error message appropriately.
57  */
58 #ifndef WIN32
59 #define SERVER_START_LOG_FILE SERVER_LOG_FILE
60 #define SERVER_STOP_LOG_FILE SERVER_LOG_FILE
61 #else
62 #define SERVER_START_LOG_FILE "pg_upgrade_server_start.log"
63 /*
64  * "pg_ctl start" keeps SERVER_START_LOG_FILE and SERVER_LOG_FILE open
65  * while the server is running, so we use UTILITY_LOG_FILE for "pg_ctl
66  * stop".
67  */
68 #define SERVER_STOP_LOG_FILE UTILITY_LOG_FILE
69 #endif
70 
71 
72 #ifndef WIN32
73 #define pg_mv_file rename
74 #define pg_link_file link
75 #define PATH_SEPARATOR '/'
76 #define PATH_QUOTE '\''
77 #define RM_CMD "rm -f"
78 #define RMDIR_CMD "rm -rf"
79 #define SCRIPT_PREFIX "./"
80 #define SCRIPT_EXT "sh"
81 #define ECHO_QUOTE "'"
82 #define ECHO_BLANK ""
83 #else
84 #define pg_mv_file pgrename
85 #define pg_link_file win32_pghardlink
86 #define PATH_SEPARATOR '\\'
87 #define PATH_QUOTE '"'
88 #define RM_CMD "DEL /q"
89 #define RMDIR_CMD "RMDIR /s/q"
90 #define SCRIPT_PREFIX ""
91 #define SCRIPT_EXT "bat"
92 #define EXE_EXT ".exe"
93 #define ECHO_QUOTE ""
94 #define ECHO_BLANK "."
95 #endif
96 
97 #define CLUSTER_NAME(cluster) ((cluster) == &old_cluster ? "old" : \
98  (cluster) == &new_cluster ? "new" : "none")
99 
100 /* OID system catalog preservation added during PG 9.0 development */
101 #define TABLE_SPACE_SUBDIRS_CAT_VER 201001111
102 /* postmaster/postgres -b (binary_upgrade) flag added during PG 9.1 development */
103 #define BINARY_UPGRADE_SERVER_FLAG_CAT_VER 201104251
104 /*
105  * Visibility map changed with this 9.2 commit,
106  * 8f9fe6edce358f7904e0db119416b4d1080a83aa; pick later catalog version.
107  */
108 #define VISIBILITY_MAP_CRASHSAFE_CAT_VER 201107031
109 
110 /*
111  * The format of visibility map is changed with this 9.6 commit,
112  */
113 #define VISIBILITY_MAP_FROZEN_BIT_CAT_VER 201603011
114 /*
115  * pg_multixact format changed in 9.3 commit 0ac5ad5134f2769ccbaefec73844f85,
116  * ("Improve concurrency of foreign key locking") which also updated catalog
117  * version to this value. pg_upgrade behavior depends on whether old and new
118  * server versions are both newer than this, or only the new one is.
119  */
120 #define MULTIXACT_FORMATCHANGE_CAT_VER 201301231
121 
122 /*
123  * large object chunk size added to pg_controldata,
124  * commit 5f93c37805e7485488480916b4585e098d3cc883
125  */
126 #define LARGE_OBJECT_SIZE_PG_CONTROL_VER 942
127 
128 /*
129  * change in JSONB format during 9.4 beta
130  */
131 #define JSONB_FORMAT_CHANGE_CAT_VER 201409291
132 
133 /*
134  * Each relation is represented by a relinfo structure.
135  */
136 typedef struct
137 {
138  /* Can't use NAMEDATALEN; not guaranteed to be same on client */
139  char *nspname; /* namespace name */
140  char *relname; /* relation name */
141  Oid reloid; /* relation OID */
142  Oid relfilenode; /* relation relfile node */
143  Oid indtable; /* if index, OID of its table, else 0 */
144  Oid toastheap; /* if toast table, OID of base table, else 0 */
145  char *tablespace; /* tablespace path; "" for cluster default */
146  bool nsp_alloc; /* should nspname be freed? */
147  bool tblsp_alloc; /* should tablespace be freed? */
148 } RelInfo;
149 
150 typedef struct
151 {
153  int nrels;
154 } RelInfoArr;
155 
156 /*
157  * The following structure represents a relation mapping.
158  */
159 typedef struct
160 {
161  const char *old_tablespace;
162  const char *new_tablespace;
167 
168  /*
169  * old/new relfilenodes might differ for pg_largeobject(_metadata) indexes
170  * due to VACUUM FULL or REINDEX. Other relfilenodes are preserved.
171  */
174  /* the rest are used only for logging and error reporting */
175  char *nspname; /* namespaces */
176  char *relname;
177 } FileNameMap;
178 
179 /*
180  * Structure to store database information
181  */
182 typedef struct
183 {
184  Oid db_oid; /* oid of the database */
185  char *db_name; /* database name */
186  char db_tablespace[MAXPGPATH]; /* database default tablespace
187  * path */
188  char *db_collate;
189  char *db_ctype;
191  RelInfoArr rel_arr; /* array of all user relinfos */
192 } DbInfo;
193 
194 typedef struct
195 {
196  DbInfo *dbs; /* array of db infos */
197  int ndbs; /* number of db infos */
198 } DbInfoArr;
199 
200 /*
201  * The following structure is used to hold pg_control information.
202  * Rather than using the backend's control structure we use our own
203  * structure to avoid pg_control version issues between releases.
204  */
205 typedef struct
206 {
209  char nextxlogfile[25];
228 } ControlData;
229 
230 /*
231  * Enumeration to denote link modes
232  */
233 typedef enum
234 {
237 } transferMode;
238 
239 /*
240  * Enumeration to denote pg_log modes
241  */
242 typedef enum
243 {
249 } eLogType;
250 
251 
252 typedef long pgpid_t;
253 
254 
255 /*
256  * cluster
257  *
258  * information about each cluster
259  */
260 typedef struct
261 {
262  ControlData controldata; /* pg_control information */
263  DbInfoArr dbarr; /* dbinfos array */
264  char *pgdata; /* pathname for cluster's $PGDATA directory */
265  char *pgconfig; /* pathname for cluster's config file
266  * directory */
267  char *bindir; /* pathname for cluster's executable directory */
268  char *pgopts; /* options to pass to the server, like pg_ctl
269  * -o */
270  char *sockdir; /* directory for Unix Domain socket, if any */
271  unsigned short port; /* port number where postmaster is waiting */
272  uint32 major_version; /* PG_VERSION of cluster */
273  char major_version_str[64]; /* string PG_VERSION of cluster */
274  uint32 bin_version; /* version returned from pg_ctl */
275  const char *tablespace_suffix; /* directory specification */
276 } ClusterInfo;
277 
278 
279 /*
280  * LogOpts
281 */
282 typedef struct
283 {
284  FILE *internal; /* internal log FILE */
285  bool verbose; /* TRUE -> be verbose in messages */
286  bool retain; /* retain log files on success */
287 } LogOpts;
288 
289 
290 /*
291  * UserOpts
292 */
293 typedef struct
294 {
295  bool check; /* TRUE -> ask user for permission to make
296  * changes */
297  transferMode transfer_mode; /* copy files or link them? */
298  int jobs;
299 } UserOpts;
300 
301 
302 /*
303  * OSInfo
304  */
305 typedef struct
306 {
307  const char *progname; /* complete pathname for this program */
308  char *exec_path; /* full path to my executable */
309  char *user; /* username for clusters */
310  bool user_specified; /* user specified on command-line */
311  char **old_tablespaces; /* tablespaces */
313  char **libraries; /* loadable libraries */
316 } OSInfo;
317 
318 
319 /*
320  * Global variables
321  */
322 extern LogOpts log_opts;
323 extern UserOpts user_opts;
324 extern ClusterInfo old_cluster,
325  new_cluster;
326 extern OSInfo os_info;
327 
328 
329 /* check.c */
330 
331 void output_check_banner(bool live_check);
332 void check_and_dump_old_cluster(bool live_check);
333 void check_new_cluster(void);
334 void report_clusters_compatible(void);
335 void issue_warnings(void);
336 void output_completion_banner(char *analyze_script_file_name,
337  char *deletion_script_file_name);
338 void check_cluster_versions(void);
339 void check_cluster_compatibility(bool live_check);
340 void create_script_for_old_cluster_deletion(char **deletion_script_file_name);
341 void create_script_for_cluster_analyze(char **analyze_script_file_name);
342 
343 
344 /* controldata.c */
345 
346 void get_control_data(ClusterInfo *cluster, bool live_check);
347 void check_control_data(ControlData *oldctrl, ControlData *newctrl);
348 void disable_old_cluster(void);
349 
350 
351 /* dump.c */
352 
353 void generate_old_dump(void);
354 
355 
356 /* exec.c */
357 
358 #define EXEC_PSQL_ARGS "--echo-queries --set ON_ERROR_STOP=on --no-psqlrc --dbname=template1"
359 
360 bool exec_prog(const char *log_file, const char *opt_log_file,
361  bool throw_error, const char *fmt,...) pg_attribute_printf(4, 5);
362 void verify_directories(void);
363 bool pid_lock_file_exists(const char *datadir);
364 
365 
366 /* file.c */
367 
368 void copyFile(const char *src, const char *dst,
369  const char *schemaName, const char *relName);
370 void linkFile(const char *src, const char *dst,
371  const char *schemaName, const char *relName);
372 void rewriteVisibilityMap(const char *fromfile, const char *tofile,
373  const char *schemaName, const char *relName);
374 void check_hard_link(void);
375 FILE *fopen_priv(const char *path, const char *mode);
376 
377 /* function.c */
378 
379 void get_loadable_libraries(void);
380 void check_loadable_libraries(void);
381 
382 /* info.c */
383 
385  DbInfo *new_db, int *nmaps, const char *old_pgdata,
386  const char *new_pgdata);
388 void print_maps(FileNameMap *maps, int n,
389  const char *db_name);
390 
391 /* option.c */
392 
393 void parseCommandLine(int argc, char *argv[]);
394 void adjust_data_dir(ClusterInfo *cluster);
395 void get_sock_dir(ClusterInfo *cluster, bool live_check);
396 
397 /* relfilenode.c */
398 
399 void transfer_all_new_tablespaces(DbInfoArr *old_db_arr,
400  DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata);
401 void transfer_all_new_dbs(DbInfoArr *old_db_arr,
402  DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata,
403  char *old_tablespace);
404 
405 /* tablespace.c */
406 
407 void init_tablespaces(void);
408 
409 
410 /* server.c */
411 
412 PGconn *connectToServer(ClusterInfo *cluster, const char *db_name);
413 PGresult *executeQueryOrDie(PGconn *conn, const char *fmt,...) pg_attribute_printf(2, 3);
414 
415 char *cluster_conn_opts(ClusterInfo *cluster);
416 
417 bool start_postmaster(ClusterInfo *cluster, bool throw_error);
418 void stop_postmaster(bool fast);
420 void check_pghost_envvar(void);
421 
422 
423 /* util.c */
424 
425 char *quote_identifier(const char *s);
426 int get_user_info(char **user_name_p);
427 void check_ok(void);
428 void report_status(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3);
429 void pg_log(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3);
430 void pg_fatal(const char *fmt,...) pg_attribute_printf(1, 2) pg_attribute_noreturn();
431 void end_progress_output(void);
432 void prep_status(const char *fmt,...) pg_attribute_printf(1, 2);
433 void check_ok(void);
434 unsigned int str2uint(const char *str);
435 void pg_putenv(const char *var, const char *val);
436 
437 
438 /* version.c */
439 
441  bool check_mode);
444 
445 /* parallel.c */
446 void parallel_exec_prog(const char *log_file, const char *opt_log_file,
447  const char *fmt,...) pg_attribute_printf(3, 4);
448 void parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
449  char *old_pgdata, char *new_pgdata,
450  char *old_tablespace);
451 bool reap_child(bool wait_for_child);
void copyFile(const char *src, const char *dst, const char *schemaName, const char *relName)
Definition: file.c:34
uint32 get_major_server_version(ClusterInfo *cluster)
Definition: server.c:155
bool date_is_int
Definition: pg_upgrade.h:225
void transfer_all_new_tablespaces(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata)
Definition: relfilenode.c:30
Oid old_relfilenode
Definition: pg_upgrade.h:172
void report_clusters_compatible(void)
Definition: check.c:153
uint32 major_version
Definition: pg_upgrade.h:272
bool void verify_directories(void)
Definition: exec.c:247
unsigned int str2uint(const char *str)
Definition: util.c:241
void transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata, char *old_tablespace)
Definition: relfilenode.c:81
ClusterInfo old_cluster
Definition: pg_upgrade.c:56
void check_new_cluster(void)
Definition: check.c:134
ControlData controldata
Definition: pg_upgrade.h:262
long pgpid_t
Definition: pg_upgrade.h:252
uint32 chkpnt_nxtoid
Definition: pg_upgrade.h:212
static char * log_file
Definition: pg_ctl.c:83
int num_libraries
Definition: pg_upgrade.h:314
int get_user_info(char **user_name_p)
Definition: util.c:212
uint32 walsz
Definition: pg_upgrade.h:219
void rewriteVisibilityMap(const char *fromfile, const char *tofile, const char *schemaName, const char *relName)
Definition: file.c:129
void check_cluster_compatibility(bool live_check)
Definition: check.c:256
PGresult * executeQueryOrDie(PGconn *conn, const char *fmt,...) pg_attribute_printf(2
bool exec_prog(const char *log_file, const char *opt_log_file, bool throw_error, const char *fmt,...) pg_attribute_printf(4
void end_progress_output(void)
Definition: util.c:44
char * relname
Definition: pg_upgrade.h:140
unsigned short port
Definition: pg_upgrade.h:271
void void void pg_fatal(const char *fmt,...) pg_attribute_printf(1
bool tblsp_alloc
Definition: pg_upgrade.h:147
PGresult char * cluster_conn_opts(ClusterInfo *cluster)
Definition: server.c:88
uint32 index
Definition: pg_upgrade.h:222
LogOpts log_opts
Definition: util.c:18
Oid new_db_oid
Definition: pg_upgrade.h:166
Oid reloid
Definition: pg_upgrade.h:141
unsigned int Oid
Definition: postgres_ext.h:31
void generate_old_dump(void)
Definition: dump.c:18
int jobs
Definition: pg_upgrade.h:298
char * nspname
Definition: pg_upgrade.h:139
Oid db_oid
Definition: pg_upgrade.h:184
bool user_specified
Definition: pg_upgrade.h:310
#define pg_attribute_printf(f, a)
Definition: c.h:638
char * pgopts
Definition: pg_upgrade.h:268
void stop_postmaster(bool fast)
Definition: server.c:308
FILE * fopen_priv(const char *path, const char *mode)
Definition: file.c:321
uint32 chkpnt_nxtmxoff
Definition: pg_upgrade.h:214
void check_pghost_envvar(void)
Definition: server.c:335
void check_loadable_libraries(void)
Definition: function.c:203
char * db_ctype
Definition: pg_upgrade.h:189
uint32 blocksz
Definition: pg_upgrade.h:217
uint32 chkpnt_nxtxid
Definition: pg_upgrade.h:210
void get_control_data(ClusterInfo *cluster, bool live_check)
Definition: controldata.c:34
char * pgconfig
Definition: pg_upgrade.h:265
const char * old_tablespace
Definition: pg_upgrade.h:161
void print_maps(FileNameMap *maps, int n, const char *db_name)
Definition: info.c:285
Oid new_relfilenode
Definition: pg_upgrade.h:173
eLogType
Definition: logging.h:22
PGconn * conn
Definition: streamutil.c:42
uint32 chkpnt_nxtepoch
Definition: pg_upgrade.h:211
#define MAXPGPATH
RelInfo * rels
Definition: pg_upgrade.h:152
Oid relfilenode
Definition: pg_upgrade.h:142
bool reap_child(bool wait_for_child)
Definition: parallel.c:290
void disable_old_cluster(void)
Definition: controldata.c:606
char ** libraries
Definition: pg_upgrade.h:313
bool data_checksum_version
Definition: pg_upgrade.h:227
ClusterInfo new_cluster
Definition: pg_upgrade.c:56
void create_script_for_old_cluster_deletion(char **deletion_script_file_name)
Definition: check.c:504
void void void pg_attribute_noreturn()
void prep_status(const char *fmt,...) pg_attribute_printf(1
void new_9_0_populate_pg_largeobject_metadata(ClusterInfo *cluster, bool check_mode)
Definition: version.c:25
uint32 ident
Definition: pg_upgrade.h:221
void check_control_data(ControlData *oldctrl, ControlData *newctrl)
Definition: controldata.c:549
char * datadir
char * output_files[]
Definition: pg_upgrade.c:60
unsigned int uint32
Definition: c.h:268
void cluster(ClusterStmt *stmt, bool isTopLevel)
Definition: cluster.c:106
uint32 align
Definition: pg_upgrade.h:216
void issue_warnings(void)
Definition: check.c:170
void check_ok(void)
Definition: util.c:172
void output_completion_banner(char *analyze_script_file_name, char *deletion_script_file_name)
Definition: check.c:183
PGconn * connectToServer(ClusterInfo *cluster, const char *db_name)
Definition: server.c:27
const char * old_tablespace_suffix
Definition: pg_upgrade.h:163
transferMode transfer_mode
Definition: pg_upgrade.h:297
uint32 chkpnt_oldstMulti
Definition: pg_upgrade.h:215
uint32 walseg
Definition: pg_upgrade.h:220
Oid indtable
Definition: pg_upgrade.h:143
bool verbose
Definition: pg_upgrade.h:285
char * bindir
Definition: pg_upgrade.h:267
void linkFile(const char *src, const char *dst, const char *schemaName, const char *relName)
Definition: file.c:103
void void parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata, char *old_tablespace)
Definition: parallel.c:178
void check_cluster_versions(void)
Definition: check.c:214
uint32 cat_ver
Definition: pg_upgrade.h:208
char ** old_tablespaces
Definition: pg_upgrade.h:311
uint32 chkpnt_nxtmulti
Definition: pg_upgrade.h:213
transferMode
Definition: pg_upgrade.h:233
uint32 largesz
Definition: pg_upgrade.h:218
void get_sock_dir(ClusterInfo *cluster, bool live_check)
Definition: option.c:445
const char * tablespace_suffix
Definition: pg_upgrade.h:275
void check_hard_link(void)
Definition: file.c:282
uint32 bin_version
Definition: pg_upgrade.h:274
DbInfoArr dbarr
Definition: pg_upgrade.h:263
void void pg_log(eLogType type, const char *fmt,...) pg_attribute_printf(2
void output_check_banner(bool live_check)
Definition: check.c:61
FileNameMap * gen_db_file_maps(DbInfo *old_db, DbInfo *new_db, int *nmaps, const char *old_pgdata, const char *new_pgdata)
Definition: info.c:41
Oid old_db_oid
Definition: pg_upgrade.h:165
const char * progname
Definition: pg_upgrade.h:307
uint32 toast
Definition: pg_upgrade.h:223
RelInfoArr rel_arr
Definition: pg_upgrade.h:191
bool pid_lock_file_exists(const char *datadir)
Definition: exec.c:216
OSInfo os_info
Definition: pg_upgrade.c:58
static const pg_conv_map maps[]
void get_loadable_libraries(void)
Definition: function.c:49
void parallel_exec_prog(const char *log_file, const char *opt_log_file, const char *fmt,...) pg_attribute_printf(3
uint32 large_object
Definition: pg_upgrade.h:224
bool check
Definition: pg_upgrade.h:295
char * quote_identifier(const char *s)
Definition: ruleutils.c:10254
char * nspname
Definition: pg_upgrade.h:175
int db_encoding
Definition: pg_upgrade.h:190
uint32 ctrl_ver
Definition: pg_upgrade.h:207
ClusterInfo * running_cluster
Definition: pg_upgrade.h:315
void get_db_and_rel_infos(ClusterInfo *cluster)
Definition: info.c:311
void adjust_data_dir(ClusterInfo *cluster)
Definition: option.c:384
void init_tablespaces(void)
Definition: tablespace.c:19
char * pgdata
Definition: pg_upgrade.h:264
char * sockdir
Definition: pg_upgrade.h:270
UserOpts user_opts
Definition: option.c:29
int num_old_tablespaces
Definition: pg_upgrade.h:312
void report_status(eLogType type, const char *fmt,...) pg_attribute_printf(2
char * tablespace
Definition: pg_upgrade.h:145
char * db_name
Definition: pg_upgrade.h:185
bool nsp_alloc
Definition: pg_upgrade.h:146
void old_9_3_check_for_line_data_type_usage(ClusterInfo *cluster)
Definition: version.c:111
void parseCommandLine(int argc, char *argv[])
Definition: option.c:38
char * db_collate
Definition: pg_upgrade.h:188
bool start_postmaster(ClusterInfo *cluster, bool throw_error)
Definition: server.c:186
void pg_putenv(const char *var, const char *val)
Definition: util.c:254
DbInfo * dbs
Definition: pg_upgrade.h:196
eLogType
Definition: pg_upgrade.h:242
bool retain
Definition: pg_upgrade.h:286
char * user
Definition: pg_upgrade.h:309
void create_script_for_cluster_analyze(char **analyze_script_file_name)
Definition: check.c:414
const char * new_tablespace
Definition: pg_upgrade.h:162
long val
Definition: informix.c:689
bool float8_pass_by_value
Definition: pg_upgrade.h:226
const char * new_tablespace_suffix
Definition: pg_upgrade.h:164
char * relname
Definition: pg_upgrade.h:176
Oid toastheap
Definition: pg_upgrade.h:144
void check_and_dump_old_cluster(bool live_check)
Definition: check.c:77
char * exec_path
Definition: pg_upgrade.h:308
void old_9_6_check_for_unknown_data_type_usage(ClusterInfo *cluster)
Definition: version.c:208