From e1598a15f4fb0f076a6034d3d3debb9776aff07a Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Wed, 10 Sep 2014 19:23:36 -0400 Subject: [PATCH] pg_upgrade: check for large object size compatibility --- contrib/pg_upgrade/controldata.c | 21 +++++++++++++++++++++ contrib/pg_upgrade/pg_upgrade.h | 7 +++++++ 2 files changed, 28 insertions(+) diff --git a/contrib/pg_upgrade/controldata.c b/contrib/pg_upgrade/controldata.c index 9282b8e88e..d105a59555 100644 --- a/contrib/pg_upgrade/controldata.c +++ b/contrib/pg_upgrade/controldata.c @@ -54,6 +54,7 @@ get_control_data(ClusterInfo *cluster, bool live_check) bool got_ident = false; bool got_index = false; bool got_toast = false; + bool got_large_object = false; bool got_date_is_int = false; bool got_float8_pass_by_value = false; bool got_data_checksum_version = false; @@ -357,6 +358,17 @@ get_control_data(ClusterInfo *cluster, bool live_check) cluster->controldata.toast = str2uint(p); got_toast = true; } + else if ((p = strstr(bufin, "Size of a large-object chunk:")) != NULL) + { + p = strchr(p, ':'); + + if (p == NULL || strlen(p) <= 1) + pg_fatal("%d: controldata retrieval problem\n", __LINE__); + + p++; /* removing ':' char */ + cluster->controldata.large_object = str2uint(p); + got_large_object = true; + } else if ((p = strstr(bufin, "Date/time type storage:")) != NULL) { p = strchr(p, ':'); @@ -475,6 +487,8 @@ get_control_data(ClusterInfo *cluster, bool live_check) !got_tli || !got_align || !got_blocksz || !got_largesz || !got_walsz || !got_walseg || !got_ident || !got_index || !got_toast || + (!got_large_object && + cluster->controldata.cat_ver >= LARGE_OBJECT_SIZE_PG_CONTROL_VER) || !got_date_is_int || !got_float8_pass_by_value || !got_data_checksum_version) { pg_log(PG_REPORT, @@ -527,6 +541,10 @@ get_control_data(ClusterInfo *cluster, bool live_check) if (!got_toast) pg_log(PG_REPORT, " maximum TOAST chunk size\n"); + if (!got_large_object && + cluster->controldata.cat_ver >= LARGE_OBJECT_SIZE_PG_CONTROL_VER) + pg_log(PG_REPORT, " large-object chunk size\n"); + if (!got_date_is_int) pg_log(PG_REPORT, " dates/times are integers?\n"); @@ -576,6 +594,9 @@ check_control_data(ControlData *oldctrl, if (oldctrl->toast == 0 || oldctrl->toast != newctrl->toast) pg_fatal("old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"); + if (oldctrl->large_object == 0 || oldctrl->large_object != newctrl->large_object) + pg_fatal("old and new pg_controldata large-object chunk sizes are invalid or do not match\n"); + if (oldctrl->date_is_int != newctrl->date_is_int) pg_fatal("old and new pg_controldata date/time storage types do not match\n"); diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h index 1ac3394956..0207391680 100644 --- a/contrib/pg_upgrade/pg_upgrade.h +++ b/contrib/pg_upgrade/pg_upgrade.h @@ -115,6 +115,12 @@ extern char *output_files[]; */ #define MULTIXACT_FORMATCHANGE_CAT_VER 201301231 +/* + * large object chunk size added to pg_controldata, + * commit 5f93c37805e7485488480916b4585e098d3cc883 + */ +#define LARGE_OBJECT_SIZE_PG_CONTROL_VER 942 + /* * Each relation is represented by a relinfo structure. */ @@ -203,6 +209,7 @@ typedef struct uint32 ident; uint32 index; uint32 toast; + uint32 large_object; bool date_is_int; bool float8_pass_by_value; bool data_checksum_version;