[
https://issues.apache.org/jira/browse/CASSANDRA-16228?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Benjamin Lerer updated CASSANDRA-16228:
---------------------------------------
Description:
The {{ColumnFamilyStore}} exposes the {{TableMetrics}} before it is fully
initialized, due to that it is possible to perform a call via the metrics that
access uninitialized part of the {{ColumnFamilyStore}}.
The following test can be added to ColumnFamilyMetricTest to show the issue:
{code:java}
@Test
public void testStartupRaceConditionOnMetricListeners()
{
// Since the ColumnFamilyStore instance reference escapes during the
construction
// we have a race condition and listeners can see an instance that is in an
unknown state.
// This test just check that all callbacks can access the data without
throwing any exception.
registerMetricListener();
SchemaLoader.createKeyspace("Keyspace2",
KeyspaceParams.simple(1),
SchemaLoader.standardCFMD("Keyspace2", "Standard2"));
}
private void registerMetricListener()
{
CassandraMetricsRegistry.Metrics.addListener(new MetricRegistryListener.Base()
{
@Override
public void onGaugeAdded(String name, Gauge<?> gauge)
{
gauge.getValue();
}
@Override
public void onGaugeRemoved(String name)
{
}
@Override
public void onCounterAdded(String name, Counter counter)
{
counter.getCount();
}
@Override
public void onCounterRemoved(String name)
{
}
@Override
public void onHistogramAdded(String name, Histogram histogram)
{
histogram.getCount();
}
@Override
public void onHistogramRemoved(String name)
{
}
@Override
public void onMeterAdded(String name, Meter meter)
{
meter.getCount();
}
@Override
public void onMeterRemoved(String name)
{
}
@Override
public void onTimerAdded(String name, Timer timer)
{
timer.getCount();
}
@Override
public void onTimerRemoved(String name)
{
}
});{code}
*NOTE:* In order to be able to run the test in 4.0 and use
registerMetricListener() method a small modification to requests in
CacheMetrics is needed. This will be submitted and further explained with a
coming patch.
was:
There is a dependency between TableMetrics, SecondaryIndexManager and Tracker
which requires certain order of the operations in ColumnFamilyStore
constructor.
The following test will be added to ColumnFamilyMetricTest to show the issue:
{code:java}
@Test
public void testStartupRaceConditionOnMetricListeners()
{
// Since the ColumnFamilyStore instance reference escapes during the
construction
// we have a race condition and listeners can see an instance that is in an
unknown state.
// This test just check that all callbacks can access the data without
throwing any exception.
registerMetricListener();
SchemaLoader.createKeyspace("Keyspace2",
KeyspaceParams.simple(1),
SchemaLoader.standardCFMD("Keyspace2", "Standard2"));
}
private void registerMetricListener()
{
CassandraMetricsRegistry.Metrics.addListener(new MetricRegistryListener.Base()
{
@Override
public void onGaugeAdded(String name, Gauge<?> gauge)
{
gauge.getValue();
}
@Override
public void onGaugeRemoved(String name)
{
}
@Override
public void onCounterAdded(String name, Counter counter)
{
counter.getCount();
}
@Override
public void onCounterRemoved(String name)
{
}
@Override
public void onHistogramAdded(String name, Histogram histogram)
{
histogram.getCount();
}
@Override
public void onHistogramRemoved(String name)
{
}
@Override
public void onMeterAdded(String name, Meter meter)
{
meter.getCount();
}
@Override
public void onMeterRemoved(String name)
{
}
@Override
public void onTimerAdded(String name, Timer timer)
{
timer.getCount();
}
@Override
public void onTimerRemoved(String name)
{
}
});{code}
*NOTE:* In order to be able to run the test in 4.0 and use
registerMetricListener() method a small modification to requests in
CacheMetrics is needed. This will be submitted and further explained with a
coming patch.
> TableMetrics are exposed before ColumnFamilyStore is fully initialized
> ----------------------------------------------------------------------
>
> Key: CASSANDRA-16228
> URL: https://issues.apache.org/jira/browse/CASSANDRA-16228
> Project: Cassandra
> Issue Type: Bug
> Components: Observability/Metrics
> Reporter: Ekaterina Dimitrova
> Assignee: Ekaterina Dimitrova
> Priority: Normal
> Fix For: 3.0.x, 3.11.x, 4.0-beta
>
>
> The {{ColumnFamilyStore}} exposes the {{TableMetrics}} before it is fully
> initialized, due to that it is possible to perform a call via the metrics
> that access uninitialized part of the {{ColumnFamilyStore}}.
> The following test can be added to ColumnFamilyMetricTest to show the issue:
> {code:java}
> @Test
> public void testStartupRaceConditionOnMetricListeners()
> {
> // Since the ColumnFamilyStore instance reference escapes during the
> construction
> // we have a race condition and listeners can see an instance that is in an
> unknown state.
> // This test just check that all callbacks can access the data without
> throwing any exception.
> registerMetricListener();
> SchemaLoader.createKeyspace("Keyspace2",
> KeyspaceParams.simple(1),
> SchemaLoader.standardCFMD("Keyspace2", "Standard2"));
> }
> private void registerMetricListener()
> {
> CassandraMetricsRegistry.Metrics.addListener(new
> MetricRegistryListener.Base()
> {
> @Override
> public void onGaugeAdded(String name, Gauge<?> gauge)
> {
> gauge.getValue();
> }
> @Override
> public void onGaugeRemoved(String name)
> {
> }
> @Override
> public void onCounterAdded(String name, Counter counter)
> {
> counter.getCount();
> }
> @Override
> public void onCounterRemoved(String name)
> {
> }
> @Override
> public void onHistogramAdded(String name, Histogram histogram)
> {
> histogram.getCount();
> }
> @Override
> public void onHistogramRemoved(String name)
> {
> }
> @Override
> public void onMeterAdded(String name, Meter meter)
> {
> meter.getCount();
> }
> @Override
> public void onMeterRemoved(String name)
> {
> }
> @Override
> public void onTimerAdded(String name, Timer timer)
> {
> timer.getCount();
> }
> @Override
> public void onTimerRemoved(String name)
> {
> }
> });{code}
> *NOTE:* In order to be able to run the test in 4.0 and use
> registerMetricListener() method a small modification to requests in
> CacheMetrics is needed. This will be submitted and further explained with a
> coming patch.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]