From 0dca5362b9da456bfb24448bbc032625019b528c Mon Sep 17 00:00:00 2001 From: Teddy Date: Wed, 20 Nov 2024 14:12:08 +0100 Subject: [PATCH] fix: handle potential null node in DQ failure lineage (#18707) --- .../elasticsearch/ElasticSearchClient.java | 8 ++++--- .../search/opensearch/OpenSearchClient.java | 22 ++++++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/search/elasticsearch/ElasticSearchClient.java b/openmetadata-service/src/main/java/org/openmetadata/service/search/elasticsearch/ElasticSearchClient.java index de8b66e7026..374d9c127ba 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/search/elasticsearch/ElasticSearchClient.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/search/elasticsearch/ElasticSearchClient.java @@ -1172,9 +1172,11 @@ public class ElasticSearchClient implements SearchClient { processedNodes.add(nodeFailureId); if (nodesWithFailures.contains(nodeFailureId)) { Map node = allNodes.get(nodeFailureId); - node.keySet().removeAll(FIELDS_TO_REMOVE); - node.remove("lineage"); - nodes.add(allNodes.get(nodeFailureId)); + if (node != null) { + node.keySet().removeAll(FIELDS_TO_REMOVE); + node.remove("lineage"); + nodes.add(node); + } } List> edgesForNode = allEdges.get(nodeFailureId); if (edgesForNode != null) { diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/search/opensearch/OpenSearchClient.java b/openmetadata-service/src/main/java/org/openmetadata/service/search/opensearch/OpenSearchClient.java index 2eb1e97eb0a..10d4e646780 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/search/opensearch/OpenSearchClient.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/search/opensearch/OpenSearchClient.java @@ -1097,7 +1097,8 @@ public class OpenSearchClient implements SearchClient { nodesWithFailures, new HashSet<>()); for (String nodeWithFailure : nodesWithFailures) { - traceBackDQLineage(nodeWithFailure, allEdges, allNodes, nodes, edges, new HashSet<>()); + traceBackDQLineage( + nodeWithFailure, nodesWithFailures, allEdges, allNodes, nodes, edges, new HashSet<>()); } } @@ -1154,6 +1155,7 @@ public class OpenSearchClient implements SearchClient { private void traceBackDQLineage( String nodeFailureId, + Set nodesWithFailures, Map>> allEdges, Map> allNodes, Set> nodes, @@ -1164,7 +1166,14 @@ public class OpenSearchClient implements SearchClient { } processedNodes.add(nodeFailureId); - nodes.add(allNodes.get(nodeFailureId)); + if (nodesWithFailures.contains(nodeFailureId)) { + Map node = allNodes.get(nodeFailureId); + if (node != null) { + node.keySet().removeAll(FIELDS_TO_REMOVE); + node.remove("lineage"); + nodes.add(node); + } + } List> edgesForNode = allEdges.get(nodeFailureId); if (edgesForNode != null) { for (Map edge : edgesForNode) { @@ -1173,7 +1182,14 @@ public class OpenSearchClient implements SearchClient { if (!fromEntityId.equals(nodeFailureId)) continue; // skip if the edge is from the node Map toEntity = (Map) edge.get("toEntity"); edges.add(edge); - traceBackDQLineage(toEntity.get("id"), allEdges, allNodes, nodes, edges, processedNodes); + traceBackDQLineage( + toEntity.get("id"), + nodesWithFailures, + allEdges, + allNodes, + nodes, + edges, + processedNodes); } } }