Include worker-key-mnemonic when copying the execution_requirements into the execution info.

This key allows the sharing of workers between actions with different mnemonics. Note the problematic filtering occurs in registerStarlarkAction in StarlarkActionFactory.java.

PiperOrigin-RevId: 317141655
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BUILD b/src/main/java/com/google/devtools/build/lib/packages/BUILD
index 93313ad..03d8627 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/packages/BUILD
@@ -33,6 +33,7 @@
     deps = [
         ":build_type",
         ":type",
+        "//src/main/java/com/google/devtools/build/lib/actions:execution_requirements",
         "//src/main/java/com/google/devtools/build/lib/analysis:config/config_matching_provider",
         "//src/main/java/com/google/devtools/build/lib/analysis:config/transitions/configuration_transition",
         "//src/main/java/com/google/devtools/build/lib/analysis:config/transitions/no_transition",
@@ -65,7 +66,6 @@
         "//src/main/java/net/starlark/java/spelling",
         "//src/main/protobuf:build_java_proto",
         "//third_party:auto_value",
-        "//third_party:flogger",
         "//third_party:guava",
         "//third_party:jsr305",
         "//third_party/protobuf:protobuf_java",
diff --git a/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java b/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
index 2c964ef..25e053a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
@@ -22,6 +22,7 @@
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
+import com.google.devtools.build.lib.actions.ExecutionRequirements;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.syntax.Dict;
 import com.google.devtools.build.lib.syntax.EvalException;
@@ -53,8 +54,9 @@
         || tag.startsWith("no-")
         || tag.startsWith("supports-")
         || tag.startsWith("disable-")
-        || tag.equals("local")
-        || tag.startsWith("cpu:");
+        || tag.startsWith("cpu:")
+        || tag.equals(ExecutionRequirements.LOCAL)
+        || tag.equals(ExecutionRequirements.WORKER_KEY_MNEMONIC);
   }
 
   private TargetUtils() {} // Uninstantiable.
diff --git a/src/test/java/com/google/devtools/build/lib/packages/TargetUtilsTest.java b/src/test/java/com/google/devtools/build/lib/packages/TargetUtilsTest.java
index d140af0..bfc69cf 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/TargetUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/TargetUtilsTest.java
@@ -191,7 +191,7 @@
   }
 
   @Test
