2121import org .elasticsearch .cluster .SequentialTaskAckingTaskExecutor ;
2222import org .elasticsearch .cluster .block .ClusterBlockException ;
2323import org .elasticsearch .cluster .block .ClusterBlockLevel ;
24+ import org .elasticsearch .cluster .metadata .ProjectId ;
25+ import org .elasticsearch .cluster .project .ProjectResolver ;
2426import org .elasticsearch .cluster .service .ClusterService ;
2527import org .elasticsearch .cluster .service .MasterServiceTaskQueue ;
2628import org .elasticsearch .common .Priority ;
3032import org .elasticsearch .threadpool .ThreadPool ;
3133import org .elasticsearch .transport .TransportService ;
3234
33- // TODO: Are master actions synced or do I need double-check locking?
35+ import java .util .Locale ;
36+
3437public class TransportLogsStreamsToggleActivation extends AcknowledgedTransportMasterNodeAction <LogsStreamsActivationToggleAction .Request > {
3538
3639 private static final Logger logger = LogManager .getLogger (TransportLogsStreamsToggleActivation .class );
3740
41+ private final ProjectResolver projectResolver ;
3842 private final MasterServiceTaskQueue <StreamsMetadataUpdateTask > taskQueue ;
3943
4044 @ Inject
@@ -43,7 +47,8 @@ public TransportLogsStreamsToggleActivation(
4347 TransportService transportService ,
4448 ClusterService clusterService ,
4549 ThreadPool threadPool ,
46- ActionFilters actionFilters
50+ ActionFilters actionFilters ,
51+ ProjectResolver projectResolver
4752 ) {
4853 super (
4954 actionName ,
@@ -59,6 +64,7 @@ public TransportLogsStreamsToggleActivation(
5964 Priority .NORMAL ,
6065 new SequentialTaskAckingTaskExecutor <>()
6166 );
67+ this .projectResolver = projectResolver ;
6268 }
6369
6470 @ Override
@@ -68,20 +74,18 @@ protected void masterOperation(
6874 ClusterState state ,
6975 ActionListener <AcknowledgedResponse > listener
7076 ) throws Exception {
71- // TODO: Short circuit if state == requested state. Listener & return
72- StreamsMetadata streamsState = state .metadata ().custom (StreamsMetadata .TYPE );
77+ ProjectId projectId = projectResolver . getProjectId ();
78+ StreamsMetadata streamsState = state .projectState ( projectId ). metadata ().custom (StreamsMetadata .TYPE , StreamsMetadata . EMPTY );
7379 boolean currentlyEnabled = streamsState .isLogsEnabled ();
7480 boolean shouldEnable = request .shouldEnable ();
75- // TODO: Remove hook methods. Service will be listening to cluster state for changes
7681 if (shouldEnable != currentlyEnabled ) {
77- if (shouldEnable ) {
78- setupActions ();
79- } else {
80- cleanupActions ();
81- }
82- StreamsMetadataUpdateTask updateTask = new StreamsMetadataUpdateTask (request , listener , shouldEnable );
82+ StreamsMetadataUpdateTask updateTask = new StreamsMetadataUpdateTask (request , listener , projectId , shouldEnable );
8383 // TODO: Append state to task name (See TransportStartSLMAction)
84- taskQueue .submitTask ("enable-streams-logs-" , updateTask , updateTask .timeout ());
84+ String taskName = String .format (Locale .ROOT , "enable-streams-logs-[%s]" , shouldEnable ? "enable" : "disable" );
85+ taskQueue .submitTask (taskName , updateTask , updateTask .timeout ());
86+ } else {
87+ logger .debug ("Logs streams are already in the requested state: {}" , shouldEnable );
88+ listener .onResponse (AcknowledgedResponse .TRUE );
8589 }
8690 }
8791
@@ -99,23 +103,26 @@ protected ClusterBlockException checkBlock(LogsStreamsActivationToggleAction.Req
99103 }
100104
101105 static class StreamsMetadataUpdateTask extends AckedClusterStateUpdateTask {
106+ private ProjectId projectId ;
102107 private final boolean enabled ;
103108
104109 StreamsMetadataUpdateTask (
105110 AcknowledgedRequest <?> request ,
106111 ActionListener <? extends AcknowledgedResponse > listener ,
112+ ProjectId projectId ,
107113 boolean enabled
108114 ) {
109115 super (request , listener );
116+ this .projectId = projectId ;
110117 this .enabled = enabled ;
111118 }
112119
113120 @ Override
114121 public ClusterState execute (ClusterState currentState ) throws Exception {
115- // TODO: Builder?
116- StreamsMetadata metadata = currentState . metadata (). custom ( StreamsMetadata . TYPE );
117- metadata . setLogsEnabled ( enabled );
118- return currentState ;
122+ return currentState . copyAndUpdateProject (
123+ projectId ,
124+ builder -> builder . putCustom ( StreamsMetadata . TYPE , new StreamsMetadata ( enabled ))
125+ ) ;
119126 }
120127 }
121128}
0 commit comments