[ 
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}

While looking into that ticket we also discovered a problem with the used of 
{{Metered}} in {{CacheMetrics}}.
Metrics reporter looks for metrics classes that are instance of the standard 
codahale classes. Due to that, other Metered implementations are not be exposed 
through the reporter. This ticket will also address that issue.

  was:
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.


> 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}
> While looking into that ticket we also discovered a problem with the used of 
> {{Metered}} in {{CacheMetrics}}.
> Metrics reporter looks for metrics classes that are instance of the standard 
> codahale classes. Due to that, other Metered implementations are not be 
> exposed through the reporter. This ticket will also address that issue.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to