if (randomPort) {
bindPort = tNonblockingServerSocket.getServerSocket().getLocalPort();
}
int baseGuiPort = Integer.parseInt(configuration.get(BLUR_GUI_SHARD_PORT));
final HttpJettyServer httpServer;
if (baseGuiPort > 0) {
int webServerPort = baseGuiPort + serverIndex;
httpServer = new HttpJettyServer(HttpJettyServer.class, webServerPort);
int port = httpServer.getLocalPort();
configuration.setInt(BLUR_HTTP_STATUS_RUNNING_PORT, port);
} else {
httpServer = null;
}
Set<Entry<String, String>> set = configuration.getProperties().entrySet();
for (Entry<String, String> e : set) {
String key = e.getKey();
if (key.startsWith("blur.shard.buffercache.")) {
int index = key.lastIndexOf('.');
int bufferSize = Integer.parseInt(key.substring(index + 1));
long amount = Long.parseLong(e.getValue());
BufferStore.initNewBuffer(bufferSize, amount);
}
}
BlockCacheDirectoryFactory blockCacheDirectoryFactory;
// Alternate BlockCacheDirectoryFactory support currently disabled in 0.2.0,
// look for it in 0.2.1
String blockCacheVersion = configuration.get(BLUR_SHARD_BLOCK_CACHE_VERSION, "v2");
long totalNumberOfBytes = configuration.getLong(BLUR_SHARD_BLOCK_CACHE_TOTAL_SIZE, VM.maxDirectMemory() - _64MB);
if (blockCacheVersion.equals("v1")) {
blockCacheDirectoryFactory = new BlockCacheDirectoryFactoryV1(configuration, totalNumberOfBytes);
} else if (blockCacheVersion.equals("v2")) {
blockCacheDirectoryFactory = new BlockCacheDirectoryFactoryV2(configuration, totalNumberOfBytes);
} else {
throw new RuntimeException("Unknown block cache version [" + blockCacheVersion + "] can be [v1,v2]");
}
LOG.info("Shard Server using index [{0}] bind address [{1}] random port assignment [{2}]", serverIndex, bindAddress
+ ":" + bindPort, randomPort);
String nodeNameHostName = getNodeName(configuration, BLUR_SHARD_HOSTNAME);
String nodeName = nodeNameHostName + ":" + bindPort;
String zkConnectionStr = isEmpty(configuration.get(BLUR_ZOOKEEPER_CONNECTION), BLUR_ZOOKEEPER_CONNECTION);
BlurQueryChecker queryChecker = new BlurQueryChecker(configuration);
int sessionTimeout = configuration.getInt(BLUR_ZOOKEEPER_TIMEOUT, BLUR_ZOOKEEPER_TIMEOUT_DEFAULT);
final ZooKeeper zooKeeper = ZkUtils.newZooKeeper(zkConnectionStr, sessionTimeout);
String cluster = configuration.get(BLUR_CLUSTER_NAME, BLUR_CLUSTER);
BlurUtil.setupZookeeper(zooKeeper, cluster);
final ZookeeperClusterStatus clusterStatus = new ZookeeperClusterStatus(zooKeeper, configuration);
final BlurIndexRefresher refresher = new BlurIndexRefresher();
BlurFilterCache filterCache = getFilterCache(configuration);
BlurIndexWarmup indexWarmup = BlurIndexWarmup.getIndexWarmup(configuration);
DistributedLayoutFactory distributedLayoutFactory = DistributedLayoutFactoryImpl.getDistributedLayoutFactory(
configuration, cluster, zooKeeper);
long safeModeDelay = configuration.getLong(BLUR_SHARD_SAFEMODEDELAY, 60000);
int shardOpenerThreadCount = configuration.getInt(BLUR_SHARD_OPENER_THREAD_COUNT, 16);
int internalSearchThreads = configuration.getInt(BLUR_SHARD_WARMUP_THREAD_COUNT, 16);
int warmupThreads = configuration.getInt(BLUR_SHARD_WARMUP_THREAD_COUNT, 16);
int maxMergeThreads = configuration.getInt(BLUR_SHARD_MERGE_THREAD_COUNT, 3);
boolean warmupDisabled = configuration.getBoolean(BLUR_SHARD_WARMUP_DISABLED, false);
int minimumNumberOfNodesBeforeExitingSafeMode = configuration.getInt(
BLUR_SHARD_SERVER_MINIMUM_BEFORE_SAFEMODE_EXIT, 0);
final DistributedIndexServer indexServer = new DistributedIndexServer(config, zooKeeper, clusterStatus,
indexWarmup, filterCache, blockCacheDirectoryFactory, distributedLayoutFactory, cluster, nodeName,
safeModeDelay, shardOpenerThreadCount, internalSearchThreads, warmupThreads, maxMergeThreads, warmupDisabled,
minimumNumberOfNodesBeforeExitingSafeMode);
BooleanQuery.setMaxClauseCount(configuration.getInt(BLUR_MAX_CLAUSE_COUNT, 1024));
int maxHeapPerRowFetch = configuration.getInt(BLUR_MAX_HEAP_PER_ROW_FETCH, 10000000);
int remoteFetchCount = configuration.getInt(BLUR_CONTROLLER_REMOTE_FETCH_COUNT, 100);
int fetchCount = configuration.getInt(BLUR_SHARD_FETCHCOUNT, 110);
if (fetchCount + 1 <= remoteFetchCount) {
LOG.warn("[" + BLUR_SHARD_FETCHCOUNT + "] [" + fetchCount + "] is equal to or less than ["
+ BLUR_CONTROLLER_REMOTE_FETCH_COUNT + "] [" + remoteFetchCount + "], should be at least 1 greater.");
}
int indexManagerThreadCount = configuration.getInt(BLUR_INDEXMANAGER_SEARCH_THREAD_COUNT, 32);
int mutateThreadCount = configuration.getInt(BLUR_INDEXMANAGER_MUTATE_THREAD_COUNT, 32);
int facetThreadCount = configuration.getInt(BLUR_INDEXMANAGER_FACET_THREAD_COUNT, 16);
long statusCleanupTimerDelay = TimeUnit.SECONDS.toMillis(10);
int cacheSize = configuration.getInt(BLUR_SHARD_DEEP_PAGING_CACHE_SIZE, 1000);
DeepPagingCache deepPagingCache = new DeepPagingCache(cacheSize);
final IndexManager indexManager = new IndexManager(indexServer, clusterStatus, filterCache, maxHeapPerRowFetch,
fetchCount, indexManagerThreadCount, mutateThreadCount, statusCleanupTimerDelay, facetThreadCount,
deepPagingCache);
final BlurShardServer shardServer = new BlurShardServer();
shardServer.setIndexServer(indexServer);
shardServer.setIndexManager(indexManager);
shardServer.setZookeeper(zooKeeper);
shardServer.setClusterStatus(clusterStatus);
shardServer.setQueryChecker(queryChecker);
shardServer.setMaxRecordsPerRowFetchRequest(configuration.getInt(BLUR_MAX_RECORDS_PER_ROW_FETCH_REQUEST, 1000));
shardServer.setConfiguration(configuration);
shardServer.init();
final TraceStorage traceStorage = setupTraceStorage(configuration);
Trace.setStorage(traceStorage);
Trace.setNodeName(nodeName);
Iface iface = BlurUtil.wrapFilteredBlurServer(configuration, shardServer, true);
iface = BlurUtil.recordMethodCallsAndAverageTimes(iface, Iface.class, false);
iface = BlurUtil.runWithUser(iface, false);
iface = BlurUtil.runTrace(iface, false);
iface = BlurUtil.lastChanceErrorHandling(iface, Iface.class);
if (httpServer != null) {
WebAppContext context = httpServer.getContext();
context.addServlet(new ServletHolder(new TServlet(new Blur.Processor<Blur.Iface>(iface),
new TJSONProtocol.Factory())), "/blur");
context.addServlet(new ServletHolder(new JSONReporterServlet()), "/livemetrics");
if (enableJsonReporter) {
JSONReporter.enable("json-reporter", 1, TimeUnit.SECONDS, 60);