You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hawq.apache.org by zt...@apache.org on 2022/01/03 09:09:10 UTC
[hawq] 02/03: HAWQ-1825. avoid of reallocating resource for copy statement in udf
This is an automated email from the ASF dual-hosted git repository.
ztao1987 pushed a commit to branch ztao
in repository https://gitbox.apache.org/repos/asf/hawq.git
commit f36f11484f4c90206ff8bba1807e1099545ce1db
Author: ztao1987 <zh...@gmail.com>
AuthorDate: Mon Jan 3 17:05:22 2022 +0800
HAWQ-1825. avoid of reallocating resource for copy statement in udf
---
src/backend/commands/copy.c | 35 ++++++++++++++++++++++++++++-------
1 file changed, 28 insertions(+), 7 deletions(-)
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index ed98b00..20fd6a4 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -1499,6 +1499,7 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
initStringInfo(&(cstate->executor_err_context));
}
+ QueryResource *savedResource = NULL;
if (is_from) /* copy from file to database */
{
bool pipe = (cstate->filename == NULL);
@@ -1590,7 +1591,6 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
GpPolicy *target_policy = NULL;
int min_target_segment_num = 0;
int max_target_segment_num = 0;
- QueryResource *savedResource = NULL;
bool isMagmaHashTable = false;
target_policy = GpPolicyFetch(CurrentMemoryContext, relid);
@@ -1613,8 +1613,12 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
}
pfree(target_policy);
- cstate->resource = AllocateResource(QRL_ONCE, 1, 1, max_target_segment_num, min_target_segment_num,NULL,0);
savedResource = GetActiveQueryResource();
+ if (!savedResource) {
+ cstate->resource = AllocateResource(QRL_ONCE, 1, 1, max_target_segment_num, min_target_segment_num,NULL,0);
+ } else {
+ cstate->resource = AllocateResource(QRL_INHERIT, 0, 0, 0, 0, NULL, 0);
+ }
SetActiveQueryResource(cstate->resource);
all_relids = lappend_oid(all_relids, relid);
@@ -1653,7 +1657,6 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
cstate->cdbsreh->errtbl,
err_segnos);
}
- SetActiveQueryResource(savedResource);
}
else
{
@@ -1780,6 +1783,18 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
FreeResource(cstate->resource);
cstate->resource = NULL;
}
+ /**
+ * copy from:
+ * if 'copy from' allocate resource with QRL_ONCE, reset ActiveQueryResource
+ * back to NULL then analyze will allocate resource with QRL_ONCE.
+ * if 'copy from' inherit resource with QRL_INHERIT from UDF, reset
+ * ActiveQueryResource to original resource from UDF which will be inherited
+ * by analyze.
+ *
+ * copy to:
+ * 'copy to' has already done all work with resource before this reset.
+ */
+ SetActiveQueryResource(savedResource);
/* Clean up storage (probably not really necessary) */
processed = cstate->processed;
@@ -1988,10 +2003,16 @@ DoCopyTo(CopyState cstate)
}
lFullRelOids = lappend_oid(lFullRelOids, cstate->rel->rd_id);
- target_segment_num = calculate_virtual_segment_number(lFullRelOids);
- elog(LOG, "virtual segment number of copy to is: %d\n", target_segment_num);
-
- cstate->resource = AllocateResource(QRL_ONCE, 1, 1, target_segment_num, target_segment_num,NULL,0);
+ QueryResource *savedResource = NULL;
+ savedResource = GetActiveQueryResource();
+ if (!savedResource) {
+ target_segment_num = calculate_virtual_segment_number(lFullRelOids);
+ elog(LOG, "virtual segment number of copy to is: %d\n", target_segment_num);
+ cstate->resource = AllocateResource(QRL_ONCE, 1, 1, target_segment_num, target_segment_num,NULL,0);
+ } else {
+ cstate->resource = AllocateResource(QRL_INHERIT, 0, 0, 0, 0, NULL, 0);
+ }
+ SetActiveQueryResource(cstate->resource);
CopyToDispatch(cstate);
}
else