pg_upgrade: check for large object size compatibility
authorBruce Momjian
Wed, 10 Sep 2014 23:23:36 +0000 (19:23 -0400)
committerBruce Momjian
Wed, 10 Sep 2014 23:23:36 +0000 (19:23 -0400)
contrib/pg_upgrade/controldata.c
contrib/pg_upgrade/pg_upgrade.h

index 9282b8e88e66d8303008072c912e7fa827aa62d0..d105a5955570dee944445cf760e4a2e647219503 100644 (file)
@@ -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");
 
index 1ac3394956940286e91a805fa9fb62aae45ade77..02073916807e57ede5d9d2ce541415d70d447639 100644 (file)
@@ -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;