Skip to content

Commit ee700c5

Browse files
authored
fix(es): npe when applying scripted update on elasticsearch (#15283)
1 parent 75ee3c9 commit ee700c5

File tree

2 files changed

+18
-11
lines changed

2 files changed

+18
-11
lines changed

metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/client/shim/impl/Es8SearchClientShim.java

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1641,6 +1641,21 @@ protected void addToProcessor(BulkIngester<?> processor, DocWriteRequest<?> writ
16411641
if (writeRequest instanceof UpdateRequest) {
16421642
UpdateRequest update = (UpdateRequest) writeRequest;
16431643
Script script = convertScript(update.script());
1644+
1645+
@SuppressWarnings("rawtypes")
1646+
UpdateAction.Builder actionBuilder =
1647+
new UpdateAction.Builder()
1648+
.detectNoop(update.detectNoop())
1649+
.docAsUpsert(update.docAsUpsert())
1650+
.script(script)
1651+
.upsert(update.upsert());
1652+
1653+
// Only set doc if it exists (not present for script-only updates)
1654+
if (update.doc() != null) {
1655+
actionBuilder.doc(
1656+
XContentHelper.convertToMap(update.doc().source(), true, XContentType.JSON).v2());
1657+
}
1658+
16441659
operation =
16451660
new BulkOperation(
16461661
new UpdateOperation.Builder<>()
@@ -1651,17 +1666,7 @@ protected void addToProcessor(BulkIngester<?> processor, DocWriteRequest<?> writ
16511666
.requireAlias(writeRequest.isRequireAlias())
16521667
.index(writeRequest.index())
16531668
.routing(writeRequest.routing())
1654-
.action(
1655-
new UpdateAction.Builder<>()
1656-
.doc(
1657-
XContentHelper.convertToMap(
1658-
update.doc().source(), true, XContentType.JSON)
1659-
.v2())
1660-
.detectNoop(update.detectNoop())
1661-
.docAsUpsert(update.docAsUpsert())
1662-
.script(script)
1663-
.upsert(update.upsert())
1664-
.build())
1669+
.action(actionBuilder.build())
16651670
.build());
16661671
} else if (writeRequest instanceof DeleteRequest) {
16671672
DeleteRequest deleteRequest = (DeleteRequest) writeRequest;

metadata-io/src/test/java/com/linkedin/metadata/search/update/ESWriteDAOTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ public void testDeleteDocument() {
116116
assertEquals(capturedRequest.id(), TEST_DOC_ID);
117117
}
118118

119+
@Test
119120
public void testApplyScriptUpdate() {
120121
String scriptSource = "ctx._source.field = params.newValue";
121122
Map<String, Object> scriptParams = new HashMap<>();
@@ -135,6 +136,7 @@ public void testApplyScriptUpdate() {
135136
assertFalse(capturedRequest.detectNoop());
136137
assertTrue(capturedRequest.scriptedUpsert());
137138
assertEquals(NUM_RETRIES, capturedRequest.retryOnConflict());
139+
assertNull(capturedRequest.doc()); // For scripted updates, this is null
138140

139141
// Verify script content and parameters
140142
Script script = capturedRequest.script();

0 commit comments

Comments
 (0)