use of org.apache.bookkeeper.stream.storage.conf.StorageConfiguration in project bookkeeper by apache.
the class TestHelixStorageContainerManager method testStorageContainerManager.
@Ignore
@Test
public void testStorageContainerManager() throws Exception {
String clusterName = runtime.getMethodName();
int numStorageContainers = 12;
int numHosts = 3;
controller.createCluster(clusterName, numStorageContainers, 3);
StorageConfiguration conf = new StorageConfiguration(new CompositeConfiguration());
Endpoint[] endpoints = new Endpoint[numHosts];
StorageContainerRegistryImpl[] registries = new StorageContainerRegistryImpl[numHosts];
HelixStorageContainerManager[] managers = new HelixStorageContainerManager[numHosts];
int basePort = 80;
for (int i = 0; i < numHosts; i++) {
endpoints[i] = createEndpoint("127.0.0.1", basePort + i);
registries[i] = createRegistry();
managers[i] = createManager(clusterName, conf, registries[i], endpoints[i]);
}
managers[0].start();
while (registries[0].getNumStorageContainers() < numStorageContainers) {
TimeUnit.MILLISECONDS.sleep(20);
}
assertEquals(numStorageContainers, registries[0].getNumStorageContainers());
assertEquals(0, registries[1].getNumStorageContainers());
assertEquals(0, registries[2].getNumStorageContainers());
// start the second node
managers[1].start();
while (registries[0].getNumStorageContainers() > numStorageContainers / 2) {
TimeUnit.MILLISECONDS.sleep(20);
}
while (registries[1].getNumStorageContainers() < numStorageContainers / 2) {
TimeUnit.MILLISECONDS.sleep(20);
}
assertEquals(numStorageContainers / 2, registries[0].getNumStorageContainers());
assertEquals(numStorageContainers / 2, registries[1].getNumStorageContainers());
assertEquals(0, registries[2].getNumStorageContainers());
// start the third node
managers[2].start();
while (registries[0].getNumStorageContainers() > numStorageContainers / 3) {
TimeUnit.MILLISECONDS.sleep(20);
}
while (registries[1].getNumStorageContainers() > numStorageContainers / 3) {
TimeUnit.MILLISECONDS.sleep(20);
}
while (registries[2].getNumStorageContainers() < numStorageContainers / 3) {
TimeUnit.MILLISECONDS.sleep(20);
}
int totalStorageContainers = registries[0].getNumStorageContainers() + registries[1].getNumStorageContainers() + registries[2].getNumStorageContainers();
assertEquals("Expected " + numStorageContainers + "But " + totalStorageContainers + " found", numStorageContainers, totalStorageContainers);
assertEquals(numStorageContainers / 3, registries[0].getNumStorageContainers());
assertEquals(numStorageContainers / 3, registries[1].getNumStorageContainers());
assertEquals(numStorageContainers / 3, registries[2].getNumStorageContainers());
for (int i = 0; i < 10; i++) {
int nid = ThreadLocalRandom.current().nextInt(numHosts);
long scId = ThreadLocalRandom.current().nextLong(numStorageContainers);
Endpoint endpoint = managers[nid].getStorageContainer(scId);
if (null != endpoint) {
assertTrue(endpoint.equals(endpoints[0]) || endpoint.equals(endpoints[1]) || endpoint.equals(endpoints[2]));
}
}
for (HelixStorageContainerManager manager : managers) {
manager.close();
}
}
use of org.apache.bookkeeper.stream.storage.conf.StorageConfiguration in project bookkeeper by apache.
the class StreamCluster method startServer.
private LifecycleComponent startServer() throws Exception {
int bookiePort;
int grpcPort;
boolean success = false;
int retries = 0;
while (!success) {
synchronized (this) {
bookiePort = nextBookiePort++;
grpcPort = nextGrpcPort++;
}
LifecycleComponent server = null;
try {
ServerConfiguration serverConf = new ServerConfiguration();
serverConf.loadConf(baseConf);
serverConf.setBookiePort(bookiePort);
File bkDir = new File(spec.storageRootDir(), "bookie_" + bookiePort);
serverConf.setJournalDirName(bkDir.getPath());
serverConf.setLedgerDirNames(new String[] { bkDir.getPath() });
DistributedLogConfiguration dlConf = new DistributedLogConfiguration();
dlConf.loadConf(serverConf);
File rangesStoreDir = new File(spec.storageRootDir(), "ranges_" + grpcPort);
StorageConfiguration storageConf = new StorageConfiguration(serverConf);
storageConf.setRangeStoreDirNames(new String[] { rangesStoreDir.getPath() });
storageConf.setServeReadOnlyTables(spec.serveReadOnlyTable);
log.info("Attempting to start storage server at (bookie port = {}, grpc port = {})" + " : bkDir = {}, rangesStoreDir = {}, serveReadOnlyTables = {}", bookiePort, grpcPort, bkDir, rangesStoreDir, spec.serveReadOnlyTable);
server = StorageServer.startStorageServer(serverConf, grpcPort, spec.numServers() * 2, Optional.empty());
server.start();
log.info("Started storage server at (bookie port = {}, grpc port = {})", bookiePort, grpcPort);
this.rpcEndpoints.add(StorageServer.createLocalEndpoint(grpcPort, false));
return server;
} catch (Throwable e) {
log.error("Failed to start storage server", e);
if (null != server) {
server.stop();
}
if (e.getCause() instanceof BindException) {
retries++;
if (retries > MAX_RETRIES) {
throw (BindException) e.getCause();
}
} else {
throw e;
}
}
}
throw new IOException("Failed to start any storage server.");
}
use of org.apache.bookkeeper.stream.storage.conf.StorageConfiguration in project bookkeeper by apache.
the class StorageServer method startStorageServer.
public static LifecycleComponent startStorageServer(CompositeConfiguration conf, int grpcPort, int numStorageContainers, Optional<String> instanceName) throws ConfigurationException, UnknownHostException {
BookieConfiguration bkConf = BookieConfiguration.of(conf);
bkConf.validate();
DLConfiguration dlConf = DLConfiguration.of(conf);
dlConf.validate();
StorageServerConfiguration serverConf = StorageServerConfiguration.of(conf);
serverConf.validate();
StorageConfiguration storageConf = new StorageConfiguration(conf);
storageConf.validate();
// Get my local endpoint
Endpoint myEndpoint = createLocalEndpoint(grpcPort, false);
// Create shared resources
StorageResources storageResources = StorageResources.create();
// Create the stats provider
StatsProviderService statsProviderService = new StatsProviderService(bkConf);
StatsLogger rootStatsLogger = statsProviderService.getStatsProvider().getStatsLogger("");
// Create the bookie service
BookieService bookieService = new BookieService(bkConf, rootStatsLogger);
// Create the distributedlog namespace service
DLNamespaceProviderService dlNamespaceProvider = new DLNamespaceProviderService(bookieService.serverConf(), dlConf, rootStatsLogger.scope("dl"));
// Create range (stream) store
RangeStoreBuilder rangeStoreBuilder = RangeStoreBuilder.newBuilder().withStatsLogger(rootStatsLogger.scope("storage")).withStorageConfiguration(storageConf).withStorageResources(storageResources).withNumStorageContainers(numStorageContainers).withDefaultBackendUri(dlNamespaceProvider.getDlogUri()).withStorageContainerManagerFactory((ignored, storeConf, registry) -> new HelixStorageContainerManager(bookieService.serverConf().getZkServers(), "stream/helix", storeConf, registry, myEndpoint, instanceName, rootStatsLogger.scope("helix"))).withRangeStoreFactory(new MVCCStoreFactoryImpl(dlNamespaceProvider, storageConf.getRangeStoreDirs(), storageResources, storageConf.getServeReadOnlyTables()));
StorageService storageService = new StorageService(storageConf, rangeStoreBuilder, rootStatsLogger.scope("storage"));
// Create gRPC server
StatsLogger rpcStatsLogger = rootStatsLogger.scope("grpc");
GrpcServerSpec serverSpec = GrpcServerSpec.builder().storeSupplier(storageService).storeServerConf(serverConf).endpoint(myEndpoint).statsLogger(rpcStatsLogger).build();
GrpcService grpcService = new GrpcService(serverConf, serverSpec, rpcStatsLogger);
// Create all the service stack
return LifecycleComponentStack.newBuilder().withName("storage-server").addComponent(// stats provider
statsProviderService).addComponent(// bookie server
bookieService).addComponent(// service that provides dl namespace
dlNamespaceProvider).addComponent(// range (stream) store
storageService).addComponent(// range (stream) server (gRPC)
grpcService).build();
}
use of org.apache.bookkeeper.stream.storage.conf.StorageConfiguration in project bookkeeper by apache.
the class TestDefaultStorageContainerFactory method testCreate.
@Test
public void testCreate() throws Exception {
OrderedScheduler scheduler = mock(OrderedScheduler.class);
OrderedScheduler snapshotScheduler = mock(OrderedScheduler.class);
MVCCStoreFactory storeFactory = mock(MVCCStoreFactory.class);
ListeningScheduledExecutorService snapshotExecutor = mock(ListeningScheduledExecutorService.class);
when(snapshotScheduler.chooseThread(anyLong())).thenReturn(snapshotExecutor);
Mockito.doReturn(mock(ListenableScheduledFuture.class)).when(snapshotExecutor).scheduleWithFixedDelay(any(Runnable.class), anyInt(), anyInt(), any(TimeUnit.class));
DefaultStorageContainerFactory factory = new DefaultStorageContainerFactory(new StorageConfiguration(new CompositeConfiguration()), (streamId, rangeId) -> streamId, scheduler, storeFactory, URI.create("distributedlog://127.0.0.1/stream/storage"));
StorageContainer sc = factory.createStorageContainer(1234L);
assertTrue(sc instanceof StorageContainerImpl);
assertEquals(1234L, sc.getId());
}
Aggregations