use of org.bboxdb.distribution.membership.BBoxDBInstance in project bboxdb by jnidzwetzki.
the class SpacePartitionerHelper method allocateSystemsToRegion.
/**
* Allocate the required amount of systems to the given region
*
* @param region
* @param zookeeperClient
* @throws ZookeeperException
* @throws ResourceAllocationException
* @throws ZookeeperNotFoundException
*/
public static void allocateSystemsToRegion(final String regionPath, final String distributionGroupName, final Collection<BBoxDBInstance> blacklist, final ZookeeperClient zookeeperClient) throws ZookeeperException, ResourceAllocationException, ZookeeperNotFoundException {
final DistributionGroupConfiguration config = DistributionGroupConfigurationCache.getInstance().getDistributionGroupConfiguration(distributionGroupName);
final short replicationFactor = config.getReplicationFactor();
final BBoxDBInstanceManager distributedInstanceManager = BBoxDBInstanceManager.getInstance();
final List<BBoxDBInstance> availableSystems = distributedInstanceManager.getInstances();
final String placementStrategy = config.getPlacementStrategy();
final ResourcePlacementStrategy resourcePlacementStrategy = ResourcePlacementStrategyFactory.getInstance(placementStrategy);
if (resourcePlacementStrategy == null) {
throw new ResourceAllocationException("Unable to instanciate the ressource " + "placement strategy");
}
// The blacklist, to prevent duplicate allocations
final Set<BBoxDBInstance> allocationSystems = new HashSet<>();
final Set<BBoxDBInstance> blacklistedSystems = new HashSet<>();
blacklistedSystems.addAll(blacklist);
for (short i = 0; i < replicationFactor; i++) {
final BBoxDBInstance instance = resourcePlacementStrategy.getInstancesForNewRessource(availableSystems, blacklistedSystems);
allocationSystems.add(instance);
blacklistedSystems.add(instance);
}
logger.info("Allocated new ressource to {} with blacklist {}", allocationSystems, blacklist);
zookeeperClient.getDistributionRegionAdapter().allocateSystemsToRegion(regionPath, allocationSystems);
}
use of org.bboxdb.distribution.membership.BBoxDBInstance in project bboxdb by jnidzwetzki.
the class DynamicgridSpacePartitioner method createGridInDimension.
/**
* Create the cell grid
* @param splitConfig
* @param parentPath
* @param box
* @param dimension
* @throws ZookeeperException
* @throws InputParseException
* @throws ZookeeperNotFoundException
* @throws ResourceAllocationException
*/
private void createGridInDimension(final String[] splitConfig, final String parentPath, final BoundingBox box, final int dimension) throws ZookeeperException, InputParseException, ZookeeperNotFoundException, ResourceAllocationException {
logger.info("Processing dimension {}", dimension);
if (dimension == 0) {
final String childPath = distributionRegionZookeeperAdapter.createNewChild(parentPath, 0, box, distributionGroupName);
SpacePartitionerHelper.allocateSystemsToRegion(childPath, distributionGroupName, new ArrayList<BBoxDBInstance>(), zookeeperClient);
distributionRegionZookeeperAdapter.setStateForDistributionGroup(childPath, DistributionRegionState.ACTIVE);
return;
}
final String stepIntervalString = splitConfig[dimension];
final double stepInterval = MathUtil.tryParseDouble(stepIntervalString, () -> "Unable to parse" + stepIntervalString);
BoundingBox boundingBoxToSplit = box;
int childNumber = 0;
while (boundingBoxToSplit != null) {
final double splitPos = boundingBoxToSplit.getCoordinateLow(dimension) + stepInterval;
BoundingBox nodeBox;
if (splitPos >= boundingBoxToSplit.getCoordinateHigh(dimension)) {
nodeBox = boundingBoxToSplit;
boundingBoxToSplit = null;
} else {
nodeBox = boundingBoxToSplit.splitAndGetRight(splitPos, dimension, false);
boundingBoxToSplit = boundingBoxToSplit.splitAndGetRight(splitPos, dimension, true);
}
final String childPath = distributionRegionZookeeperAdapter.createNewChild(parentPath, childNumber, nodeBox, distributionGroupName);
distributionRegionZookeeperAdapter.setStateForDistributionGroup(childPath, DistributionRegionState.SPLIT);
createGridInDimension(splitConfig, childPath, nodeBox, dimension - 1);
childNumber++;
}
}
use of org.bboxdb.distribution.membership.BBoxDBInstance in project bboxdb by jnidzwetzki.
the class BBoxDBCluster method queryVersionTime.
@Override
public TupleListFuture queryVersionTime(final String table, final long timestamp) throws BBoxDBException {
if (membershipConnectionService.getNumberOfConnections() == 0) {
throw new BBoxDBException("queryTime called, but connection list is empty");
}
if (logger.isDebugEnabled()) {
logger.debug("Query by for timestamp {} in table {}", timestamp, table);
}
final DistributionRegion distributionRegion = getRootNode(table);
final Supplier<List<NetworkOperationFuture>> futureProvider = () -> {
final List<RoutingHop> hops = RoutingHopHelper.getRoutingHopsForRead(distributionRegion, BoundingBox.FULL_SPACE);
final List<NetworkOperationFuture> futures = new ArrayList<>();
for (final RoutingHop hop : hops) {
final BBoxDBInstance instance = hop.getDistributedInstance();
final BBoxDBConnection connection = membershipConnectionService.getConnectionForInstance(instance);
final RoutingHeader routingHeader = new RoutingHeader((short) 0, Arrays.asList(hop));
final NetworkOperationFuture future = connection.getBboxDBClient().getVersionTimeFuture(table, timestamp, routingHeader);
futures.add(future);
}
return futures;
};
return new TupleListFuture(futureProvider, new DoNothingDuplicateResolver(), table);
}
use of org.bboxdb.distribution.membership.BBoxDBInstance in project bboxdb by jnidzwetzki.
the class BBoxDBCluster method getSystemForNewRessources.
/**
* Find a system with free resources
* @return
* @throws ResourceAllocationException
*/
private BBoxDBConnection getSystemForNewRessources() throws ResourceAllocationException {
final List<BBoxDBInstance> serverConnections = membershipConnectionService.getAllInstances();
if (serverConnections == null) {
throw new ResourceAllocationException("Server connections are null");
}
final BBoxDBInstance system = resourcePlacementStrategy.getInstancesForNewRessource(serverConnections);
return membershipConnectionService.getConnectionForInstance(system);
}
use of org.bboxdb.distribution.membership.BBoxDBInstance in project bboxdb by jnidzwetzki.
the class BBoxDBCluster method lockTuple.
@Override
public EmptyResultFuture lockTuple(final String table, final Tuple tuple) throws BBoxDBException {
final DistributionRegion distributionRegion = getRootNode(table);
final Supplier<List<NetworkOperationFuture>> supplier = () -> {
final List<RoutingHop> hops = RoutingHopHelper.getRoutingHopsForWrite(distributionRegion, tuple.getBoundingBox());
final List<NetworkOperationFuture> futures = new ArrayList<>();
for (final RoutingHop hop : hops) {
final BBoxDBInstance instance = hop.getDistributedInstance();
final BBoxDBConnection connection = membershipConnectionService.getConnectionForInstance(instance);
final RoutingHeader routingHeader = new RoutingHeader((short) 0, Arrays.asList(hop));
final NetworkOperationFuture future = connection.getBboxDBClient().createLockTupleFuture(table, tuple, routingHeader);
futures.add(future);
}
return futures;
};
// When version locking fails, try again with another version
return new EmptyResultFuture(supplier, FutureRetryPolicy.RETRY_POLICY_NONE);
}
Aggregations