1313import org .apache .lucene .util .automaton .TooComplexToDeterminizeException ;
1414import org .elasticsearch .ExceptionsHelper ;
1515import org .elasticsearch .action .ActionListener ;
16+ import org .elasticsearch .action .ActionListenerResponseHandler ;
1617import org .elasticsearch .action .ActionRunnable ;
1718import org .elasticsearch .action .ActionType ;
1819import org .elasticsearch .action .OriginalIndices ;
2223import org .elasticsearch .action .support .ChannelActionListener ;
2324import org .elasticsearch .action .support .HandledTransportAction ;
2425import org .elasticsearch .action .support .RefCountingRunnable ;
25- import org .elasticsearch .client . internal . RemoteClusterClient ;
26+ import org .elasticsearch .action . support . SubscribableListener ;
2627import org .elasticsearch .cluster .ProjectState ;
2728import org .elasticsearch .cluster .block .ClusterBlockLevel ;
2829import org .elasticsearch .cluster .metadata .IndexNameExpressionResolver ;
3738import org .elasticsearch .common .util .concurrent .ThrottledTaskRunner ;
3839import org .elasticsearch .core .Nullable ;
3940import org .elasticsearch .core .Releasable ;
41+ import org .elasticsearch .core .TimeValue ;
4042import org .elasticsearch .core .Tuple ;
4143import org .elasticsearch .index .shard .ShardId ;
4244import org .elasticsearch .indices .IndicesService ;
4850import org .elasticsearch .tasks .Task ;
4951import org .elasticsearch .threadpool .ThreadPool ;
5052import org .elasticsearch .transport .RemoteClusterAware ;
51- import org .elasticsearch .transport .RemoteClusterService ;
53+ import org .elasticsearch .transport .Transport ;
5254import org .elasticsearch .transport .TransportChannel ;
5355import org .elasticsearch .transport .TransportRequestHandler ;
56+ import org .elasticsearch .transport .TransportRequestOptions ;
5457import org .elasticsearch .transport .TransportService ;
5558
5659import java .util .ArrayList ;
@@ -91,6 +94,8 @@ public class TransportFieldCapabilitiesAction extends HandledTransportAction<Fie
9194
9295 private final IndicesService indicesService ;
9396 private final boolean ccsCheckCompatibility ;
97+ private final ThreadPool threadPool ;
98+ private final TimeValue forceConnectTimeoutSecs ;
9499
95100 @ Inject
96101 public TransportFieldCapabilitiesAction (
@@ -117,14 +122,22 @@ public TransportFieldCapabilitiesAction(
117122 new NodeTransportHandler ()
118123 );
119124 this .ccsCheckCompatibility = SearchService .CCS_VERSION_CHECK_SETTING .get (clusterService .getSettings ());
125+ this .threadPool = threadPool ;
126+ this .forceConnectTimeoutSecs = clusterService .getSettings ().getAsTime ("search.ccs.force_connect_timeout" , null );
120127 }
121128
122129 @ Override
123130 protected void doExecute (Task task , FieldCapabilitiesRequest request , final ActionListener <FieldCapabilitiesResponse > listener ) {
124131 executeRequest (
125132 task ,
126133 request ,
127- (remoteClient , remoteRequest , remoteListener ) -> remoteClient .execute (REMOTE_TYPE , remoteRequest , remoteListener ),
134+ (transportService , conn , fieldCapabilitiesRequest , responseHandler ) -> transportService .sendRequest (
135+ conn ,
136+ REMOTE_TYPE .name (),
137+ fieldCapabilitiesRequest ,
138+ TransportRequestOptions .EMPTY ,
139+ responseHandler
140+ ),
128141 listener
129142 );
130143 }
@@ -268,12 +281,6 @@ private void doExecuteForked(
268281 for (Map .Entry <String , OriginalIndices > remoteIndices : remoteClusterIndices .entrySet ()) {
269282 String clusterAlias = remoteIndices .getKey ();
270283 OriginalIndices originalIndices = remoteIndices .getValue ();
271- var remoteClusterClient = transportService .getRemoteClusterService ()
272- .getRemoteClusterClient (
273- clusterAlias ,
274- singleThreadedExecutor ,
275- RemoteClusterService .DisconnectedStrategy .RECONNECT_UNLESS_SKIP_UNAVAILABLE
276- );
277284 FieldCapabilitiesRequest remoteRequest = prepareRemoteRequest (clusterAlias , request , originalIndices , nowInMillis );
278285 ActionListener <FieldCapabilitiesResponse > remoteListener = ActionListener .wrap (response -> {
279286 for (FieldCapabilitiesIndexResponse resp : response .getIndexResponses ()) {
@@ -299,18 +306,34 @@ private void doExecuteForked(
299306 handleIndexFailure .accept (RemoteClusterAware .buildRemoteIndexName (clusterAlias , index ), ex );
300307 }
301308 });
302- remoteRequestExecutor .executeRemoteRequest (
303- remoteClusterClient ,
304- remoteRequest ,
309+
310+ SubscribableListener <Transport .Connection > connectionListener = new SubscribableListener <>();
311+ if (forceConnectTimeoutSecs != null ) {
312+ connectionListener .addTimeout (forceConnectTimeoutSecs , threadPool , singleThreadedExecutor );
313+ }
314+
315+ connectionListener .addListener (
305316 // The underlying transport service may call onFailure with a thread pool other than search_coordinator.
306317 // This fork is a workaround to ensure that the merging of field-caps always occurs on the search_coordinator.
307318 // TODO: remove this workaround after we fixed https://github.com/elastic/elasticsearch/issues/107439
308319 new ForkingOnFailureActionListener <>(
309320 singleThreadedExecutor ,
310321 true ,
311322 ActionListener .releaseAfter (remoteListener , refs .acquire ())
323+ ).delegateFailure (
324+ (responseListener , conn ) -> remoteRequestExecutor .executeRemoteRequest (
325+ transportService ,
326+ conn ,
327+ remoteRequest ,
328+ new ActionListenerResponseHandler <>(responseListener , FieldCapabilitiesResponse ::new , singleThreadedExecutor )
329+ )
312330 )
313331 );
332+
333+ boolean ensureConnected = forceConnectTimeoutSecs != null
334+ || transportService .getRemoteClusterService ().isSkipUnavailable (clusterAlias ) == false ;
335+ transportService .getRemoteClusterService ()
336+ .maybeEnsureConnectedAndGetConnection (clusterAlias , ensureConnected , connectionListener );
314337 }
315338 }
316339 }
@@ -340,9 +363,10 @@ public void onFailure(Exception e) {
340363
341364 public interface RemoteRequestExecutor {
342365 void executeRemoteRequest (
343- RemoteClusterClient remoteClient ,
366+ TransportService transportService ,
367+ Transport .Connection conn ,
344368 FieldCapabilitiesRequest remoteRequest ,
345- ActionListener <FieldCapabilitiesResponse > remoteListener
369+ ActionListenerResponseHandler <FieldCapabilitiesResponse > responseHandler
346370 );
347371 }
348372
0 commit comments