@@ -468,8 +468,9 @@ async def cull_kernels(self):
468468
469469 async def cull_kernel_if_idle (self , kernel_id ):
470470 kernel = self ._kernels [kernel_id ]
471- self .log .debug ("kernel_id=%s, kernel_name=%s, last_activity=%s" , kernel_id , kernel .kernel_name , kernel .last_activity )
472- if kernel .last_activity is not None :
471+ if hasattr (kernel , 'last_activity' ): # last_activity is monkey-patched, so ensure that has occurred
472+ self .log .debug ("kernel_id=%s, kernel_name=%s, last_activity=%s" ,
473+ kernel_id , kernel .kernel_name , kernel .last_activity )
473474 dt_now = utcnow ()
474475 dt_idle = dt_now - kernel .last_activity
475476 # Compute idle properties
@@ -482,7 +483,7 @@ async def cull_kernel_if_idle(self, kernel_id):
482483 idle_duration = int (dt_idle .total_seconds ())
483484 self .log .warning ("Culling '%s' kernel '%s' (%s) with %d connections due to %s seconds of inactivity." ,
484485 kernel .execution_state , kernel .kernel_name , kernel_id , connections , idle_duration )
485- await self .shutdown_kernel (kernel_id )
486+ await ensure_async ( self .shutdown_kernel (kernel_id ) )
486487
487488
488489# AsyncMappingKernelManager inherits as much as possible from MappingKernelManager,
@@ -506,12 +507,14 @@ async def shutdown_kernel(self, kernel_id, now=False, restart=False):
506507 kernel ._activity_stream .close ()
507508 kernel ._activity_stream = None
508509 self .stop_buffering (kernel_id )
509- self ._kernel_connections .pop (kernel_id , None )
510510
511511 # Decrease the metric of number of kernels
512512 # running for the relevant kernel type by 1
513513 KERNEL_CURRENTLY_RUNNING_TOTAL .labels (
514514 type = self ._kernels [kernel_id ].kernel_name
515515 ).dec ()
516516
517- return await self .pinned_superclass .shutdown_kernel (self , kernel_id , now = now , restart = restart )
517+ # Finish shutting down the kernel before clearing state to avoid a race condition.
518+ ret = await self .pinned_superclass .shutdown_kernel (self , kernel_id , now = now , restart = restart )
519+ self ._kernel_connections .pop (kernel_id , None )
520+ return ret
0 commit comments