#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"
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;
+ }
}
/*
#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"
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;
#include "pgxc/nodemgr.h"
#endif
#ifdef PGXC
+#include "pgstat.h"
#include "pgxc/pgxc.h"
#include "pgxc/planner.h"
#include "pgxc/execRemote.h"
* 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);
}