Examining the AssignmentManager#processDeadServersAndRegionsInTransition() code, for cluster start, I expected to hit the following code path:
where assignAllUserRegions would use retainAssignment() call in LoadBalancer; however, from master log, we usually hit the failover code path:
where processDeadServersAndRecoverLostRegions() would put dead servers in SSH and SSH uses roundRobinAssignment() in LoadBalancer. That is why we would see loss locality more often than retaining locality during cluster restart.
Note: the code I was looking at is close to branch-1 and branch-1.1.