16
16
import java .util .Map ;
17
17
import java .util .stream .Collectors ;
18
18
19
+ import org .opensearch .OpenSearchStatusException ;
19
20
import org .opensearch .action .FailedNodeException ;
20
- import org .opensearch .action .bulk .BulkRequest ;
21
+ import org .opensearch .action .bulk .BulkItemResponse ;
21
22
import org .opensearch .action .bulk .BulkResponse ;
22
23
import org .opensearch .action .support .ActionFilters ;
23
24
import org .opensearch .action .support .WriteRequest ;
24
25
import org .opensearch .action .support .nodes .TransportNodesAction ;
25
- import org .opensearch .action .update .UpdateRequest ;
26
26
import org .opensearch .cluster .service .ClusterService ;
27
27
import org .opensearch .common .inject .Inject ;
28
28
import org .opensearch .common .util .concurrent .ThreadContext ;
43
43
import org .opensearch .ml .model .MLModelManager ;
44
44
import org .opensearch .ml .stats .MLNodeLevelStat ;
45
45
import org .opensearch .ml .stats .MLStats ;
46
+ import org .opensearch .remote .metadata .client .BulkDataObjectRequest ;
47
+ import org .opensearch .remote .metadata .client .SdkClient ;
48
+ import org .opensearch .remote .metadata .client .UpdateDataObjectRequest ;
49
+ import org .opensearch .remote .metadata .common .SdkClientUtils ;
46
50
import org .opensearch .tasks .Task ;
47
51
import org .opensearch .threadpool .ThreadPool ;
48
52
import org .opensearch .transport .TransportService ;
@@ -58,6 +62,7 @@ public class TransportUndeployModelAction extends
58
62
private final MLModelManager mlModelManager ;
59
63
private final ClusterService clusterService ;
60
64
private final Client client ;
65
+ private final SdkClient sdkClient ;
61
66
private final DiscoveryNodeHelper nodeFilter ;
62
67
private final MLStats mlStats ;
63
68
@@ -69,6 +74,7 @@ public TransportUndeployModelAction(
69
74
ClusterService clusterService ,
70
75
ThreadPool threadPool ,
71
76
Client client ,
77
+ SdkClient sdkClient ,
72
78
DiscoveryNodeHelper nodeFilter ,
73
79
MLStats mlStats
74
80
) {
@@ -87,19 +93,21 @@ public TransportUndeployModelAction(
87
93
88
94
this .clusterService = clusterService ;
89
95
this .client = client ;
96
+ this .sdkClient = sdkClient ;
90
97
this .nodeFilter = nodeFilter ;
91
98
this .mlStats = mlStats ;
92
99
}
93
100
94
101
@ Override
95
102
protected void doExecute (Task task , MLUndeployModelNodesRequest request , ActionListener <MLUndeployModelNodesResponse > listener ) {
96
103
ActionListener <MLUndeployModelNodesResponse > wrappedListener = ActionListener .wrap (undeployModelNodesResponse -> {
97
- processUndeployModelResponseAndUpdate (undeployModelNodesResponse , listener );
104
+ processUndeployModelResponseAndUpdate (request . getTenantId (), undeployModelNodesResponse , listener );
98
105
}, listener ::onFailure );
99
106
super .doExecute (task , request , wrappedListener );
100
107
}
101
108
102
109
void processUndeployModelResponseAndUpdate (
110
+ String tenantId ,
103
111
MLUndeployModelNodesResponse undeployModelNodesResponse ,
104
112
ActionListener <MLUndeployModelNodesResponse > listener
105
113
) {
@@ -145,11 +153,10 @@ void processUndeployModelResponseAndUpdate(
145
153
146
154
MLSyncUpNodesRequest syncUpRequest = new MLSyncUpNodesRequest (nodeFilter .getAllNodes (), syncUpInput );
147
155
try (ThreadContext .StoredContext context = client .threadPool ().getThreadContext ().stashContext ()) {
148
- if (actualRemovedNodesMap .size () > 0 ) {
149
- BulkRequest bulkRequest = new BulkRequest ();
156
+ if (! actualRemovedNodesMap .isEmpty () ) {
157
+ BulkDataObjectRequest bulkRequest = BulkDataObjectRequest . builder (). globalIndex ( ML_MODEL_INDEX ). build ();
150
158
Map <String , Boolean > deployToAllNodes = new HashMap <>();
151
159
for (String modelId : actualRemovedNodesMap .keySet ()) {
152
- UpdateRequest updateRequest = new UpdateRequest ();
153
160
List <String > removedNodes = actualRemovedNodesMap .get (modelId );
154
161
int removedNodeCount = removedNodes .size ();
155
162
/**
@@ -178,7 +185,13 @@ void processUndeployModelResponseAndUpdate(
178
185
updateDocument .put (MLModel .CURRENT_WORKER_NODE_COUNT_FIELD , newPlanningWorkerNodes .size ());
179
186
deployToAllNodes .put (modelId , false );
180
187
}
181
- updateRequest .index (ML_MODEL_INDEX ).id (modelId ).doc (updateDocument );
188
+
189
+ UpdateDataObjectRequest updateRequest = UpdateDataObjectRequest
190
+ .builder ()
191
+ .id (modelId )
192
+ .tenantId (tenantId )
193
+ .dataObject (updateDocument )
194
+ .build ();
182
195
bulkRequest .add (updateRequest ).setRefreshPolicy (WriteRequest .RefreshPolicy .IMMEDIATE );
183
196
}
184
197
syncUpInput .setDeployToAllNodes (deployToAllNodes );
@@ -189,10 +202,33 @@ void processUndeployModelResponseAndUpdate(
189
202
Arrays .toString (actualRemovedNodesMap .keySet ().toArray (new String [0 ]))
190
203
);
191
204
}, e -> { log .error ("Failed to update model state as undeployed" , e ); });
192
- client . bulk ( bulkRequest , ActionListener .runAfter (actionListener , () -> {
205
+ ActionListener < BulkResponse > wrappedListener = ActionListener .runAfter (actionListener , () -> {
193
206
syncUpUndeployedModels (syncUpRequest );
194
207
listener .onResponse (undeployModelNodesResponse );
195
- }));
208
+ });
209
+ sdkClient .bulkDataObjectAsync (bulkRequest ).whenComplete ((r , throwable ) -> {
210
+ if (throwable != null ) {
211
+ Exception cause = SdkClientUtils .unwrapAndConvertToException (throwable , OpenSearchStatusException .class );
212
+ log .error ("Failed to execute BulkDataObject request" , cause );
213
+ wrappedListener .onFailure (cause );
214
+ } else {
215
+ try {
216
+ BulkResponse bulkResponse = BulkResponse .fromXContent (r .parser ());
217
+ log
218
+ .info (
219
+ "Executed {} bulk operations with {} failures, Took: {}" ,
220
+ bulkResponse .getItems ().length ,
221
+ bulkResponse .hasFailures ()
222
+ ? Arrays .stream (bulkResponse .getItems ()).filter (BulkItemResponse ::isFailed ).count ()
223
+ : 0 ,
224
+ bulkResponse .getTook ()
225
+ );
226
+ wrappedListener .onResponse (bulkResponse );
227
+ } catch (Exception e ) {
228
+ wrappedListener .onFailure (e );
229
+ }
230
+ }
231
+ });
196
232
} else {
197
233
syncUpUndeployedModels (syncUpRequest );
198
234
listener .onResponse (undeployModelNodesResponse );
0 commit comments