The inner loops in reload_all_permissions iterate role's permissions and _anonymous_permissions maps across yield points. Concurrent load_permissions calls (which don't hold _loading_sem) can emplace into those same maps during a yield, potentially triggering a rehash that invalidates the active iterator. We want to avoid adding semaphore acquire in load_permissions because it's on a common path (get_permissions). Fixing by snapshotting the keys into a vector before iterating with yields, so no long-lived map iterator is held across suspension points.
12 KiB
12 KiB