[ 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: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org