uranusjr commented on code in PR #75538:
URL: https://github.com/apache/airflow/pull/75538#discussion_r4463965215


##########
java-sdk/sdk/src/main/kotlin/org/apache/airflow/sdk/execution/Logger.kt:
##########
@@ -220,10 +222,23 @@ internal class Logger(
   }
 }
 
+// Several threads log: the task's own thread, the thread that handles a stop 
signal, and the thread
+// that reads replies from the supervisor. The lock keeps send from queuing a 
message after configure
+// has written out the queue. It also keeps a new message from being written 
before the messages that
+// were queued earlier.
 internal object LogSender {
   private var writer: ByteWriteChannel? = null
   internal val messages: ConcurrentLinkedDeque<LogMessage> = 
ConcurrentLinkedDeque()
 
+  // While runBlocking waits, it also runs other coroutines that are ready on 
the calling thread. On the
+  // thread that Server.serve blocks, one of them runs the task. So on that 
thread, a runBlocking call
+  // here could run the task while the caller holds this object's lock. The 
task would then hang if it
+  // waited for another thread that logs, such as the thread that reads 
replies from the supervisor.
+  // Writing on writerThread avoids this, because the waiting caller runs no 
coroutines.
+  private val writerThread =
+    Executors.newSingleThreadExecutor { Thread(it, "Airflow log sender").apply 
{ isDaemon = true } }

Review Comment:
   Can the logger be asynchronous instead? I don’t see why this needs to block.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to