@@ -65,8 +65,11 @@ public class WorkerHolder
6565 public static final TypeReference <ChangeRequestsSnapshot <WorkerHistoryItem >> WORKER_SYNC_RESP_TYPE_REF = new TypeReference <>() {};
6666
6767
68- private final Worker worker ;
69- private Worker disabledWorker ;
68+ /**
69+ * Pre-built views with isDisabled() set to false/true respectively. {@link #getWorker()} selects between them based on {@link #disabled}.
70+ */
71+ private final Worker enabledWorker ;
72+ private final Worker disabledWorker ;
7073
7174 protected final AtomicBoolean disabled ;
7275 private final AtomicBoolean syncedAtleastOnce = new AtomicBoolean (false );
@@ -100,15 +103,16 @@ public WorkerHolder(
100103 this .httpClient = httpClient ;
101104 this .config = config ;
102105 this .listener = listener ;
103- this .worker = worker ;
104- //worker holder is created disabled and gets enabled after first sync success.
106+ this .enabledWorker = workerWithDisabledState (worker , false );
107+ this .disabledWorker = workerWithDisabledState (worker , true );
108+ // WorkerHolder starts disabled and gets enabled after first successful sync.
105109 this .disabled = new AtomicBoolean (true );
106110
107111 this .syncer = new ChangeRequestHttpSyncer <>(
108112 smileMapper ,
109113 httpClient ,
110114 workersSyncExec ,
111- TaskRunnerUtils .makeWorkerURL (worker , "/" ),
115+ TaskRunnerUtils .makeWorkerURL (enabledWorker , "/" ),
112116 "/druid-internal/v1/worker" ,
113117 WORKER_SYNC_RESP_TYPE_REF ,
114118 config .getSyncRequestTimeout ().toStandardDuration ().getMillis (),
@@ -125,7 +129,7 @@ public WorkerHolder(
125129
126130 public Worker getWorker ()
127131 {
128- return worker ;
132+ return disabled . get () ? disabledWorker : enabledWorker ;
129133 }
130134
131135 public DateTime getBlacklistedUntil ()
@@ -145,23 +149,8 @@ public void setBlacklistedUntil(DateTime blacklistedUntil)
145149
146150 public ImmutableWorkerInfo toImmutable ()
147151 {
148- Worker w = worker ;
149- if (disabled .get ()) {
150- if (disabledWorker == null ) {
151- disabledWorker = new Worker (
152- worker .getScheme (),
153- worker .getHost (),
154- worker .getIp (),
155- worker .getCapacity (),
156- "" ,
157- worker .getCategory ()
158- );
159- }
160- w = disabledWorker ;
161- }
162-
163152 return ImmutableWorkerInfo .fromWorkerAnnouncements (
164- w ,
153+ getWorker () ,
165154 tasksSnapshotRef .get (),
166155 lastCompletedTaskTime .get (),
167156 blacklistedUntil .get ()
@@ -189,12 +178,12 @@ public boolean assignTask(Task task)
189178 log .info (
190179 "Received task[%s] assignment on worker[%s] when worker is disabled." ,
191180 task .getId (),
192- worker .getHost ()
181+ enabledWorker .getHost ()
193182 );
194183 return false ;
195184 }
196185
197- URL url = TaskRunnerUtils .makeWorkerURL (worker , "/druid-internal/v1/worker/assignTask" );
186+ URL url = TaskRunnerUtils .makeWorkerURL (enabledWorker , "/druid-internal/v1/worker/assignTask" );
198187 int numTries = config .getAssignRequestMaxRetries ();
199188
200189 try {
@@ -215,7 +204,7 @@ public boolean assignTask(Task task)
215204 throw new RE (
216205 "Failed to assign task[%s] to worker[%s]. Response Code[%s] and Message[%s]. Retrying..." ,
217206 task .getId (),
218- worker .getHost (),
207+ enabledWorker .getHost (),
219208 response .getStatus ().getCode (),
220209 response .getContent ()
221210 );
@@ -226,7 +215,7 @@ public boolean assignTask(Task task)
226215 ex ,
227216 "Request to assign task[%s] to worker[%s] failed. Retrying..." ,
228217 task .getId (),
229- worker .getHost ()
218+ enabledWorker .getHost ()
230219 );
231220 }
232221 },
@@ -235,14 +224,14 @@ public boolean assignTask(Task task)
235224 );
236225 }
237226 catch (Exception ex ) {
238- log .info ("Not sure whether task[%s] was successfully assigned to worker[%s]." , task .getId (), worker .getHost ());
227+ log .info ("Not sure whether task[%s] was successfully assigned to worker[%s]." , task .getId (), enabledWorker .getHost ());
239228 return true ;
240229 }
241230 }
242231
243232 public void shutdownTask (String taskId )
244233 {
245- final URL url = TaskRunnerUtils .makeWorkerURL (worker , "/druid/worker/v1/task/%s/shutdown" , taskId );
234+ final URL url = TaskRunnerUtils .makeWorkerURL (enabledWorker , "/druid/worker/v1/task/%s/shutdown" , taskId );
246235
247236 try {
248237 RetryUtils .retry (
@@ -257,17 +246,17 @@ public void shutdownTask(String taskId)
257246 if (response .getStatus ().getCode () == 200 ) {
258247 log .info (
259248 "Sent shutdown message to worker: %s, status %s, response: %s" ,
260- worker .getHost (),
249+ enabledWorker .getHost (),
261250 response .getStatus (),
262251 response .getContent ()
263252 );
264253 return null ;
265254 } else {
266- throw new RE ("Attempt to shutdown task[%s] on worker[%s] failed." , taskId , worker .getHost ());
255+ throw new RE ("Attempt to shutdown task[%s] on worker[%s] failed." , taskId , enabledWorker .getHost ());
267256 }
268257 }
269258 catch (ExecutionException e ) {
270- throw new RE (e , "Error in handling post to [%s] for task [%s]" , worker .getHost (), taskId );
259+ throw new RE (e , "Error in handling post to [%s] for task [%s]" , enabledWorker .getHost (), taskId );
271260 }
272261 },
273262 e -> !(e instanceof InterruptedException ),
@@ -279,7 +268,7 @@ public void shutdownTask(String taskId)
279268 Thread .currentThread ().interrupt ();
280269 }
281270
282- log .error ("Failed to shutdown task[%s] on worker[%s] failed." , taskId , worker .getHost ());
271+ log .error ("Failed to shutdown task[%s] on worker[%s] failed." , taskId , enabledWorker .getHost ());
283272 }
284273 }
285274
@@ -296,7 +285,7 @@ public void stop()
296285 public void waitForInitialization () throws InterruptedException
297286 {
298287 if (!syncer .awaitInitialization ()) {
299- throw new RE ("Failed to sync with worker[%s]." , worker .getHost ());
288+ throw new RE ("Failed to sync with worker[%s]." , enabledWorker .getHost ());
300289 }
301290 }
302291
@@ -347,7 +336,7 @@ public void fullSync(List<WorkerHistoryItem> changes)
347336 log .makeAlert (
348337 "Got unknown sync update[%s] from worker[%s]. Ignored." ,
349338 change .getClass ().getName (),
350- worker .getHost ()
339+ enabledWorker .getHost ()
351340 ).emit ();
352341 }
353342 }
@@ -359,7 +348,7 @@ public void fullSync(List<WorkerHistoryItem> changes)
359348 "task[%s] in state[%s] suddenly disappeared on worker[%s]. failing it." ,
360349 announcement .getTaskId (),
361350 announcement .getStatus (),
362- worker .getHost ()
351+ enabledWorker .getHost ()
363352 );
364353 delta .add (
365354 TaskAnnouncement .create (
@@ -402,7 +391,7 @@ public void deltaSync(List<WorkerHistoryItem> changes)
402391 "task[%s] in state[%s] suddenly disappeared on worker[%s]. failing it." ,
403392 announcement .getTaskId (),
404393 announcement .getStatus (),
405- worker .getHost ()
394+ enabledWorker .getHost ()
406395 );
407396 delta .add (
408397 TaskAnnouncement .create (
@@ -425,7 +414,7 @@ public void deltaSync(List<WorkerHistoryItem> changes)
425414 log .makeAlert (
426415 "Got unknown sync update[%s] from worker[%s]. Ignored." ,
427416 change .getClass ().getName (),
428- worker .getHost ()
417+ enabledWorker .getHost ()
429418 ).emit ();
430419 }
431420 }
@@ -444,21 +433,29 @@ private void notifyListener(List<TaskAnnouncement> announcements, boolean isWork
444433 ex ,
445434 "Unknown exception while updating task[%s] state from worker[%s]." ,
446435 announcement .getTaskId (),
447- worker .getHost ()
436+ enabledWorker .getHost ()
448437 );
449438 }
450439 }
451440
452441 syncedAtleastOnce .set (true );
453442 if (isWorkerDisabled != disabled .get ()) {
454443 disabled .set (isWorkerDisabled );
455- log .info ("Worker[%s] disabled set to [%s]." , worker .getHost (), isWorkerDisabled );
444+ log .info ("Worker[%s] disabled set to [%s]." , enabledWorker .getHost (), isWorkerDisabled );
456445 listener .stateChanged (!isWorkerDisabled , WorkerHolder .this );
457446 }
458447 }
459448 };
460449 }
461450
451+ private static Worker workerWithDisabledState (Worker w , boolean disabled )
452+ {
453+ if (w .isDisabled () == disabled ) {
454+ return w ;
455+ }
456+ return new Worker (w .getScheme (), w .getHost (), w .getIp (), w .getCapacity (), w .getVersion (), w .getCategory (), disabled );
457+ }
458+
462459 public interface Listener
463460 {
464461 void taskAddedOrUpdated (TaskAnnouncement announcement , WorkerHolder workerHolder );
0 commit comments