use of org.bboxdb.distribution.partitioner.SpacePartitioner in project bboxdb by jnidzwetzki.
the class CreateInitialPartitioning method checkForExistingPartitioning.
/**
* Is the region already partitioned?
* @param distributionGroup
* @throws BBoxDBException
*/
private static void checkForExistingPartitioning(final String distributionGroup) throws BBoxDBException {
final SpacePartitioner spacePartitioner = SpacePartitionerCache.getInstance().getSpacePartitionerForGroupName(distributionGroup);
if (spacePartitioner.getRootNode().getThisAndChildRegions().size() != 1) {
System.err.println("Region is already splitted unable to use this for inital splitting");
System.exit(-1);
}
}
use of org.bboxdb.distribution.partitioner.SpacePartitioner in project bboxdb by jnidzwetzki.
the class CreateInitialPartitioning method run.
@Override
public void run() {
final TupleFileReader tupleFile = new TupleFileReader(filename, format);
final List<BoundingBox> samples = new ArrayList<>();
tupleFile.addTupleListener(t -> {
final BoundingBox polygonBoundingBox = t.getBoundingBox();
samples.add(polygonBoundingBox);
});
try {
tupleFile.processFile();
final SpacePartitioner spacePartitioner = SpacePartitionerCache.getInstance().getSpacePartitionerForGroupName(distributionGroup);
final DistributionRegionAdapter adapter = ZookeeperClientFactory.getZookeeperClient().getDistributionRegionAdapter();
while (getActiveRegions(spacePartitioner).size() < partitions) {
logger.info("We have now {} of {} active partitons, executing split", getActiveRegions(spacePartitioner).size() < partitions);
final List<DistributionRegion> activeRegions = getActiveRegions(spacePartitioner);
final DistributionRegion regionToSplit = ListHelper.getElementRandom(activeRegions);
logger.info("Splitting region {}", regionToSplit.getRegionId());
final List<DistributionRegion> destination = spacePartitioner.splitRegion(regionToSplit, samples);
spacePartitioner.splitComplete(regionToSplit, destination);
}
// Prevent merging of nodes
for (DistributionRegion region : spacePartitioner.getRootNode().getAllChildren()) {
adapter.setMergingSupported(region, false);
}
} catch (Exception e) {
logger.error("Got an exception", e);
System.exit(-1);
}
}
use of org.bboxdb.distribution.partitioner.SpacePartitioner in project bboxdb by jnidzwetzki.
the class SSTableServiceRunnable method testForRegionOverflow.
/**
* Does the region needs to be split?
* @param sstableManager
* @throws BBoxDBException
* @throws InterruptedException
*/
private void testForRegionOverflow(final TupleStoreManager sstableManager) throws BBoxDBException, InterruptedException {
// Don't try to split non-distributed tables
if (!sstableManager.getTupleStoreName().isDistributedTable()) {
return;
}
try {
final TupleStoreName ssTableName = sstableManager.getTupleStoreName();
final long regionId = ssTableName.getRegionId().getAsLong();
final SpacePartitioner spacePartitioner = getSpacePartitioner(ssTableName);
final DistributionRegion distributionRegion = spacePartitioner.getRootNode();
final DistributionRegion regionToSplit = DistributionRegionHelper.getDistributionRegionForNamePrefix(distributionRegion, regionId);
// Region does not exist
if (regionToSplit == null) {
return;
}
if (!RegionSplitHelper.isSplittingSupported(regionToSplit)) {
return;
}
if (!RegionSplitHelper.isRegionOverflow(regionToSplit)) {
return;
}
executeSplit(sstableManager, spacePartitioner, regionToSplit);
} catch (Exception e) {
throw new BBoxDBException(e);
}
}
use of org.bboxdb.distribution.partitioner.SpacePartitioner in project bboxdb by jnidzwetzki.
the class SSTableServiceRunnable method testForMergeInGroup.
/**
* Test for merge in distribution region
*
* @param localinstance
* @param groupName
* @throws BBoxDBException
*/
private void testForMergeInGroup(final String groupName) throws BBoxDBException {
final BBoxDBInstance localinstance = ZookeeperClientFactory.getLocalInstanceName();
final SpacePartitioner spacePartitioner = SpacePartitionerCache.getInstance().getSpacePartitionerForGroupName(groupName);
final DistributionRegion rootNode = spacePartitioner.getRootNode();
if (rootNode == null) {
return;
}
final List<DistributionRegion> mergeCandidates = rootNode.getThisAndChildRegions().stream().filter(r -> r.getSystems().contains(localinstance)).collect(Collectors.toList());
for (final DistributionRegion region : mergeCandidates) {
testForUnderflow(spacePartitioner, region);
}
}
use of org.bboxdb.distribution.partitioner.SpacePartitioner in project bboxdb by jnidzwetzki.
the class KeepAliveHandler method checkLocalTuples.
/**
* @param tupleStoreManagerRegistry
* @param tupleStoreName
* @param tuple
* @throws BBoxDBException
* @throws StorageManagerException
*/
private boolean checkLocalTuples(final TupleStoreManagerRegistry tupleStoreManagerRegistry, final TupleStoreName tupleStoreName, final Tuple tuple) throws BBoxDBException {
final String fullname = tupleStoreName.getDistributionGroup();
final SpacePartitioner spacePartitioner = SpacePartitionerCache.getInstance().getSpacePartitionerForGroupName(fullname);
final DistributionRegionIdMapper regionIdMapper = spacePartitioner.getDistributionRegionIdMapper();
final Collection<TupleStoreName> localTables = regionIdMapper.getLocalTablesForRegion(tuple.getBoundingBox(), tupleStoreName);
for (final TupleStoreName localTupleStoreName : localTables) {
try {
final TupleStoreManager storageManager = tupleStoreManagerRegistry.getTupleStoreManager(localTupleStoreName);
final String key = tuple.getKey();
final List<Tuple> localTuples = storageManager.get(key);
if (localTables.isEmpty()) {
logger.error("Got empty tuple list during gossip");
return false;
}
final List<Long> localVersions = getSortedVersionList(localTuples);
final long gossipTupleVersion = tuple.getVersionTimestamp();
return checkLocalTupleVersions(localVersions, gossipTupleVersion, key);
} catch (StorageManagerException e) {
logger.error("Got exception while reading tuples", e);
}
}
return true;
}
Aggregations