use of com.linkedin.databus.client.pub.DatabusClientException in project databus by linkedin.
the class DatabusV2ClusterRegistrationImpl method activateOnePartition.
/**
* Callback to activate one partition that was added
* @param partition
* @throws DatabusException
*/
private synchronized void activateOnePartition(DbusPartitionInfo partition) throws DatabusClientException {
_log.info("Trying to activate partition :" + partition);
try {
if (regMap.containsKey(partition)) {
_log.info("Partition (" + partition + ") is already added and is currently in state : " + regMap.get(partition).getState() + " skipping !!");
return;
}
// Call factories to get consumer callbacks and server-side filter config.
Collection<DatabusCombinedConsumer> consumers = _consumerFactory.createPartitionedConsumers(_clusterInfo, partition);
DbusKeyCompositeFilterConfig filterConfig = null;
if (_serverSideFilterFactory != null)
filterConfig = _serverSideFilterFactory.createServerSideFilter(_clusterInfo, partition);
if ((null == consumers) || (consumers.isEmpty())) {
_log.error("ConsumerFactory for cluster (" + _clusterInfo + ") returned null or empty consumers ");
throw new DatabusClientException("ConsumerFactory for cluster (" + _clusterInfo + ") returned null or empty consumers");
}
// Create Registration
RegistrationId id = new RegistrationId(_id + "-" + partition.getPartitionId());
CheckpointPersistenceProvider ckptProvider = createCheckpointPersistenceProvider(partition);
DatabusV2RegistrationImpl reg = createChildRegistration(id, _client, ckptProvider);
reg.addDatabusConsumers(consumers);
String[] srcs = new String[_sources.size()];
srcs = _sources.toArray(srcs);
reg.addSubscriptions(srcs);
regMap.put(partition, reg);
reg.onRegister();
// Add Server-Side Filter
if (null != filterConfig)
reg.withServerSideFilter(filterConfig);
// Notify Listener
if (null != _partitionListener)
_partitionListener.onAddPartition(partition, reg);
// Start the registration
try {
reg.start();
} catch (DatabusClientException e) {
_log.error("Got exception while starting the registration for partition (" + partition + ")", e);
throw e;
}
// Add partition Specific metrics to cluster-merge
_relayEventStatsMerger.addStatsCollector(id.getId(), (DbusEventsStatisticsCollector) reg.getRelayEventStats());
_bootstrapEventStatsMerger.addStatsCollector(id.getId(), (DbusEventsStatisticsCollector) reg.getBootstrapEventStats());
_relayCallbackStatsMerger.addStatsCollector(id.getId(), (ConsumerCallbackStats) reg.getRelayCallbackStats());
_bootstrapCallbackStatsMerger.addStatsCollector(id.getId(), (ConsumerCallbackStats) reg.getBootstrapCallbackStats());
_log.info("Partition (" + partition + ") started !!");
} catch (DatabusException e) {
_log.error("Got exception while activating partition(" + partition + ")", e);
throw new DatabusClientException(e);
} catch (ClusterCheckpointException e) {
_log.error("Got exception while activating partition(" + partition + ")", e);
throw new DatabusClientException(e);
}
}
use of com.linkedin.databus.client.pub.DatabusClientException in project databus by linkedin.
the class DatabusV2ClusterRegistrationImpl method withRegId.
@Override
public synchronized DatabusRegistration withRegId(RegistrationId regId) throws DatabusClientException, IllegalStateException {
if ((_id != null) && (_id.equals(regId)))
return this;
if (!RegistrationIdGenerator.isIdValid(regId))
throw new DatabusClientException("Another registration with the same regId (" + regId + ") already present !!");
if (_state.isRunning())
throw new IllegalStateException("Cannot update regId when registration is in running state. RegId :" + _id + ", State :" + _state);
_id = regId;
// Component Status should use the correct component name
_status = new Status();
return this;
}
use of com.linkedin.databus.client.pub.DatabusClientException in project databus by linkedin.
the class DatabusV2ClusterRegistrationImpl method start.
@Override
public synchronized boolean start() throws IllegalStateException, DatabusClientException {
if (_state == RegistrationState.INIT || _state == RegistrationState.DEREGISTERED) {
String errMsg = "Registration (" + _id + ") cannot be started from its current state, which is " + _state + " .It may only be started from REGISTERED or SHUTDOWN state";
_log.error(errMsg);
throw new IllegalStateException(errMsg);
}
if (_state.isRunning()) {
_log.info("Registration (" + _id + ") already started !!");
return false;
}
String host = null;
try {
host = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) {
_log.error("Unable to fetch the local hostname !! Trying to fetch IP Address !!", e);
try {
host = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e1) {
_log.error("Unable to fetch the local IP Address too !! Giving up", e1);
host = "UNKNOWN_HOST";
}
}
/**
* The id below has to be unique within a given cluster. HttpPort is used to get a unique name for service colocated in a single box.
* The Container id is not necessarily a sufficient differentiating factor.
*/
String id = host + "-" + _client.getContainerStaticConfig().getHttpPort() + "-" + _client.getContainerStaticConfig().getId();
try {
_cluster = createCluster();
_cluster.start();
} catch (Exception e) {
_log.fatal("Got exception while trying to create the cluster with id (" + id + ")", e);
throw new DatabusClientException(e);
}
initializeStatsCollectors();
_log.info("Dabatus cluster object created : " + _cluster + " with id :" + id);
_clusterMember = _cluster.addMember(id, this);
boolean joined = _clusterMember.join();
if (!joined) {
_log.fatal("Unable to join the cluster " + _clusterInfo);
throw new DatabusClientException("Unable to join the cluster :" + _clusterInfo);
}
_state = RegistrationState.STARTED;
activatePartitions();
return true;
}
use of com.linkedin.databus.client.pub.DatabusClientException in project databus by linkedin.
the class DatabusV2RegistrationImpl method start.
@Override
public synchronized boolean start() throws IllegalStateException, DatabusClientException {
_log.info("Starting registration (" + toString() + ") !!");
if (_state.isRunning()) {
_log.info("Registration (" + _id + ") already started !!");
return false;
}
if (_state != RegistrationState.REGISTERED)
throw new IllegalStateException("Registration (" + _id + ") not in startable state !! Current State is :" + _state);
if ((null == _sources) || (_sources.isEmpty()))
throw new DatabusClientException("Registration (" + _id + ") does not have any sources to start !!");
if ((null == _consumers) || (_consumers.isEmpty()))
throw new DatabusClientException("Registration (" + _id + ") does not have any consumers to start !!");
List<ServerInfo> relays = _client.getRelays();
List<ServerInfo> bootstrapServers = _client.getBootstrapServices();
List<DatabusCombinedConsumer> streamConsumers = new ArrayList<DatabusCombinedConsumer>();
List<DatabusCombinedConsumer> bootstrapConsumers = new ArrayList<DatabusCombinedConsumer>();
if ((null == relays) || (relays.isEmpty()))
throw new DatabusClientException("No configured relays in the client to start");
Set<ServerInfo> candidateRelays = new HashSet<ServerInfo>();
for (ServerInfo s : relays) {
if (canServe(s, _sources))
candidateRelays.add(s);
}
if (candidateRelays.isEmpty())
throw new DatabusClientException("No candidate relays for source : " + _sources);
streamConsumers.addAll(_consumers);
boolean canConsumerBootstrap = false;
_streamConsumerRawRegistrations = new ArrayList<DatabusV2ConsumerRegistration>();
_streamConsumerRawRegistrations.add(new DatabusV2ConsumerRegistration(streamConsumers, _sources, _filterConfig));
for (DatabusCombinedConsumer c : _consumers) {
if (c.canBootstrap()) {
canConsumerBootstrap = true;
bootstrapConsumers.add(c);
}
}
boolean enableBootstrap = _client.getClientStaticConfig().getRuntime().getBootstrap().isEnabled();
Set<ServerInfo> candidateBootstrapServers = new HashSet<ServerInfo>();
if (enableBootstrap && canConsumerBootstrap) {
if ((null == bootstrapServers) || (bootstrapServers.isEmpty()))
throw new DatabusClientException("No configured bootstrap servers in the client to start");
for (ServerInfo s : bootstrapServers) {
if (canServe(s, _sources))
candidateBootstrapServers.add(s);
}
if (candidateBootstrapServers.isEmpty())
throw new DatabusClientException("No candidate bootstrap servers for source : " + _sources);
_bootstrapConsumerRawRegistrations = new ArrayList<DatabusV2ConsumerRegistration>();
;
_bootstrapConsumerRawRegistrations.add(new DatabusV2ConsumerRegistration(bootstrapConsumers, _sources, _filterConfig));
}
// All validations done. Setup and start
initializeStatsCollectors();
DatabusSourcesConnection.StaticConfig connConfig = _client.getClientStaticConfig().getConnection(_sources);
if (null == connConfig)
connConfig = _client.getClientStaticConfig().getConnectionDefaults();
DbusEventBuffer eventBuffer = null;
{
DbusEventBuffer.StaticConfig cfg = connConfig.getEventBuffer();
eventBuffer = new DbusEventBuffer(cfg.getMaxSize(), cfg.getMaxIndividualBufferSize(), cfg.getScnIndexSize(), cfg.getReadBufferSize(), cfg.getMaxEventSize(), cfg.getAllocationPolicy(), new File(cfg.getMmapDirectory().getAbsolutePath() + "_stream_" + _id), cfg.getQueuePolicy(), cfg.getTrace(), null, cfg.getAssertLevel(), cfg.getBufferRemoveWaitPeriod(), cfg.getRestoreMMappedBuffers(), cfg.getRestoreMMappedBuffersValidateEvents(), cfg.isEnableScnIndex(), _client.getEventFactory());
eventBuffer.setDropOldEvents(true);
eventBuffer.start(0);
}
DbusEventBuffer bootstrapBuffer = null;
if (enableBootstrap && canConsumerBootstrap) {
DbusEventBuffer.StaticConfig bstCfg = connConfig.getBstEventBuffer();
bootstrapBuffer = new DbusEventBuffer(bstCfg.getMaxSize(), bstCfg.getMaxIndividualBufferSize(), bstCfg.getScnIndexSize(), bstCfg.getReadBufferSize(), bstCfg.getMaxEventSize(), bstCfg.getAllocationPolicy(), new File(bstCfg.getMmapDirectory().getAbsolutePath() + "_bootstrap_" + _id), bstCfg.getQueuePolicy(), bstCfg.getTrace(), null, bstCfg.getAssertLevel(), bstCfg.getBufferRemoveWaitPeriod(), bstCfg.getRestoreMMappedBuffers(), bstCfg.getRestoreMMappedBuffersValidateEvents(), bstCfg.isEnableScnIndex(), _client.getEventFactory());
bootstrapBuffer.setDropOldEvents(false);
bootstrapBuffer.start(0);
}
List<DatabusSubscription> subs = createSubscriptions(_sources);
if (null != _checkpointPersistenceProvider && _client.getClientStaticConfig().getCheckpointPersistence().isClearBeforeUse()) {
_log.info("Clearing checkpoint for sources :" + _sources + " with regId :" + _id);
_checkpointPersistenceProvider.removeCheckpoint(_sources);
}
_sourcesConnection = createConnection(connConfig, subs, candidateRelays, candidateBootstrapServers, eventBuffer, bootstrapBuffer);
_sourcesConnection.start();
_state = RegistrationState.STARTED;
_status.start();
_state = RegistrationState.STARTED;
return true;
}
use of com.linkedin.databus.client.pub.DatabusClientException in project databus by linkedin.
the class DatabusHttpClientImpl method registerDatabusListener.
protected List<DatabusV2ConsumerRegistration> registerDatabusListener(DatabusV2ConsumerRegistration listener, Map<List<DatabusSubscription>, Set<ServerInfo>> groupsServers, Map<List<DatabusSubscription>, List<DatabusV2ConsumerRegistration>> groupsListeners, List<DatabusSubscription> sources) throws DatabusClientException {
List<DatabusSubscription> subsSources = null;
ServerInfo randomRelay = getRandomRelay(groupsServers, sources);
if (null == randomRelay) {
// even if there is no relay available to serve it immediately.
assert getClientStaticConfig().usesDynamicRelayConfiguration() : "Client relay(s) configured statically but no relays available at listener registration";
subsSources = sources;
} else {
try {
subsSources = DatabusSubscription.createFromUriList(randomRelay.getSources());
} catch (DatabusException e) {
throw new DatabusClientException("source list decode error:" + e.getMessage(), e);
} catch (URISyntaxException e) {
throw new DatabusClientException("source list decode error:" + e.getMessage(), e);
}
}
List<DatabusV2ConsumerRegistration> consumers = getListOfConsumerRegsFromSubList(groupsListeners, subsSources);
if (null == consumers) {
consumers = new CopyOnWriteArrayList<DatabusV2ConsumerRegistration>();
groupsListeners.put(subsSources, consumers);
}
consumers.add(listener);
return consumers;
}
Aggregations