@@ -2,17 +2,18 @@ package org.utbot.instrumentation.process
22
33import com.jetbrains.rd.framework.*
44import com.jetbrains.rd.framework.impl.RdCall
5- import com.jetbrains.rd.framework.util.launchChild
65import com.jetbrains.rd.util.ILoggerFactory
76import com.jetbrains.rd.util.LogLevel
87import com.jetbrains.rd.util.Logger
98import com.jetbrains.rd.util.defaultLogFormat
109import com.jetbrains.rd.util.lifetime.Lifetime
1110import com.jetbrains.rd.util.lifetime.LifetimeDefinition
1211import com.jetbrains.rd.util.lifetime.plusAssign
13- import com.jetbrains.rd.util.threading.SingleThreadScheduler
14- import kotlinx.coroutines.*
12+ import kotlinx.coroutines.CompletableDeferred
1513import kotlinx.coroutines.channels.Channel
14+ import kotlinx.coroutines.launch
15+ import kotlinx.coroutines.runBlocking
16+ import kotlinx.coroutines.withTimeoutOrNull
1617import org.utbot.common.*
1718import org.utbot.framework.plugin.api.util.UtContext
1819import org.utbot.instrumentation.agent.Agent
@@ -26,7 +27,7 @@ import org.utbot.instrumentation.rd.obtainClientIO
2627import org.utbot.instrumentation.rd.processSyncDirectory
2728import org.utbot.instrumentation.rd.signalChildReady
2829import org.utbot.instrumentation.util.KryoHelper
29- import org.utbot.rd.UtSingleThreadScheduler
30+ import org.utbot.rd.UtRdCoroutineScope
3031import org.utbot.rd.adviseForConditionAsync
3132import java.io.File
3233import java.io.OutputStream
@@ -35,7 +36,6 @@ import java.net.URLClassLoader
3536import java.security.AllPermission
3637import java.time.LocalDateTime
3738import java.time.format.DateTimeFormatter
38- import java.util.concurrent.ArrayBlockingQueue
3939import java.util.concurrent.TimeUnit
4040import kotlin.system.measureTimeMillis
4141
@@ -63,7 +63,6 @@ private object HandlerClassesLoader : URLClassLoader(emptyArray()) {
6363}
6464
6565private typealias ChildProcessLogLevel = LogLevel
66-
6766private val logLevel = ChildProcessLogLevel .Info
6867
6968// Logging
@@ -75,14 +74,28 @@ private fun log(level: ChildProcessLogLevel, any: () -> Any?) {
7574 System .err.println (LocalDateTime .now().format(dateFormatter) + " | ${any()} " )
7675}
7776
77+ // errors that must be address
7878private fun logError (any : () -> Any? ) {
7979 log(ChildProcessLogLevel .Error , any)
8080}
8181
82+ private fun logException (e : Throwable ) {
83+ log(ChildProcessLogLevel .Error ) { " $e |> ${e.stackTraceToString()} " }
84+ }
85+
86+ // default log level for irregular useful messages that does not pollute log
8287private fun logInfo (any : () -> Any? ) {
8388 log(ChildProcessLogLevel .Info , any)
8489}
8590
91+ // log level for frequent messages useful for debugging
92+ private fun logDebug (any : () -> Any? ) {
93+ log(ChildProcessLogLevel .Debug , any)
94+ }
95+
96+ // log level for internal rd logs and frequent messages
97+ // heavily pollutes log, useful only when debugging rpc
98+ // probably contains no info about utbot
8699private fun logTrace (any : () -> Any? ) {
87100 log(ChildProcessLogLevel .Trace , any)
88101}
@@ -119,9 +132,7 @@ suspend fun main(args: Array<String>) = runBlocking {
119132 val pid = currentProcessPid.toInt()
120133 val def = LifetimeDefinition ()
121134
122- SingleThreadScheduler (Lifetime .Eternal , " " )
123-
124- launchChild(Lifetime .Eternal ) {
135+ launch {
125136 var lastState = State .STARTED
126137 while (true ) {
127138 val current: State ? =
@@ -177,20 +188,27 @@ private fun <T, R> RdCall<T, R>.measureExecutionForTermination(block: (T) -> R)
177188 this .set { it ->
178189 runBlocking {
179190 measureExecutionForTermination<R > {
180- block(it)
191+ try {
192+ block(it)
193+ } catch (e: Throwable ) {
194+ logException(e)
195+ throw e
196+ }
181197 }
182198 }
183199 }
184200}
185201
186202private suspend fun ProtocolModel.setup (kryoHelper : KryoHelper , onStop : () -> Unit ) {
187203 warmup.measureExecutionForTermination {
204+ logDebug { " received warmup request" }
188205 val time = measureTimeMillis {
189206 HandlerClassesLoader .scanForClasses(" " ).toList() // here we transform classes
190207 }
191- logInfo { " warmup finished in $time ms" }
208+ logDebug { " warmup finished in $time ms" }
192209 }
193210 invokeMethodCommand.measureExecutionForTermination { params ->
211+ logDebug { " received invokeMethod request: ${params.classname} , ${params.signature} " }
194212 val clazz = HandlerClassesLoader .loadClass(params.classname)
195213 val res = instrumentation.invoke(
196214 clazz,
@@ -199,31 +217,36 @@ private suspend fun ProtocolModel.setup(kryoHelper: KryoHelper, onStop: () -> Un
199217 kryoHelper.readObject(params.parameters)
200218 )
201219
202- logInfo { " sent cmd : $res " }
220+ logDebug { " invokeMethod result : $res " }
203221 InvokeMethodCommandResult (kryoHelper.writeObject(res))
204222 }
205223 setInstrumentation.measureExecutionForTermination { params ->
224+ logDebug { " setInstrumentation request" }
206225 instrumentation = kryoHelper.readObject(params.instrumentation)
226+ logTrace { " instrumentation - ${instrumentation.javaClass.name} " }
207227 Agent .dynamicClassTransformer.transformer = instrumentation // classTransformer is set
208228 Agent .dynamicClassTransformer.addUserPaths(pathsToUserClasses)
209229 instrumentation.init (pathsToUserClasses)
210230 }
211231 addPaths.measureExecutionForTermination { params ->
232+ logDebug { " addPaths request" }
233+ logTrace { " path to userClasses - ${params.pathsToUserClasses} " }
234+ logTrace { " path to dependencyClasses - ${params.pathsToDependencyClasses} " }
212235 pathsToUserClasses = params.pathsToUserClasses.split(File .pathSeparatorChar).toSet()
213236 pathsToDependencyClasses = params.pathsToDependencyClasses.split(File .pathSeparatorChar).toSet()
214237 HandlerClassesLoader .addUrls(pathsToUserClasses)
215238 HandlerClassesLoader .addUrls(pathsToDependencyClasses)
216239 kryoHelper.setKryoClassLoader(HandlerClassesLoader ) // Now kryo will use our classloader when it encounters unregistered class.
217-
218- logTrace { " User classes:" + pathsToUserClasses.joinToString() }
219-
220240 UtContext .setUtContext(UtContext (HandlerClassesLoader ))
221241 }
222242 stopProcess.measureExecutionForTermination {
243+ logDebug { " stop request" }
223244 onStop()
224245 }
225246 collectCoverage.measureExecutionForTermination { params ->
247+ logDebug { " collect coverage request" }
226248 val anyClass: Class <* > = kryoHelper.readObject(params.clazz)
249+ logTrace { " class - ${anyClass.name} " }
227250 val result = (instrumentation as CoverageInstrumentation ).collectCoverageInfo(anyClass)
228251 CollectCoverageResult (kryoHelper.writeObject(result))
229252 }
@@ -256,13 +279,12 @@ private suspend fun initiate(lifetime: Lifetime, port: Int, pid: Int) {
256279 val kryoHelper = KryoHelper (lifetime)
257280 logInfo { " kryo created" }
258281
259- val scheduler = UtSingleThreadScheduler { logInfo(it) }
260282 val clientProtocol = Protocol (
261283 " ChildProcess" ,
262284 Serializers (),
263285 Identities (IdKind .Client ),
264- scheduler,
265- SocketWire .Client (lifetime, scheduler, port),
286+ UtRdCoroutineScope . scheduler,
287+ SocketWire .Client (lifetime, UtRdCoroutineScope . scheduler, port),
266288 lifetime
267289 )
268290 val (sync, protocolModel) = obtainClientIO(lifetime, clientProtocol)
@@ -290,6 +312,7 @@ private suspend fun initiate(lifetime: Lifetime, port: Int, pid: Int) {
290312 logInfo { " starting instrumenting" }
291313 deferred.await()
292314 } catch (e: Throwable ) {
293- logError { " Terminating process because exception occurred: ${e.stackTraceToString()} " }
315+ logError { " Terminating process because exception occurred" }
316+ logException(e)
294317 }
295318}
0 commit comments