Change short output of worker type to have the same logic as the worker creation for sandboxing vs. multiplex.

This also clears up some messy handling of the multiplex/dynamic handling.

RELNOTES: None.
PiperOrigin-RevId: 361506276
diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerFactory.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerFactory.java
index 337b18b..5088d50 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/WorkerFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerFactory.java
@@ -55,7 +55,7 @@
   @Override
   public Worker create(WorkerKey key) {
     int workerId = pidCounter.getAndIncrement();
-    String workTypeName = WorkerKey.makeWorkerTypeName(key.getProxied());
+    String workTypeName = key.getWorkerTypeName();
     Path logFile =
         workerBaseDir.getRelative(workTypeName + "-" + workerId + "-" + key.getMnemonic() + ".log");
 
@@ -87,12 +87,7 @@
   Path getSandboxedWorkerPath(WorkerKey key, int workerId) {
     String workspaceName = key.getExecRoot().getBaseName();
     return workerBaseDir
-        .getRelative(
-            WorkerKey.makeWorkerTypeName(key.getProxied())
-                + "-"
-                + workerId
-                + "-"
-                + key.getMnemonic())
+        .getRelative(key.getWorkerTypeName() + "-" + workerId + "-" + key.getMnemonic())
         .getRelative(workspaceName);
   }
 
@@ -115,7 +110,7 @@
           Event.info(
               String.format(
                   "Destroying %s %s (id %d)",
-                  key.getMnemonic(), WorkerKey.makeWorkerTypeName(key.getProxied()), workerId)));
+                  key.getMnemonic(), key.getWorkerTypeName(), workerId)));
     }
     p.getObject().destroy();
   }
@@ -135,7 +130,7 @@
               String.format(
                   "%s %s (id %d) has unexpectedly died with exit code %d.",
                   key.getMnemonic(),
-                  WorkerKey.makeWorkerTypeName(key.getProxied()),
+                  key.getWorkerTypeName(),
                   worker.getWorkerId(),
                   exitValue.get());
           ErrorMessage errorMessage =
@@ -150,9 +145,7 @@
           String msg =
               String.format(
                   "%s %s (id %d) was destroyed, but is still in the worker pool.",
-                  key.getMnemonic(),
-                  WorkerKey.makeWorkerTypeName(key.getProxied()),
-                  worker.getWorkerId());
+                  key.getMnemonic(), key.getWorkerTypeName(), worker.getWorkerId());
           reporter.handle(Event.info(msg));
         }
       }
@@ -166,9 +159,7 @@
       msg.append(
           String.format(
               "%s %s (id %d) can no longer be used, because its files have changed on disk:",
-              key.getMnemonic(),
-              WorkerKey.makeWorkerTypeName(key.getProxied()),
-              worker.getWorkerId()));
+              key.getMnemonic(), key.getWorkerTypeName(), worker.getWorkerId()));
       TreeSet<PathFragment> files = new TreeSet<>();
       files.addAll(key.getWorkerFilesWithHashes().keySet());
       files.addAll(worker.getWorkerFilesWithHashes().keySet());
diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerKey.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerKey.java
index 5cdfee3..c4741d6 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/WorkerKey.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerKey.java
@@ -127,20 +127,29 @@
     return proxied;
   }
 
+  public boolean isMultiplex() {
+    return getProxied() && !mustBeSandboxed;
+  }
+
   /** Returns the format of the worker protocol. */
   public WorkerProtocolFormat getProtocolFormat() {
     return protocolFormat;
   }
 
   /** Returns a user-friendly name for this worker type. */