-  public void testFilteredExecutionInfo_FromUncheckedExecRequirements() throws Exception {
+  public void testFilteredExecutionInfo_fromUncheckedExecRequirements() throws Exception {
     scratch.file("tests/BUILD", "sh_binary(name = 'no-tag', srcs=['sh.sh'])");
 
     Rule noTag = (Rule) getTarget("//tests:no-tag");
@@ -212,6 +212,23 @@
   }
 
   @Test
+  public void testFilteredExecutionInfo_fromUncheckedExecRequirements_withWorkerKeyMnemonic()
+      throws Exception {
+    scratch.file("tests/BUILD", "sh_binary(name = 'no-tag', srcs=['sh.sh'])");
+
+    Rule noTag = (Rule) getTarget("//tests:no-tag");
+
+    Map<String, String> execInfo =
+        TargetUtils.getFilteredExecutionInfo(
+            Dict.of(
+                (Mutability) null, "supports-workers", "1", "worker-key-mnemonic", "MyMnemonic"),
+            noTag, /* allowTagsPropagation */
+            true);
+    assertThat(execInfo)
+        .containsExactly("supports-workers", "1", "worker-key-mnemonic", "MyMnemonic");
+  }
+
+  @Test
   public void testFilteredExecutionInfo() throws Exception {
     scratch.file(
         "tests/BUILD",
@@ -244,7 +261,7 @@
   }
 
   @Test
-  public void testFilteredExecutionInfo_WithNullUncheckedExecRequirements() throws Exception {
+  public void testFilteredExecutionInfo_withNullUncheckedExecRequirements() throws Exception {
     scratch.file(
         "tests/BUILD",
         "sh_binary(name = 'tag1', srcs=['sh.sh'], tags=['supports-workers', 'no-cache'])");
@@ -260,7 +277,7 @@
   }
 
   @Test
-  public void testFilteredExecutionInfoWhenIncompatibleFlagDisabled() throws Exception {
+  public void testFilteredExecutionInfo_whenIncompatibleFlagDisabled() throws Exception {
     // when --incompatible_allow_tags_propagation=false
     scratch.file(
         "tests/BUILD",
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/BUILD b/src/test/java/com/google/devtools/build/lib/skylark/BUILD
index 30ec4a2..531ed07 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/skylark/BUILD
@@ -58,15 +58,12 @@
         "//src/main/java/com/google/devtools/build/lib/rules/python",
         "//src/main/java/com/google/devtools/build/lib/skyframe:aspect_value_key",
         "//src/main/java/com/google/devtools/build/lib/skyframe:configured_target_and_data",
-        "//src/main/java/com/google/devtools/build/lib/skyframe:sky_functions",
         "//src/main/java/com/google/devtools/build/lib/skyframe:skyframe_cluster",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/util:classpath",
         "//src/main/java/com/google/devtools/build/lib/util:filetype",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
-        "//src/main/java/com/google/devtools/build/skyframe",
-        "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//src/main/java/com/google/devtools/common/options",
         "//src/main/java/net/starlark/java/annot",
         "//src/test/java/com/google/devtools/build/lib/actions/util",
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/StarlarkRuleImplementationFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/StarlarkRuleImplementationFunctionsTest.java
index 2da9692..656d03d 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/StarlarkRuleImplementationFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/StarlarkRuleImplementationFunctionsTest.java
@@ -384,6 +384,30 @@
   }
 
   @Test
+  public void testCreateSpawnActionEnvAndExecInfo_withWorkerKeyMnemonic() throws Exception {
+    StarlarkRuleContext ruleContext = createRuleContext("//foo:foo");
+    setRuleContext(ruleContext);
+    ev.exec(
+        "ruleContext.actions.run_shell(",
+        "  inputs = ruleContext.files.srcs,",
+        "  outputs = ruleContext.files.srcs,",
+        "  env = {'a' : 'b'},",
+        "  execution_requirements = {",
+        "    'supports-workers': '1',",
+        "    'worker-key-mnemonic': 'MyMnemonic',",
+        "  },",
+        "  mnemonic = 'DummyMnemonic',",
+        "  command = 'dummy_command',",
+        "  progress_message = 'dummy_message')");
+    SpawnAction action =
+        (SpawnAction)
+            Iterables.getOnlyElement(
+                ruleContext.getRuleContext().getAnalysisEnvironment().getRegisteredActions());
+    assertThat(action.getExecutionInfo())
+        .containsExactly("supports-workers", "1", "worker-key-mnemonic", "MyMnemonic");
+  }
+
+  @Test
   public void testCreateSpawnActionUnknownParam() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
     ev.checkEvalErrorContains(
diff --git a/src/test/shell/integration/bazel_worker_test.sh b/src/test/shell/integration/bazel_worker_test.sh
index 0714bf1..2d51904 100755
--- a/src/test/shell/integration/bazel_worker_test.sh
+++ b/src/test/shell/integration/bazel_worker_test.sh
@@ -126,13 +126,17 @@
     argfile_inputs.append(argfile)
     argfile_arguments.append("@" + argfile.path)
 
+  execution_requirements = {"supports-workers": "1"}
+  if ctx.attr.worker_key_mnemonic:
+    execution_requirements["worker-key-mnemonic"] = ctx.attr.worker_key_mnemonic
+
   ctx.actions.run(
       inputs=argfile_inputs + ctx.files.srcs,
       outputs=[output],
       executable=worker,
       progress_message="Working on %s" % ctx.label.name,
-      mnemonic="Work",
-      execution_requirements={"supports-workers": "1"},
+      mnemonic=ctx.attr.action_mnemonic,
+      execution_requirements=execution_requirements,
       arguments=ctx.attr.worker_args + argfile_arguments,
   )
 
@@ -141,6 +145,8 @@
     attrs={
         "worker": attr.label(cfg="host", mandatory=True, allow_files=True, executable=True),
         "worker_args": attr.string_list(),
+        "worker_key_mnemonic": attr.string(),
+        "action_mnemonic": attr.string(default = "Work"),
         "args": attr.string_list(),
         "srcs": attr.label_list(allow_files=True),
         "multiflagfiles": attr.bool(default=False),
@@ -195,6 +201,33 @@
   assert_equals "HELLO WORLD" "$(cat $BINS/hello_world_uppercase.out)"
 }
 
+function test_shared_worker() {
+  prepare_example_worker
+  cat >>BUILD <<EOF
+work(
+  name = "hello_world",
+  worker = ":worker",
+  action_mnemonic = "Hello",
+  worker_key_mnemonic = "SharedWorker",
+  args = ["--write_uuid"],
+)
+
+work(
+  name = "goodbye_world",
+  worker = ":worker",
+  action_mnemonic = "Goodbye",
+  worker_key_mnemonic = "SharedWorker",
+  args = ["--write_uuid"],
+)
+EOF
+
+  bazel build :hello_world :goodbye_world &> $TEST_log \
+    || fail "build failed"
+  worker_uuid_1=$(cat $BINS/hello_world.out | grep UUID | cut -d' ' -f2)
+  worker_uuid_2=$(cat $BINS/goodbye_world.out | grep UUID | cut -d' ' -f2)
+  assert_equals "$worker_uuid_1" "$worker_uuid_2"
+}
+
 function test_multiple_flagfiles() {
   prepare_example_worker
   cat >>BUILD <<EOF
@@ -456,7 +489,7 @@
 )
 EOF
 
-  sed -i.bak '/execution_requirements/d' work.bzl
+  sed -i.bak '/execution_requirements=execution_requirements/d' work.bzl
   rm -f work.bzl.bak
 
   bazel build --worker_quit_after_build :hello_world &> $TEST_log \