Update RemoteModule to use registry methods instead of executorInit where possible.

Part of the roll-forward of https://github.com/bazelbuild/bazel/commit/37aeabcd39fe326d1c4e55693d8d207f9f7ac6c4.

PiperOrigin-RevId: 303938923
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java
index 0a0ed81..3506993 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java
@@ -22,12 +22,12 @@
 import com.google.devtools.build.lib.actions.ActionGraph;
 import com.google.devtools.build.lib.actions.ActionInput;
 import com.google.devtools.build.lib.actions.ExecutorInitException;
-import com.google.devtools.build.lib.actions.SpawnStrategy;
 import com.google.devtools.build.lib.analysis.ArtifactsToOwnerLabels;
 import com.google.devtools.build.lib.exec.ExecutionOptions;
-import com.google.devtools.build.lib.exec.ExecutorBuilder;
 import com.google.devtools.build.lib.exec.ExecutorLifecycleListener;
+import com.google.devtools.build.lib.exec.ModuleActionContextRegistry;
 import com.google.devtools.build.lib.exec.SpawnCache;
+import com.google.devtools.build.lib.exec.SpawnStrategyRegistry;
 import com.google.devtools.build.lib.remote.options.RemoteOptions;
 import com.google.devtools.build.lib.remote.util.DigestUtil;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
@@ -80,45 +80,59 @@
         env, cache, executor, retryScheduler, digestUtil, logDir);
   }
 
-  /** Registers the action contexts whose lifecycle this class manages. */
-  public void registerActionContexts(ExecutorBuilder executorBuilder) {
-    ExecutionOptions executionOptions =
-        checkNotNull(env.getOptions().getOptions(ExecutionOptions.class));
-    RemoteOptions remoteOptions = checkNotNull(env.getOptions().getOptions(RemoteOptions.class));
-    String buildRequestId = env.getBuildRequestId();
-    String commandId = env.getCommandId().toString();
-
+  /**
+   * Registers a remote spawn strategy if this instance was created with an executor, otherwise does
+   * nothing.
+   *
+   * @param registryBuilder builder with which to register the strategy
+   */
+  public void registerRemoteSpawnStrategyIfApplicable(
+      SpawnStrategyRegistry.Builder registryBuilder) {
     if (executor == null) {
-      RemoteSpawnCache spawnCache =
-          new RemoteSpawnCache(
-              env.getExecRoot(),
-              remoteOptions,
-              cache,
-              buildRequestId,
-              commandId,
-              env.getReporter(),
-              digestUtil,
-              filesToDownload);
-      executorBuilder.addActionContext(SpawnCache.class, spawnCache, "remote-cache");
-    } else {
-      RemoteSpawnRunner spawnRunner =
-          new RemoteSpawnRunner(
-              env.getExecRoot(),
-              remoteOptions,
-              env.getOptions().getOptions(ExecutionOptions.class),
-              executionOptions.verboseFailures,
-              env.getReporter(),
-              buildRequestId,
-              commandId,
-              (RemoteExecutionCache) cache,
-              executor,
-              retryScheduler,
-              digestUtil,
-              logDir,
-              filesToDownload);
-      executorBuilder.addActionContext(
-          SpawnStrategy.class, new RemoteSpawnStrategy(env.getExecRoot(), spawnRunner), "remote");
+      return; // Can't use a spawn strategy without executor.
     }
+
+    RemoteSpawnRunner spawnRunner =
+        new RemoteSpawnRunner(
+            env.getExecRoot(),
+            checkNotNull(env.getOptions().getOptions(RemoteOptions.class)),
+            env.getOptions().getOptions(ExecutionOptions.class),
+            checkNotNull(env.getOptions().getOptions(ExecutionOptions.class)).verboseFailures,
+            env.getReporter(),
+            env.getBuildRequestId(),
+            env.getCommandId().toString(),
+            (RemoteExecutionCache) cache,
+            executor,
+            retryScheduler,
+            digestUtil,
+            logDir,
+            filesToDownload);
+    registryBuilder.registerStrategy(
+        new RemoteSpawnStrategy(env.getExecRoot(), spawnRunner), "remote");
+  }
+
+  /**
+   * Registers a spawn cache action context if this instance was created without an executor,
+   * otherwise does nothing.
+   *
+   * @param registryBuilder builder with which to register the cache
+   */
+  public void registerSpawnCacheIfApplicable(ModuleActionContextRegistry.Builder registryBuilder) {
+    if (executor != null) {
+      return; // No need to register cache if we're using a remote executor.
+    }
+
+    RemoteSpawnCache spawnCache =
+        new RemoteSpawnCache(
+            env.getExecRoot(),
+            checkNotNull(env.getOptions().getOptions(RemoteOptions.class)),
+            cache,
+            env.getBuildRequestId(),
+            env.getCommandId().toString(),
+            env.getReporter(),
+            digestUtil,
+            filesToDownload);
+    registryBuilder.register(SpawnCache.class, spawnCache, "remote-cache");
   }
 
   /** Returns the remote cache. */
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java
index 1926d3d..b834667 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java
@@ -43,6 +43,8 @@
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.Reporter;
 import com.google.devtools.build.lib.exec.ExecutorBuilder;
+import com.google.devtools.build.lib.exec.ModuleActionContextRegistry;
+import com.google.devtools.build.lib.exec.SpawnStrategyRegistry;
 import com.google.devtools.build.lib.packages.TargetUtils;
 import com.google.devtools.build.lib.remote.common.RemoteCacheClient;
 import com.google.devtools.build.lib.remote.downloader.GrpcRemoteDownloader;
@@ -567,6 +569,31 @@
   }
 
   @Override
+  public void registerSpawnStrategies(
+      SpawnStrategyRegistry.Builder registryBuilder, CommandEnvironment env) {
+    if (actionContextProvider == null) {
+      return;
+    }
+    RemoteOptions remoteOptions =
+        Preconditions.checkNotNull(
+            env.getOptions().getOptions(RemoteOptions.class), "RemoteOptions");
+    registryBuilder.setRemoteLocalFallbackStrategyIdentifier(
+        remoteOptions.remoteLocalFallbackStrategy);
+    actionContextProvider.registerRemoteSpawnStrategyIfApplicable(registryBuilder);
+  }
+
+  @Override
+  public void registerActionContexts(
+      ModuleActionContextRegistry.Builder registryBuilder,
+      CommandEnvironment env,
+      BuildRequest buildRequest) {
+    if (actionContextProvider == null) {
+      return;
+    }
+    actionContextProvider.registerSpawnCacheIfApplicable(registryBuilder);
+  }
+
+  @Override
   public void executorInit(CommandEnvironment env, BuildRequest request, ExecutorBuilder builder) {
     Preconditions.checkState(actionInputFetcher == null, "actionInputFetcher must be null");
     Preconditions.checkNotNull(remoteOutputsMode, "remoteOutputsMode must not be null");
@@ -574,7 +601,6 @@
     if (actionContextProvider == null) {
       return;
     }
-    actionContextProvider.registerActionContexts(builder);
     builder.addExecutorLifecycleListener(actionContextProvider);
     RemoteOptions remoteOptions =
         Preconditions.checkNotNull(
@@ -590,8 +616,6 @@
       builder.setActionInputPrefetcher(actionInputFetcher);
       remoteOutputService.setActionInputFetcher(actionInputFetcher);
     }
-
-    builder.setRemoteFallbackStrategy(remoteOptions.remoteLocalFallbackStrategy);
   }
 
   @Override