blob: 72d9ef6e463a61fc0ee3eb74c277e7c5d7b2454c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.cache;
import java.util.Collections;
import java.util.Set;
import org.apache.geode.distributed.Role;
import org.apache.geode.internal.Assert;
import org.apache.geode.internal.cache.DistributedRegion;
import org.apache.geode.internal.cache.InternalRegion;
/**
* Provides information on presence or absence of a <code>Region</code>'s required roles.
* Configuration of required roles is accomplished using the <code>Region</code>'s
* {@link MembershipAttributes}.
*
* A {@link org.apache.geode.distributed.Role Role} may be present in the distributed system even if
* it the <code>Role</code> is not present in the <code>Region</code> membership. This would occur
* if none of the members filling that <code>Role</code> currently have a <code>Cache</code> or the
* specific <code>Region</code> created. In this case the <code>Role</code> is considered to be
* absent for that <code>Region</code>.
*
* @deprecated this feature is scheduled to be removed
* @see org.apache.geode.distributed.Role
*/
public class RequiredRoles {
/**
* Returns a set of any currently missing required roles for the specified region. If the region
* is not configured to require roles an empty set will always be returned.
*
* @param region the region to check for missing required roles
* @return set of required roles that are currently missing
* @throws IllegalStateException if region is not configured with required roles
*/
public static Set<Role> checkForRequiredRoles(Region<?, ?> region) {
try {
return waitForRequiredRoles(region, 0);
} catch (InterruptedException ie) {
// This could happen if we were in an interrupted state
// upon method entry
Thread.currentThread().interrupt();
((InternalRegion) region).getCancelCriterion().checkCancelInProgress(ie);
Assert.assertTrue(false, "checkForRequiredRoles cannot throw InterruptedException");
return Collections.emptySet(); // keep compiler happy
}
}
/**
* Returns a set of any currently missing required roles for the specified region. This will wait
* the specified timeout in milliseconds for any missing required roles to be filled. If there are
* no missing required roles or if the region is not configured to require any roles then an empty
* set will immediately be returned.
*
* @param region the region to check for missing required roles
* @param timeout milliseconds to wait for any missing required roles
* @return set of required roles that are currently missing
* @throws NullPointerException if region is null
* @throws InterruptedException if thread is interrupted while waiting
* @throws IllegalStateException if region is not configured with required roles
*/
public static Set<Role> waitForRequiredRoles(Region<?, ?> region, long timeout)
throws InterruptedException {
if (region == null) {
throw new NullPointerException(
"Region must be specified");
}
if (!(region instanceof DistributedRegion)) {
throw new IllegalStateException(
"Region has not been configured with required roles.");
}
DistributedRegion dr = (DistributedRegion) region;
return dr.waitForRequiredRoles(timeout);
}
/**
* Returns true if the {@link org.apache.geode.distributed.Role Role} is currently present in the
* {@link Region} membership. This returns true only if one or more members filling this role
* actually have the region currently created. The role may be present in the distributed system
* even if the role is not present in the region membership.
*
* @param region the region whose membership will be searched
* @param role the role to check for
*/
public static boolean isRoleInRegionMembership(Region<?, ?> region, Role role) {
if (region instanceof DistributedRegion) {
DistributedRegion dr = (DistributedRegion) region;
return dr.isRoleInRegionMembership(role);
} else {
return role.isPresent();
}
}
}