-  public static String makeWorkerTypeName(boolean proxied) {
-    if (proxied) {
+  public static String makeWorkerTypeName(boolean proxied, boolean mustBeSandboxed) {
+    if (proxied && !mustBeSandboxed) {
       return "multiplex-worker";
     } else {
       return "worker";
     }
   }
 
+  /** Returns a user-friendly name for this worker type. */
+  public String getWorkerTypeName() {
+    return makeWorkerTypeName(proxied, mustBeSandboxed);
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) {
diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerMultiplexerManager.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerMultiplexerManager.java
index 0a58cd5..ed4353e 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/WorkerMultiplexerManager.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerMultiplexerManager.java
@@ -75,7 +75,7 @@
     InstanceInfo instanceInfo = multiplexerInstance.get(key);
     if (instanceInfo == null) {
       throw createUserExecException(
-          "Attempting to remove non-existent multiplexer instance.",
+          String.format("Attempting to remove non-existent multiplexer instance for %s.", key),
           Code.MULTIPLEXER_INSTANCE_REMOVAL_FAILURE);
     }
     instanceInfo.decreaseRefCount();
diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerPool.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerPool.java
index 9669af8..abfa98c 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/WorkerPool.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerPool.java
@@ -110,7 +110,7 @@
   }
 
   private SimpleWorkerPool getPool(WorkerKey key) {
-    if (key.getProxied()) {
+    if (key.isMultiplex()) {
       return multiplexPools.getOrDefault(key.getMnemonic(), multiplexPools.get(""));
     } else {
       return workerPools.getOrDefault(key.getMnemonic(), workerPools.get(""));
diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerSpawnRunner.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerSpawnRunner.java
index 1c43cbc..d7f1cc9 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/WorkerSpawnRunner.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerSpawnRunner.java
@@ -144,7 +144,8 @@
       throws ExecException, IOException, InterruptedException {
     context.report(
         ProgressStatus.SCHEDULING,
-        WorkerKey.makeWorkerTypeName(Spawns.supportsMultiplexWorkers(spawn)));
+        WorkerKey.makeWorkerTypeName(
+            Spawns.supportsMultiplexWorkers(spawn), context.speculating()));
     if (spawn.getToolFiles().isEmpty()) {
       throw createUserExecException(
           String.format(ERROR_MESSAGE_PREFIX + REASON_NO_TOOLS, spawn.getMnemonic()),
@@ -301,7 +302,7 @@
 
       requestBuilder.addInputsBuilder().setPath(input.getExecPathString()).setDigest(digest);
     }
-    if (key.getProxied()) {
+    if (key.isMultiplex()) {
       requestBuilder.setRequestId(requestIdCounter.getAndIncrement());
     }
     return requestBuilder.build();
@@ -420,7 +421,7 @@
         // We acquired a worker and resources -- mark that as queuing time.
         spawnMetrics.setQueueTime(queueStopwatch.elapsed());
 
-        context.report(ProgressStatus.EXECUTING, WorkerKey.makeWorkerTypeName(key.getProxied()));
+        context.report(ProgressStatus.EXECUTING, key.getWorkerTypeName());
         try {
           // We consider `prepareExecution` to be also part of setup.
           Stopwatch prepareExecutionStopwatch = Stopwatch.createStarted();
diff --git a/src/test/java/com/google/devtools/build/lib/worker/WorkerKeyTest.java b/src/test/java/com/google/devtools/build/lib/worker/WorkerKeyTest.java
index 656c4a5..0a078b6 100644
--- a/src/test/java/com/google/devtools/build/lib/worker/WorkerKeyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/worker/WorkerKeyTest.java
@@ -49,10 +49,18 @@
 
   @Test
   public void testWorkerKeyGetter() {
-    assertThat(workerKey.mustBeSandboxed()).isEqualTo(true);
-    assertThat(workerKey.getProxied()).isEqualTo(true);
-    assertThat(WorkerKey.makeWorkerTypeName(false)).isEqualTo("worker");
-    assertThat(WorkerKey.makeWorkerTypeName(true)).isEqualTo("multiplex-worker");
+    assertThat(workerKey.mustBeSandboxed()).isTrue();
+    assertThat(workerKey.getProxied()).isTrue();
+    assertThat(workerKey.isMultiplex()).isFalse();
+    assertThat(workerKey.getWorkerTypeName()).isEqualTo("worker");
+    assertThat(WorkerKey.makeWorkerTypeName(/* proxied=*/ false, /* mustBeSandboxed=*/ false))
+        .isEqualTo("worker");
+    assertThat(WorkerKey.makeWorkerTypeName(/* proxied=*/ false, /* mustBeSandboxed=*/ true))
+        .isEqualTo("worker");
+    assertThat(WorkerKey.makeWorkerTypeName(/* proxied=*/ true, /* mustBeSandboxed=*/ false))
+        .isEqualTo("multiplex-worker");
+    assertThat(WorkerKey.makeWorkerTypeName(/* proxied=*/ true, /* mustBeSandboxed=*/ true))
+        .isEqualTo("worker");
     // Hash code contains args, env, execRoot, proxied, and mnemonic.
     assertThat(workerKey.hashCode()).isEqualTo(1605714200);
     assertThat(workerKey.getProtocolFormat()).isEqualTo(WorkerProtocolFormat.PROTO);
diff --git a/src/test/java/com/google/devtools/build/lib/worker/WorkerSpawnRunnerTest.java b/src/test/java/com/google/devtools/build/lib/worker/WorkerSpawnRunnerTest.java
index d81f3a6..adf995c 100644
--- a/src/test/java/com/google/devtools/build/lib/worker/WorkerSpawnRunnerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/worker/WorkerSpawnRunnerTest.java
@@ -17,12 +17,15 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.worker.TestUtils.createWorkerKey;
 import static org.junit.Assert.assertThrows;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.actions.ExecException;
+import com.google.devtools.build.lib.actions.ExecutionRequirements.WorkerProtocolFormat;
 import com.google.devtools.build.lib.actions.MetadataProvider;
 import com.google.devtools.build.lib.actions.ResourceManager;
 import com.google.devtools.build.lib.actions.Spawn;
@@ -31,6 +34,7 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.events.ExtendedEventHandler;
+import com.google.devtools.build.lib.exec.SpawnRunner.ProgressStatus;
 import com.google.devtools.build.lib.exec.SpawnRunner.SpawnExecutionContext;
 import com.google.devtools.build.lib.exec.local.LocalEnvProvider;
 import com.google.devtools.build.lib.sandbox.SandboxHelpers;
@@ -127,6 +131,51 @@
     assertThat(response.getRequestId()).isEqualTo(0);
     assertThat(response.getOutput()).isEqualTo("out");
     assertThat(logFile.exists()).isFalse();
+    verify(context, times(1)).report(ProgressStatus.EXECUTING, "worker");
+  }
+
+  @Test
+  public void testExecInWorker_noMultiplexWithDynamic()
+      throws ExecException, InterruptedException, IOException {
+    WorkerOptions workerOptions = new WorkerOptions();
+    workerOptions.workerMultiplex = true;
+    when(context.speculating()).thenReturn(true);
+    WorkerSpawnRunner runner =
+        new WorkerSpawnRunner(
+            new SandboxHelpers(false),
+            fs.getPath("/execRoot"),
+            createWorkerPool(),
+            /* multiplex */ true,
+            reporter,
+            localEnvProvider,
+            /* binTools */ null,
+            resourceManager,
+            /* runfilestTreeUpdater */ null,
+            workerOptions);
+    // This worker key just so happens to be multiplex and require sandboxing.
+    WorkerKey key = createWorkerKey(WorkerProtocolFormat.JSON, fs);
+    Path logFile = fs.getPath("/worker.log");
+    when(worker.getLogFile()).thenReturn(logFile);
+    when(worker.getResponse(0))
+        .thenReturn(
+            WorkResponse.newBuilder().setExitCode(0).setRequestId(0).setOutput("out").build());
+    WorkResponse response =
+        runner.execInWorker(
+            spawn,
+            key,
+            context,
+            new SandboxInputs(ImmutableMap.of(), ImmutableSet.of(), ImmutableMap.of()),
+            SandboxOutputs.create(ImmutableSet.of(), ImmutableSet.of()),
+            ImmutableList.of(),
+            inputFileCache,
+            spawnMetrics);
+
+    assertThat(response).isNotNull();
+    assertThat(response.getExitCode()).isEqualTo(0);
+    assertThat(response.getRequestId()).isEqualTo(0);
+    assertThat(response.getOutput()).isEqualTo("out");
+    assertThat(logFile.exists()).isFalse();
+    verify(context, times(1)).report(ProgressStatus.EXECUTING, "worker");
   }
 
   private void assertRecordedResponsethrowsException(String recordedResponse, String exceptionText)