This is an automated email from the ASF dual-hosted git repository. maxyang pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/cloudberry.git
commit 80f4b8e26879e1375661bccacd0fd8507fc31a11 Author: Chris Hajas <[email protected]> AuthorDate: Tue May 9 11:35:36 2023 -0700 Fix various memory leaks in Orca These were identified by running the ICW pipeline in asserts build with `optimizer_use_gpdb_allocators` set to off. This is not recommended for production as it's less performant and doesn't obey memory limits, but it does allow us to find memory leaks. While we have mdp tests which catch most leaks, some of these leaks are in the translator, which aren't covered by mdp tests. --- .../gpopt/translate/CTranslatorQueryToDXL.cpp | 2 ++ .../gpopt/translate/CTranslatorScalarToDXL.cpp | 1 + src/backend/gpopt/translate/CTranslatorUtils.cpp | 2 ++ .../libgpopt/include/gpopt/xforms/CXformUtils.h | 1 + src/backend/gporca/libgpopt/src/base/CRange.cpp | 2 ++ src/backend/gporca/libgpopt/src/base/CUtils.cpp | 1 + .../src/statistics/CExtendedStatsProcessor.cpp | 2 ++ .../libnaucrates/src/statistics/CHistogram.cpp | 22 +++++++++++++++------- 8 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp b/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp index 4081833495..4e58884fe9 100644 --- a/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp +++ b/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp @@ -2433,6 +2433,7 @@ CTranslatorQueryToDXL::CheckNoDuplicateAliasGroupingColumn(List *target_list, if (gpdb::ListLength(processed_list) < 1) { // no duplicates if no duplicates found in target list + bitset->Release(); return; } @@ -2469,6 +2470,7 @@ CTranslatorQueryToDXL::CheckNoDuplicateAliasGroupingColumn(List *target_list, } } } + bitset->Release(); } //--------------------------------------------------------------------------- diff --git a/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp b/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp index 67cdf5d36f..16bef89858 100644 --- a/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp +++ b/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp @@ -2286,6 +2286,7 @@ CTranslatorScalarToDXL::TranslateGenericDatumToDXL(CMemoryPool *mp, // base_mdid is used for text related domain types lint_value = ExtractLintValueFromDatum(md_type, is_null, bytes, length, base_mdid); + base_mdid->Release(); } return CMDTypeGenericGPDB::CreateDXLDatumVal( diff --git a/src/backend/gpopt/translate/CTranslatorUtils.cpp b/src/backend/gpopt/translate/CTranslatorUtils.cpp index be57b7227f..65bfdbaa27 100644 --- a/src/backend/gpopt/translate/CTranslatorUtils.cpp +++ b/src/backend/gpopt/translate/CTranslatorUtils.cpp @@ -1028,6 +1028,7 @@ CTranslatorUtils::GetColumnAttnosForGroupBy( } else { + col_attnos_arr->Release(); col_attnos_arr = col_attnos_arr_current; } } @@ -1219,6 +1220,7 @@ CTranslatorUtils::CreateGroupingSetsForCube(CMemoryPool *mp, current_result->Union(bset); bset->Release(); col_attnos_arr->Append(GPOS_NEW(mp) CBitSet(mp, *current_result)); + current_result->Release(); } } return col_attnos_arr; diff --git a/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformUtils.h b/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformUtils.h index b1a5c5ec6a..cbc86d2ea6 100644 --- a/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformUtils.h +++ b/src/backend/gporca/libgpopt/include/gpopt/xforms/CXformUtils.h @@ -727,6 +727,7 @@ CXformUtils::ImplementHashJoin(CXformContext *pxfctxt, CXformResult *pxfres, if (GPOS_FTRACE(EopttraceConsiderOpfamiliesForDistribution)) { + CRefCount::SafeRelease(join_opfamilies); join_opfamilies = GPOS_NEW(mp) IMdIdArray(mp); } diff --git a/src/backend/gporca/libgpopt/src/base/CRange.cpp b/src/backend/gporca/libgpopt/src/base/CRange.cpp index ef9022685b..8dbc78b023 100644 --- a/src/backend/gporca/libgpopt/src/base/CRange.cpp +++ b/src/backend/gporca/libgpopt/src/base/CRange.cpp @@ -113,6 +113,8 @@ CRange::CRange(const IComparator *pcomp, IMDType::ECmpType cmp_type, } default: + // we don't assign datum here, so we need to release it to prevent a memory leak + CRefCount::SafeRelease(datum); // for anything else, create a (-inf, inf) range break; } diff --git a/src/backend/gporca/libgpopt/src/base/CUtils.cpp b/src/backend/gporca/libgpopt/src/base/CUtils.cpp index 1ccd05ea41..63c1a7d1ff 100644 --- a/src/backend/gporca/libgpopt/src/base/CUtils.cpp +++ b/src/backend/gporca/libgpopt/src/base/CUtils.cpp @@ -734,6 +734,7 @@ CUtils::PexprScalarArrayCmp(CMemoryPool *mp, !IMDId::IsValid(pmdidCmpOp)) { // cannot construct an ArrayCmp expression if any of these are invalid + pexprScalarChildren->Release(); return nullptr; } diff --git a/src/backend/gporca/libnaucrates/src/statistics/CExtendedStatsProcessor.cpp b/src/backend/gporca/libnaucrates/src/statistics/CExtendedStatsProcessor.cpp index 85c38e7f48..97bcfc1ed7 100644 --- a/src/backend/gporca/libnaucrates/src/statistics/CExtendedStatsProcessor.cpp +++ b/src/backend/gporca/libnaucrates/src/statistics/CExtendedStatsProcessor.cpp @@ -287,6 +287,7 @@ CExtendedStatsProcessor::ApplyCorrelatedStatsToScaleFactorFilterCalculation( */ if (clauses_attnums->Size() < 2) { + clauses_attnums->Release(); return; } @@ -297,6 +298,7 @@ CExtendedStatsProcessor::ApplyCorrelatedStatsToScaleFactorFilterCalculation( if (!stat) { + clauses_attnums->Release(); return; } diff --git a/src/backend/gporca/libnaucrates/src/statistics/CHistogram.cpp b/src/backend/gporca/libnaucrates/src/statistics/CHistogram.cpp index 1768092b4d..b0c1053a11 100644 --- a/src/backend/gporca/libnaucrates/src/statistics/CHistogram.cpp +++ b/src/backend/gporca/libnaucrates/src/statistics/CHistogram.cpp @@ -2295,14 +2295,22 @@ CHistogram::AddDummyHistogramAndWidthInfo( CColRef *col_ref = col_factory->LookupColRef(colid); GPOS_ASSERT(nullptr != col_ref); - CHistogram *histogram = - CHistogram::MakeDefaultHistogram(mp, col_ref, is_empty); - output_histograms->Insert(GPOS_NEW(mp) ULONG(colid), histogram); + if (nullptr == output_histograms->Find(&colid)) + { + CHistogram *histogram = + CHistogram::MakeDefaultHistogram(mp, col_ref, is_empty); + output_histograms->Insert(GPOS_NEW(mp) ULONG(colid), histogram); + } - CDouble width = - CStatisticsUtils::DefaultColumnWidth(col_ref->RetrieveType()); - output_col_widths->Insert(GPOS_NEW(mp) ULONG(colid), - GPOS_NEW(mp) CDouble(width)); + + + if (nullptr == output_col_widths->Find(&colid)) + { + CDouble width = + CStatisticsUtils::DefaultColumnWidth(col_ref->RetrieveType()); + output_col_widths->Insert(GPOS_NEW(mp) ULONG(colid), + GPOS_NEW(mp) CDouble(width)); + } } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
