From f84cdf5b5a957dd65a42bb1148a8f3b340232b46 Mon Sep 17 00:00:00 2001 From: kate Date: Mon, 26 Feb 2018 22:04:13 +0100 Subject: [PATCH 1/4] MID-4478 lookup table warning fix --- .../gui/api/component/autocomplete/AutoCompleteTextPanel.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/AutoCompleteTextPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/AutoCompleteTextPanel.java index a1983316936..e8b239a8b96 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/AutoCompleteTextPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/AutoCompleteTextPanel.java @@ -104,7 +104,9 @@ public void checkInputValue(AutoCompleteTextField input, AjaxRequestTarget targe if (input.getInput() == null || input.getInput().trim().equals("")){ model.setObject(input.getInput()); } - if (getIterator(input.getInput()).hasNext() && getIterator(input.getInput()).next() instanceof String) { + if (!getIterator(input.getInput()).hasNext()) { + updateFeedbackPanel(input, true, target); + } else { Iterator lookupTableValuesIterator = (Iterator) getIterator(input.getInput()); String value = input.getInput(); From 8ae6f5375314ede66999337fb095a3e838abde05 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 28 Feb 2018 13:53:53 +0100 Subject: [PATCH 2/4] Tentatively fix campaign mgmt OOME (MID-4479) --- .../evolveum/midpoint/gui/api/util/WebComponentUtil.java | 8 ++++++++ .../web/page/admin/certification/PageCertCampaign.java | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java index 57f8112b350..cf8e9b711f2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java @@ -446,6 +446,14 @@ public static IModel> adopt( return objectWrapperModel; } + public static void safeResultCleanup(OperationResult result, Trace logger) { + try { + result.cleanupResult(); + } catch (Throwable t) { + LoggingUtils.logUnexpectedException(logger, "Couldn't clean up the operation result", t); + } + } + public enum Channel { // TODO: move this to schema component LIVE_SYNC(SchemaConstants.CHANGE_CHANNEL_LIVE_SYNC_URI), diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/PageCertCampaign.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/PageCertCampaign.java index c621b9da1cd..94eb85e4e1b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/PageCertCampaign.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/PageCertCampaign.java @@ -505,6 +505,7 @@ private void executeCampaignStateOperation(AjaxRequestTarget target, String acti result.computeStatusIfUnknown(); } + WebComponentUtil.safeResultCleanup(result, LOGGER); showResult(result); statModel.reset(); campaignModel.reset(); @@ -513,7 +514,6 @@ private void executeCampaignStateOperation(AjaxRequestTarget target, String acti target.add(getFeedbackPanel()); } - private ObjectQuery createCaseQuery() { ObjectQuery query = new ObjectQuery(); return query; From a23b2943d4b7ca60b7aba12177524ab276d36335 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 28 Feb 2018 17:22:58 +0100 Subject: [PATCH 3/4] Tentatively fix campaign mgmt OOME: 2nd attempt --- .../midpoint/gui/api/util/WebComponentUtil.java | 2 +- .../page/admin/certification/PageCertCampaigns.java | 10 ++++++---- .../midpoint/schema/result/OperationResult.java | 6 ++++++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java index cf8e9b711f2..d16d1136e47 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java @@ -448,7 +448,7 @@ public static IModel> adopt( public static void safeResultCleanup(OperationResult result, Trace logger) { try { - result.cleanupResult(); + result.cleanupResultDeeply(); } catch (Throwable t) { LoggingUtils.logUnexpectedException(logger, "Couldn't clean up the operation result", t); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/PageCertCampaigns.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/PageCertCampaigns.java index 7d322a3648d..f52aac518f2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/PageCertCampaigns.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/PageCertCampaigns.java @@ -744,6 +744,7 @@ private void startRemediationPerformed(AjaxRequestTarget target, } finally { result.computeStatusIfUnknown(); } + WebComponentUtil.safeResultCleanup(result, LOGGER); showResult(result); target.add((Component) getCampaignsTable()); target.add(getFeedbackPanel()); @@ -762,6 +763,7 @@ private void openNextStagePerformed(AjaxRequestTarget target, AccessCertificatio } finally { result.computeStatusIfUnknown(); } + WebComponentUtil.safeResultCleanup(result, LOGGER); showResult(result); target.add((Component) getCampaignsTable()); target.add(getFeedbackPanel()); @@ -782,7 +784,7 @@ private void closeCampaignConfirmedPerformed(AjaxRequestTarget target, } finally { result.computeStatusIfUnknown(); } - + WebComponentUtil.safeResultCleanup(result, LOGGER); showResult(result); target.add((Component) getCampaignsTable()); target.add(getFeedbackPanel()); @@ -802,7 +804,7 @@ private void closeStageConfirmedPerformed(AjaxRequestTarget target, CertCampaign } finally { result.computeStatusIfUnknown(); } - + WebComponentUtil.safeResultCleanup(result, LOGGER); showResult(result); target.add((Component) getCampaignsTable()); target.add(getFeedbackPanel()); @@ -845,7 +847,7 @@ private void deleteCampaignsPerformed(AjaxRequestTarget target, Table campaignsTable = getCampaignsTable(); ObjectDataProvider provider = (ObjectDataProvider) campaignsTable.getDataTable().getDataProvider(); provider.clearCache(); - + WebComponentUtil.safeResultCleanup(result, LOGGER); showResult(result); target.add(getFeedbackPanel(), (Component) campaignsTable); } @@ -893,7 +895,7 @@ private void actOnCampaignsPerformed(AjaxRequestTarget target, String operationN result.recordStatus(OperationResultStatus.SUCCESS, processed + " campaign(s) have been successfully processed."); // todo i18n } - + WebComponentUtil.safeResultCleanup(result, LOGGER); showResult(result); target.add(getFeedbackPanel(), (Component) getCampaignsTable()); } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/result/OperationResult.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/result/OperationResult.java index 5e59adb980a..2d51bf1e9e6 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/result/OperationResult.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/result/OperationResult.java @@ -1474,6 +1474,12 @@ private OperationResult findSimilarSubresult(OperationResult subresult) { return similar; } + // experimental/temporary + public void cleanupResultDeeply() { + cleanupResult(); + emptyIfNull(subresults).forEach(OperationResult::cleanupResultDeeply); + } + /** * Removes all the successful minor results. Also checks if the result is roughly consistent * and complete. (e.g. does not have unknown operation status, etc.) From 72f79ea581190f16dac2619b694b70470838474e Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 28 Feb 2018 19:46:42 +0100 Subject: [PATCH 4/4] Fix bulk action OOME (MID-4479) Existing behavior (quite counter-intuitive) is that when having search.scriptingExpression in bulk actions, results of individual evaluations of that expression are ultimately collected into output pipeline - which can consume a lot of memory. Introduced "aggregateOutput" parameter that can turn this off. (cherry picked from commit 1a9cd39) --- .../xml/ns/public/model/scripting/scripting-3.xsd | 12 ++++++++++++ .../impl/scripting/expressions/SearchEvaluator.java | 8 ++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/infra/schema/src/main/resources/xml/ns/public/model/scripting/scripting-3.xsd b/infra/schema/src/main/resources/xml/ns/public/model/scripting/scripting-3.xsd index 0ccb1080e7d..9c127048665 100644 --- a/infra/schema/src/main/resources/xml/ns/public/model/scripting/scripting-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/model/scripting/scripting-3.xsd @@ -314,6 +314,18 @@ + + + + Whether to aggregate and pass forward the output of expression evaluations that are done + for each object found. (Meaningful only if scriptingExpression is specified.) + Default is true for compatibility reasons. Set to false to optimize memory consumption. + + + 3.7.1 + + + diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SearchEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SearchEvaluator.java index a67bf7fe7f3..41e7251163b 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SearchEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/expressions/SearchEvaluator.java @@ -44,6 +44,7 @@ import com.evolveum.midpoint.xml.ns._public.model.scripting_3.SearchExpressionType; import org.apache.commons.lang.Validate; import org.apache.commons.lang.mutable.MutableBoolean; +import org.apache.commons.lang3.BooleanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -137,9 +138,12 @@ public PipelineData evaluate(SearchExpressionType searchE } JAXBElement childExpression = searchExpression.getScriptingExpression(); try { - outputData.addAllFrom(scriptingExpressionEvaluator.evaluateExpression( + PipelineData expressionResult = scriptingExpressionEvaluator.evaluateExpression( (ScriptingExpressionType) childExpression.getValue(), - PipelineData.create(object.getValue(), item.getVariables()), context, globalResult)); + PipelineData.create(object.getValue(), item.getVariables()), context, globalResult); + if (!BooleanUtils.isFalse(searchExpression.isAggregateOutput())) { + outputData.addAllFrom(expressionResult); + } globalResult.setSummarizeSuccesses(true); globalResult.summarize(); } catch (ScriptExecutionException e) {