@@ -257,16 +257,13 @@ def execute(self, known_peers, phase: Phase, ave_load: float, max_load: float):
257257 rank_targets = self ._get_ranks_to_traverse (phase .get_ranks (), known_peers )
258258
259259 # Iterate over ranks
260+ n_ranks = len (phase .get_ranks ())
260261 for r_src , targets in rank_targets .items ():
261262 # Cluster migratable objects on source rank
262263 clusters_src = self .__build_rank_clusters (r_src , True )
263264 self ._logger .debug (
264265 f"Constructed { len (clusters_src )} migratable clusters on source rank { r_src .get_id ()} " )
265266
266- # Skip subclustering for this rank when it must be done later
267- if self .__separate_subclustering :
268- continue
269-
270267 # Perform feasible cluster swaps from given rank to possible targets
271268 if (n_rank_swaps := self .__swap_clusters (phase , r_src , clusters_src , targets )):
272269 # Report on swaps when some occurred
@@ -280,30 +277,36 @@ def execute(self, known_peers, phase: Phase, ave_load: float, max_load: float):
280277 continue
281278
282279 # Perform feasible subcluster swaps from given rank to possible targets
283- if self .__max_subclusters > 0 :
284- self .__transfer_subclusters (phase , r_src , targets , ave_load , max_load )
280+ if not self .__separate_subclustering :
281+ if self .__max_subclusters > 0 :
282+ self .__transfer_subclusters (phase , r_src , targets , ave_load , max_load )
283+ else :
284+ self .__n_sub_skipped += 1
285285
286286 # Report on new load and exit from rank
287287 self ._logger .debug (
288288 f"Rank { r_src .get_id ()} load: { r_src .get_load ()} after { self ._n_transfers } object transfers" )
289289
290290 # Perform subclustering when it was not previously done
291- if self .__max_subclusters > 0 and self .__separate_subclustering :
292- # In non-deterministic case skip subclustering when swaps passed
293- if self .__n_swaps and not self ._deterministic_transfer :
294- self .__n_sub_skipped = len (rank_targets )
291+ if self .__separate_subclustering :
292+ if self .__max_subclusters > 0 :
293+ # In non-deterministic case skip subclustering when swaps passed
294+ if self .__n_swaps and not self ._deterministic_transfer :
295+ self .__n_sub_skipped = n_ranks
296+ else :
297+ # Iterate over ranks
298+ for r_src , targets in rank_targets .items ():
299+ # Perform feasible subcluster swaps from given rank to possible targets
300+ self .__transfer_subclusters (phase , r_src , targets , ave_load , max_load )
301+
302+ # Report on new load and exit from rank
303+ self ._logger .debug (
304+ f"Rank { r_src .get_id ()} load: { r_src .get_load ()} after { self ._n_transfers } object transfers" )
295305 else :
296- # Iterate over ranks
297- for r_src , targets in rank_targets .items ():
298- # Perform feasible subcluster swaps from given rank to possible targets
299- self .__transfer_subclusters (phase , r_src , targets , ave_load , max_load )
300-
301- # Report on new load and exit from rank
302- self ._logger .debug (
303- f"Rank { r_src .get_id ()} load: { r_src .get_load ()} after { self ._n_transfers } object transfers" )
306+ # Subclustering is skipped altogether for all ranks
307+ self .__n_sub_skipped = n_ranks
304308
305309 # Report on global transfer statistics
306- n_ranks = len (phase .get_ranks ())
307310 self ._logger .info (
308311 f"Swapped { self .__n_swaps } cluster pairs amongst { self .__n_swap_tries } tries "
309312 f"({ 100 * self .__n_swaps / self .__n_swap_tries :.2f} %)" )
0 commit comments