Merge branch 'RED-10353-4.2' into 'release/4.348.x'

RED-10353: Increase rules timeout, added different error message and error...

See merge request redactmanager/redaction-service!549
This commit is contained in:
Timo Bejan 2024-11-05 14:34:44 +01:00
commit 5ef3699648
10 changed files with 37 additions and 18 deletions

View File

@ -4,7 +4,7 @@ plugins {
} }
description = "redaction-service-api-v1" description = "redaction-service-api-v1"
val persistenceServiceVersion = "2.465.79" val persistenceServiceVersion = "2.465.83"
dependencies { dependencies {
implementation("org.springframework:spring-web:6.0.12") implementation("org.springframework:spring-web:6.0.12")

View File

@ -16,7 +16,7 @@ val layoutParserVersion = "0.142.6"
val jacksonVersion = "2.15.2" val jacksonVersion = "2.15.2"
val droolsVersion = "9.44.0.Final" val droolsVersion = "9.44.0.Final"
val pdfBoxVersion = "3.0.0" val pdfBoxVersion = "3.0.0"
val persistenceServiceVersion = "2.465.79" val persistenceServiceVersion = "2.465.83"
val springBootStarterVersion = "3.1.5" val springBootStarterVersion = "3.1.5"
val springCloudVersion = "4.0.4" val springCloudVersion = "4.0.4"
val testContainersVersion = "1.19.7" val testContainersVersion = "1.19.7"

View File

@ -28,7 +28,7 @@ public class RedactionServiceSettings {
private int dictionaryCacheExpireAfterAccessDays = 3; private int dictionaryCacheExpireAfterAccessDays = 3;
private int droolsExecutionTimeoutSecs = 300; private int droolsExecutionTimeoutSecs = 600;
private boolean ruleExecutionSecured = true; private boolean ruleExecutionSecured = true;

View File

@ -20,6 +20,7 @@ import org.springframework.stereotype.Service;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest;
import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeResult; import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeResult;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ErrorCode;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileErrorInfo; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileErrorInfo;
import com.iqser.red.service.redaction.v1.server.client.FileStatusProcessingUpdateClient; import com.iqser.red.service.redaction.v1.server.client.FileStatusProcessingUpdateClient;
import com.iqser.red.service.redaction.v1.server.client.RulesClient; import com.iqser.red.service.redaction.v1.server.client.RulesClient;
@ -140,10 +141,19 @@ public class RedactionMessageReceiver {
private void sendAnalysisFailed(AnalyzeRequest analyzeRequest, boolean priority, Exception e) { private void sendAnalysisFailed(AnalyzeRequest analyzeRequest, boolean priority, Exception e) {
log.error("Failed to process analyze request: {}", analyzeRequest, e); log.error("Failed to process analyze request: {}", analyzeRequest, e);
var timestamp = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS); ErrorCode errorCode = null;
if(e instanceof DroolsTimeoutException dre){
if (!dre.isReported()){
errorCode = ErrorCode.RULES_EXECUTION_TIMEOUT;
} else {
errorCode = ErrorCode.LOCKED_RULES;
}
}
fileStatusProcessingUpdateClient.analysisFailed(analyzeRequest.getDossierId(), fileStatusProcessingUpdateClient.analysisFailed(analyzeRequest.getDossierId(),
analyzeRequest.getFileId(), analyzeRequest.getFileId(),
new FileErrorInfo(e.getMessage(), priority ? REDACTION_PRIORITY_QUEUE : REDACTION_QUEUE, "redaction-service", timestamp)); new FileErrorInfo(e.getMessage(), priority ? REDACTION_PRIORITY_QUEUE : REDACTION_QUEUE, "redaction-service", errorCode));
} }

View File

@ -155,7 +155,7 @@ public class AnalyzeService {
log.info("Finished Dictionary Search for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); log.info("Finished Dictionary Search for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId());
// we could add the imported redactions similar to the manual redactions here as well for additional processing // we could add the imported redactions similar to the manual redactions here as well for additional processing
List<FileAttribute> allFileAttributes = entityDroolsExecutionService.executeRules(kieWrapperEntityRules.container(), List<FileAttribute> allFileAttributes = entityDroolsExecutionService.executeRules(analyzeRequest.getFileId(), kieWrapperEntityRules.container(),
document, document,
sectionsToReAnalyse, sectionsToReAnalyse,
dictionary, dictionary,
@ -221,7 +221,7 @@ public class AnalyzeService {
log.info("Finished Dictionary Search for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); log.info("Finished Dictionary Search for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId());
// we could add the imported redactions similar to the manual redactions here as well for additional processing // we could add the imported redactions similar to the manual redactions here as well for additional processing
List<FileAttribute> allFileAttributes = entityDroolsExecutionService.executeRules(kieWrapperEntityRules.container(), List<FileAttribute> allFileAttributes = entityDroolsExecutionService.executeRules(analyzeRequest.getFileId(), kieWrapperEntityRules.container(),
document, document,
dictionary, dictionary,
analyzeRequest.getFileAttributes(), analyzeRequest.getFileAttributes(),
@ -350,7 +350,7 @@ public class AnalyzeService {
// We need the latest EntityLog entries for components rules execution // We need the latest EntityLog entries for components rules execution
entityLog.setEntityLogEntry(redactionStorageService.getEntityLog(analyzeRequest.getDossierId(), analyzeRequest.getFileId()).getEntityLogEntry()); entityLog.setEntityLogEntry(redactionStorageService.getEntityLog(analyzeRequest.getDossierId(), analyzeRequest.getFileId()).getEntityLogEntry());
List<Component> components = componentDroolsExecutionService.executeRules(kieWrapperComponentRules.container(), List<Component> components = componentDroolsExecutionService.executeRules(analyzeRequest.getFileId(), kieWrapperComponentRules.container(),
entityLog, entityLog,
document, document,
addedFileAttributes, addedFileAttributes,

View File

@ -49,7 +49,7 @@ public class ComponentDroolsExecutionService {
ComponentMappingMemoryCache componentMappingMemoryCache; ComponentMappingMemoryCache componentMappingMemoryCache;
public List<Component> executeRules(KieContainer kieContainer, public List<Component> executeRules(String fileId, KieContainer kieContainer,
EntityLog entityLog, EntityLog entityLog,
Document document, Document document,
Set<FileAttribute> fileAttributes, Set<FileAttribute> fileAttributes,
@ -99,14 +99,14 @@ public class ComponentDroolsExecutionService {
} catch (ExecutionException e) { } catch (ExecutionException e) {
kieSession.dispose(); kieSession.dispose();
if (e.getCause() instanceof TimeoutException) { if (e.getCause() instanceof TimeoutException) {
throw new DroolsTimeoutException(e, false, RuleFileType.COMPONENT); throw new DroolsTimeoutException(String.format("The file %s caused a timeout", fileId), e, false, RuleFileType.COMPONENT);
} }
throw new RuntimeException(e); throw new RuntimeException(e);
} catch (InterruptedException e) { } catch (InterruptedException e) {
kieSession.dispose(); kieSession.dispose();
throw new RuntimeException(e); throw new RuntimeException(e);
} catch (TimeoutException e) { } catch (TimeoutException e) {
throw new DroolsTimeoutException(e, false, RuleFileType.COMPONENT); throw new DroolsTimeoutException(String.format("The file %s caused a timeout", fileId), e, false, RuleFileType.COMPONENT);
} }
List<FileAttribute> resultingFileAttributes = getFileAttributes(kieSession); List<FileAttribute> resultingFileAttributes = getFileAttributes(kieSession);

View File

@ -52,14 +52,14 @@ public class EntityDroolsExecutionService {
@Timed("redactmanager_executeRules") @Timed("redactmanager_executeRules")
@Observed(name = "EntityDroolsExecutionService", contextualName = "execute-entity-rules") @Observed(name = "EntityDroolsExecutionService", contextualName = "execute-entity-rules")
public List<FileAttribute> executeRules(KieContainer kieContainer, public List<FileAttribute> executeRules(String fileId, KieContainer kieContainer,
Document document, Document document,
Dictionary dictionary, Dictionary dictionary,
List<FileAttribute> fileAttributes, List<FileAttribute> fileAttributes,
ManualRedactions manualRedactions, ManualRedactions manualRedactions,
NerEntities nerEntities) { NerEntities nerEntities) {
return executeRules(kieContainer, return executeRules(fileId, kieContainer,
document, document,
document.streamChildren() document.streamChildren()
.toList(), .toList(),
@ -72,7 +72,7 @@ public class EntityDroolsExecutionService {
@Timed("redactmanager_executeRules") @Timed("redactmanager_executeRules")
@Observed(name = "EntityDroolsExecutionService", contextualName = "execute-entity-rules") @Observed(name = "EntityDroolsExecutionService", contextualName = "execute-entity-rules")
public List<FileAttribute> executeRules(KieContainer kieContainer, public List<FileAttribute> executeRules(String fileId, KieContainer kieContainer,
Document document, Document document,
List<SemanticNode> sectionsToAnalyze, List<SemanticNode> sectionsToAnalyze,
Dictionary dictionary, Dictionary dictionary,
@ -133,14 +133,14 @@ public class EntityDroolsExecutionService {
} catch (ExecutionException e) { } catch (ExecutionException e) {
kieSession.dispose(); kieSession.dispose();
if (e.getCause() instanceof TimeoutException) { if (e.getCause() instanceof TimeoutException) {
throw new DroolsTimeoutException(e, false, RuleFileType.ENTITY); throw new DroolsTimeoutException(String.format("The file %s caused a timeout",fileId), e, false, RuleFileType.ENTITY);
} }
throw new RuntimeException(e); throw new RuntimeException(e);
} catch (InterruptedException e) { } catch (InterruptedException e) {
kieSession.dispose(); kieSession.dispose();
throw new RuntimeException(e); throw new RuntimeException(e);
} catch (TimeoutException e) { } catch (TimeoutException e) {
throw new DroolsTimeoutException(e, false, RuleFileType.ENTITY); throw new DroolsTimeoutException(String.format("The file %s caused a timeout",fileId), e, false, RuleFileType.ENTITY);
} }
List<FileAttribute> resultingFileAttributes = getFileAttributes(kieSession); List<FileAttribute> resultingFileAttributes = getFileAttributes(kieSession);

View File

@ -22,6 +22,15 @@ public class DroolsTimeoutException extends RuntimeException {
} }
public DroolsTimeoutException(String message, Throwable cause, boolean reported, RuleFileType ruleFileType) {
super(message, cause);
this.reported = reported;
this.ruleFileType = ruleFileType;
}
public DroolsTimeoutException(boolean reported, RuleFileType ruleFileType) { public DroolsTimeoutException(boolean reported, RuleFileType ruleFileType) {
super(DROOLS_TIMEOUT_MESSAGE); super(DROOLS_TIMEOUT_MESSAGE);

View File

@ -154,7 +154,7 @@ public class DocumentPerformanceIntegrationTest extends BuildDocumentIntegration
System.out.printf("Inserting entities into the graph took %d ms\n", System.currentTimeMillis() - graphInsertionStart); System.out.printf("Inserting entities into the graph took %d ms\n", System.currentTimeMillis() - graphInsertionStart);
long droolsStart = System.currentTimeMillis(); long droolsStart = System.currentTimeMillis();
List<FileAttribute> fileAttributes = entityDroolsExecutionService.executeRules(kieContainer, List<FileAttribute> fileAttributes = entityDroolsExecutionService.executeRules(TEST_FILE_ID, kieContainer,
document, document,
dictionary, dictionary,
Collections.emptyList(), Collections.emptyList(),

@ -1 +1 @@
Subproject commit 5705cc0782605fdca5dfff134b436f7143c9e421 Subproject commit 57e6e0dd3c08a3a65ec59b5dfb70f0f77ebcc7c7