Do not reset stats on the coordinator upon create of a new index or cluster.
authorPavan Deolasee <[email protected]>
Wed, 25 May 2016 13:36:51 +0000 (19:06 +0530)
committerPavan Deolasee <[email protected]>
Wed, 25 May 2016 13:36:51 +0000 (19:06 +0530)
The stats on the coordinator has no meaning for distributed tables unless
they are built using remote stats. Also make sure coordinator's view of
updated/deleted/inserted tuples is executed when fast query shipping is used

src/backend/catalog/index.c
src/backend/commands/cluster.c
src/backend/tcop/pquery.c

index e59b163173c611f0605ed8e255debcfec0225f5b..c4d2e5ac7821d9f1f8df981e4e135962d519ecb1 100644 (file)
@@ -52,6 +52,7 @@
 #include "nodes/nodeFuncs.h"
 #include "optimizer/clauses.h"
 #include "parser/parser.h"
+#include "pgxc/pgxc.h"
 #include "storage/bufmgr.h"
 #include "storage/lmgr.h"
 #include "storage/predicate.h"
@@ -1925,21 +1926,35 @@ index_update_stats(Relation rel,
                else    /* don't bother for indexes */
                        relallvisible = 0;
 
-               if (rd_rel->relpages != (int32) relpages)
-               {
-                       rd_rel->relpages = (int32) relpages;
-                       dirty = true;
-               }
-               if (rd_rel->reltuples != (float4) reltuples)
-               {
-                       rd_rel->reltuples = (float4) reltuples;
-                       dirty = true;
-               }
-               if (rd_rel->relallvisible != (int32) relallvisible)
-               {
-                       rd_rel->relallvisible = (int32) relallvisible;
-                       dirty = true;
-               }
+#ifdef XCP
+                       /*
+                        * Coordinator stats are populated using data from remote
+                        * datanodes. Hence we must not use local information to set those
+                        * stats
+                        */
+               if (!IS_PGXC_COORDINATOR || !rel->rd_locator_info)
+#endif
+                       if (rd_rel->relpages != (int32) relpages)
+                       {
+                               rd_rel->relpages = (int32) relpages;
+                               dirty = true;
+                       }
+#ifdef XCP
+               if (!IS_PGXC_COORDINATOR || !rel->rd_locator_info)
+#endif
+                       if (rd_rel->reltuples != (float4) reltuples)
+                       {
+                               rd_rel->reltuples = (float4) reltuples;
+                               dirty = true;
+                       }
+#ifdef XCP
+               if (!IS_PGXC_COORDINATOR || !rel->rd_locator_info)
+#endif
+                       if (rd_rel->relallvisible != (int32) relallvisible)
+                       {
+                               rd_rel->relallvisible = (int32) relallvisible;
+                               dirty = true;
+                       }
        }
 
        /*
index 7ab4874c4bdd74772b73a337689bd0ebd4bf692f..fea45e8d585e5bf37230accb79ccfe8d0bcdbcc4 100644 (file)
@@ -36,6 +36,7 @@
 #include "commands/vacuum.h"
 #include "miscadmin.h"
 #include "optimizer/planner.h"
+#include "pgxc/pgxc.h"
 #include "storage/bufmgr.h"
 #include "storage/lmgr.h"
 #include "storage/predicate.h"
@@ -1261,6 +1262,13 @@ swap_relation_files(Oid r1, Oid r2, bool target_is_pg_class,
                relform1->relminmxid = cutoffMulti;
        }
 
+#ifdef XCP
+       /*
+        * Don't touch the stats on the coordinator since they may not reflect the
+        * true cluster-wide information
+        */
+       if (!IS_PGXC_COORDINATOR || !relRelation->rd_locator_info)
+#endif
        /* swap size statistics too, since new rel has freshly-updated stats */
        {
                int32           swap_pages;
index 8455b262826d7bec2b7308bd6bf9fef1923f2dcf..a53e2156dc044173edb8c4a487b2ff3115249670 100644 (file)
@@ -27,6 +27,7 @@
 #include "pgxc/nodemgr.h"
 #endif
 #ifdef PGXC
+#include "pgstat.h"
 #include "pgxc/pgxc.h"
 #include "pgxc/planner.h"
 #include "pgxc/execRemote.h"
@@ -240,8 +241,64 @@ ProcessQuery(PlannedStmt *plan,
         * Now, we close down all the scans and free allocated resources.
         */
        ExecutorFinish(queryDesc);
-       ExecutorEnd(queryDesc);
 
+       if (IsA(plan->planTree, RemoteQuery))
+       {
+               /*
+                * Update coordinator statistics
+                */
+               if (IS_PGXC_COORDINATOR)
+               {
+                       EState *estate = queryDesc->estate;
+
+                       if (estate->es_num_result_relations > 0 && estate->es_processed > 0)
+                       {
+                               switch (estate->es_plannedstmt->commandType)
+                               {
+                                       case CMD_INSERT:
+                                               /* One statement can insert into only one relation */
+                                               pgstat_count_remote_insert(
+                                                               estate->es_result_relations[0].ri_RelationDesc,
+                                                               estate->es_processed);
+                                               break;
+                                       case CMD_UPDATE:
+                                       case CMD_DELETE:
+                                               {
+                                                       /*
+                                                        * We can not determine here how many row were updated
+                                                        * or delete in each table, so assume same number of
+                                                        * affected row in each table.
+                                                        * If resulting number of rows is 0 because of rounding,
+                                                        * increment each counter at least on 1.
+                                                        */
+                                                       int             i;
+                                                       int     n;
+                                                       bool    update;
+
+                                                       update = (estate->es_plannedstmt->commandType == CMD_UPDATE);
+                                                       n = estate->es_processed / estate->es_num_result_relations;
+                                                       if (n == 0)
+                                                               n = 1;
+                                                       for (i = 0; i < estate->es_num_result_relations; i++)
+                                                       {
+                                                               Relation r;
+                                                               r = estate->es_result_relations[i].ri_RelationDesc;
+                                                               if (update)
+                                                                       pgstat_count_remote_update(r, n);
+                                                               else
+                                                                       pgstat_count_remote_delete(r, n);
+                                                       }
+                                               }
+                                               break;
+                                       default:
+                                               /* nothing to count */
+                                               break;
+                               }
+                       }
+               }
+
+       }
+       ExecutorEnd(queryDesc);
        FreeQueryDesc(queryDesc);
 }