From 2ad6cd5cdfb57a93160456097e2283c5768d7397 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 5 Nov 2018 17:14:07 +0100 Subject: [PATCH 1/2] Fix OOM for iterative tasks (MID-4959, MID-4615) Model.searchObjectsIterative used thread-local repository cache. Not completely wrong but when iterating through too many objects the cache gets filled in. (And the data in it could get quite obsolete.) --- .../model/impl/controller/ModelController.java | 16 ++++++++++++---- .../midpoint/model/impl/lens/ClockworkMedic.java | 14 +++++++++----- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java index 6c38d105cb3..76b7a038fcc 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java @@ -1168,7 +1168,7 @@ public SearchResultMetadata searchObjectsIterative(Class< SearchResultMetadata metadata; try { - enterModelMethod(); + enterModelMethodNoRepoCache(); // skip using cache to avoid potentially many objects there (MID-4615, MID-4959) logQuery(processedQuery); try { @@ -1189,7 +1189,7 @@ public SearchResultMetadata searchObjectsIterative(Class< } } } finally { - exitModelMethod(); + exitModelMethodNoRepoCache(); } // TODO: log errors @@ -2234,11 +2234,19 @@ public PrismContext getPrismContext() { } private void enterModelMethod() { - clockworkMedic.enterModelMethod(); + clockworkMedic.enterModelMethod(true); } + private void enterModelMethodNoRepoCache() { + clockworkMedic.enterModelMethod(false); + } + private void exitModelMethod() { - clockworkMedic.exitModelMethod(); + clockworkMedic.exitModelMethod(true); + } + + private void exitModelMethodNoRepoCache() { + clockworkMedic.exitModelMethod(false); } //region Case Management diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ClockworkMedic.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ClockworkMedic.java index 8d9aeae48c5..f7aebef8f4e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ClockworkMedic.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ClockworkMedic.java @@ -52,7 +52,7 @@ public class ClockworkMedic { private static final Trace LOGGER = TraceManager.getTrace(ClockworkMedic.class); - public void enterModelMethod() { + public void enterModelMethod(boolean enterCache) { if (InternalsConfig.isModelProfiling()) { DiagnosticContextManager manager = getDiagnosticContextManager(); DiagnosticContext ctx; @@ -64,12 +64,16 @@ public void enterModelMethod() { } DiagnosticContextHolder.push(ctx); } - - RepositoryCache.enter(); + + if (enterCache) { + RepositoryCache.enter(); + } } - public void exitModelMethod() { - RepositoryCache.exit(); + public void exitModelMethod(boolean exitCache) { + if (exitCache) { + RepositoryCache.exit(); + } DiagnosticContext ctx = DiagnosticContextHolder.pop(); if (ctx != null) { From 4c1ae0db8664fe62de350c4ace30e46f64e002c9 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 5 Nov 2018 17:49:44 +0100 Subject: [PATCH 2/2] Fix NPE in ResourceObjectConverter (MID-4971) --- .../main/java/com/evolveum/midpoint/schema/util/ShadowUtil.java | 1 - .../midpoint/provisioning/impl/ResourceObjectConverter.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ShadowUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ShadowUtil.java index 596656ef651..ab1926aa64f 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ShadowUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ShadowUtil.java @@ -59,7 +59,6 @@ public static Collection> getPrimaryIdentifiers(ShadowType return getPrimaryIdentifiers(shadowType.asPrismObject()); } - // TODO: rename to getPrimaryIdentifiers public static Collection> getPrimaryIdentifiers(PrismObject shadow) { ResourceAttributeContainer attributesContainer = getAttributesContainer(shadow); if (attributesContainer == null) { diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java index 2b75390d7fc..295e760ae9f 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java @@ -572,7 +572,7 @@ public AsynchronousOperationReturnValue> modifyAsyncRet = null; //check identifier if it is not null - if (primaryIdentifiers.isEmpty() && repoShadow.asObjectable().getFailedOperationType()!= null){ + if ((primaryIdentifiers == null || primaryIdentifiers.isEmpty()) && repoShadow.asObjectable().getFailedOperationType() != null){ GenericConnectorException e = new GenericConnectorException( "Unable to modify object in the resource. Probably it has not been created yet because of previous unavailability of the resource."); result.recordFatalError(e);