public void Run() { s_logger.LogInfo($"[{TaskId}] Starting with ReuseSocket[{_reuseSocket}]."); if (EnvironmentUtils.GetEnvironmentVariableAsBool("DOTNET_WORKER_DEBUG")) { Debugger.Launch(); } _isRunning = true; Stream inputStream = _socket.InputStream; Stream outputStream = _socket.OutputStream; try { while (_isRunning) { Payload payload = ProcessStream( inputStream, outputStream, _version, out bool readComplete); if (payload != null) { outputStream.Flush(); ++_numTasksRun; // If the socket is not read through completely, then it cannot be reused. if (!readComplete) { _isRunning = false; // Wait for server to complete to avoid 'connection reset' exception. s_logger.LogInfo($"[{TaskId}] Sleep 500 millisecond to close socket."); Thread.Sleep(500); } else if (!_reuseSocket) { _isRunning = false; // Use SerDe.ReadBytes() to detect Java side has closed socket // properly. SerDe.ReadBytes() will block until the socket is closed. s_logger.LogInfo($"[{TaskId}] Waiting for JVM side to close socket."); SerDe.ReadBytes(inputStream); s_logger.LogInfo($"[{TaskId}] JVM side has closed socket."); } } else { _isRunning = false; s_logger.LogWarn( $"[{TaskId}] Read null payload. Socket is closed by JVM."); } } } catch (Exception e) { _isRunning = false; s_logger.LogError($"[{TaskId}] Exiting with exception: {e}"); } finally { try { _socket.Dispose(); } catch (Exception ex) { s_logger.LogWarn($"[{TaskId}] Exception while closing socket: {ex}"); } s_logger.LogInfo($"[{TaskId}] Finished running {_numTasksRun} task(s)."); } }
private void LogStat(Payload payloa, CommandExecutorStat stat, bool readComplete) { s_logger.LogInfo($"[{TaskId}] Processed a task: readComplete:{readComplete}, entries:{stat.NumEntriesProcessed}"); }