@@ -108,14 +108,21 @@ def _recalculate(self, include_ranks=None):
108108
109109 # drain_info: ranks, timestamp, reason tuples for all drained resources
110110 self .drain_info = []
111+ self ._drain_lookup = {}
111112 for drain_ranks , entry in self .rstatus ["drain" ].items ():
112113 ranks = IDset (drain_ranks )
113114 if include_ranks is not None :
114115 ranks = ranks .intersect (include_ranks )
115- self .drained += ranks - self .allocated
116- self .draining += ranks - self .drained
116+ self .drained += ranks
117117 info = DrainInfo (ranks , entry ["timestamp" ], entry ["reason" ])
118118 self .drain_info .append (info )
119+ for rank in ranks :
120+ self ._drain_lookup [rank ] = info
121+
122+ # create the set of draining ranks as the intersection of
123+ # drained and allocated
124+ self .draining = self .drained & self .allocated
125+ self .drained -= self .draining
119126
120127 # available: all ranks not excluded or drained/draining
121128 self .avail = self .all - self .get_idset ("exclude" , "drained" , "draining" )
@@ -142,7 +149,7 @@ def get_drain_info(self, rank):
142149 """
143150 if rank not in self .all :
144151 raise ValueError ("invalid rank {rank}" )
145- return next (( i for i in self .drain_info if rank in i . ranks ), None )
152+ return self ._drain_lookup . get ( rank )
146153
147154
148155class ResourceStatusRPC :
0 commit comments