From 86bcd93a4ab232abcda59a586911d8c5eb4284e8 Mon Sep 17 00:00:00 2001 From: Hadi Moshayedi Date: Tue, 17 Oct 2017 14:01:14 -0400 Subject: [PATCH] Don't collect stats when there is a version mismatch. (#1712) The following scenario can cause an Assert() crash if we don't do this: - Install Citus v7.0-15 - Restart server & run a query to start maintenanced. - Install Citus v7.1 - Restart server & run a query. This will tell user to upgrade. - Type "UPDATE EXTENSION c" & press tab. maintenanced will start and crash with Assert(CitusHasBeenLoaded() && CheckCitusVersion(WARNING)); This change checks Citus version before calling metadata functions so the crash doesn't happen. --- src/backend/distributed/utils/statistics_collection.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/backend/distributed/utils/statistics_collection.c b/src/backend/distributed/utils/statistics_collection.c index 3fdd8f6a2..901ee015d 100644 --- a/src/backend/distributed/utils/statistics_collection.c +++ b/src/backend/distributed/utils/statistics_collection.c @@ -65,6 +65,17 @@ CollectBasicUsageStatistics(void) memset(&unameData, 0, sizeof(unameData)); StartTransactionCommand(); + + /* + * If there is a version mismatch between loaded version and available + * version, metadata functions will fail. We return early to avoid crashing. + * This can happen when updating the Citus extension. + */ + if (!CheckCitusVersion(LOG_SERVER_ONLY)) + { + CommitTransactionCommand(); + return false; + } distributedTables = DistributedTableList(); roundedDistTableCount = NextPow2(list_length(distributedTables)); roundedClusterSize = NextPow2(ClusterSize(distributedTables));