Semaphore Exhaustion is caused due to the getAllUserCriteria function getting called in widgetsDescriptionSemaphore Exhaustion is caused due to the getAllUserCriteria function getting called in widgetsSteps to Reproduce When there is a public page accessed by the guest user/web crawler, which does a call to the getAllUserCriteria API, it can cause semaphore exhaustion due to the threads waiting for one another.WorkaroundThe API getAllUserCriteria is not a documented API and is deprecated internally as well. Instead of using the getAllUserCriteria, break the problem to use multiple versions of the API getMatchingCriteria/userMatches. Ex: If the task is to identify if the user xyz matches the criteria UC1 & UC2. Avoid using getAllUserCriteria. As this returns all the criterias in the system that the user matches. var userId = "xyz"; var criteriaId1 = "UC1"; var criteriaId2 = "UC2"; var userMatchingList = sn_uc.UserCriteriaLoader.getAllUserCriteria(userId); var matchFound = userMatchingList.contains(criteriaId1) || userMatchingList.contains(criteriaId2); Instead, use getMatchingCriteria. var userId = "xyz"; var criteriaId1 = "UC1"; var criteriaId2 = "UC2"; var userMatchingList = sn_uc.UserCriteriaLoader.getMatchingCriteria(userId, [criteriaId1, criteriaId2]); var matchFound = userMatchingList.contains(criteriaId1) || userMatchingList.contains(criteriaId2); If the intention is to know if the user matches one of UC1 & UC2. var userId = "xyz"; var criteriaId1 = "UC1"; var criteriaId2 = "UC2"; var matchFound = sn_uc.UserCriteriaLoader.userMatches(userId, [criteriaId1, criteriaId2]);Related Problem: PRB1819841