Aleksei Ieshin created HDDS-17038:
-------------------------------------

             Summary: OzoneManagerDoubleBuffer metrics disappear permanently 
after a follower installs a Ratis snapshot
                 Key: HDDS-17038
                 URL: https://issues.apache.org/jira/browse/HDDS-17038
             Project: Apache Ozone
          Issue Type: Bug
          Components: OM HA
    Affects Versions: 2.2.1, 2.2.0, 2.0.0
            Reporter: Aleksei Ieshin


After an OM installs a Ratis snapshot (for example, a lagging follower catching 
up), all {{OzoneManagerDoubleBufferMetrics}} 
({{{}ozone_manager_double_buffer_metrics_*{}}} on {{{}/prom{}}}, 
{{OzoneManagerDoubleBufferMetrics}} on {{{}/jmx{}}}) stop being published. They 
stay missing until the OM JVM restarts. The double buffer itself keeps 
flushing; only the metrics source is gone.

Cause:
 # {{{}OzoneManagerStateMachine.pause(){}}}, used by snapshot install, calls 
{{{}ozoneManagerDoubleBuffer.stop(){}}}. {{OzoneManagerDoubleBuffer.stop()}} 
calls {{{}metrics.unRegister(){}}}, which runs 
{{{}DefaultMetricsSystem.instance().unregisterSource(SOURCE_NAME){}}}.
 # {{OzoneManagerStateMachine.unpause()}} then creates a new double buffer via 
{{{}buildDoubleBufferForRatis(){}}}. Its field initializer calls 
{{{}OzoneManagerDoubleBufferMetrics.create(){}}}.
 # {{create()}} is a lazy singleton:
 
!http://localhost:63342/markdownPreview/651969378//Users/aieshin/git/ozone!
 {{public static synchronized OzoneManagerDoubleBufferMetrics create() \{
  if (instance != null) {
    return instance;      // still the old object, whose source was 
unregistered in step 1
  } ...}}
{{unRegister()}} never resets {{{}instance{}}}, so the new double buffer 
updates an object that no longer belongs to the metrics system, and nothing is 
exported.

Observed in production on 2.0.0. The same code is in 2.2.1 and master. On a 
3-node OM HA cluster, two followers lost these metrics after snapshot installs 
(one during a RATIS-2240 snapshot-install deadlock, one during a period of 
heavy load). Both got them back only after their pods restarted. The leader, 
which never installs a snapshot, was unaffected. This silently blinds 
dashboards and alerts built on double-buffer flush time.

*Proposed fix:* make {{unRegister()}} reset the singleton, so the next 
{{create()}} registers a fresh source:
 
!http://localhost:63342/markdownPreview/651969378//Users/aieshin/git/ozone!
 
{{public static synchronized void unRegister() \{   // or keep it an instance 
method, but clear the static
  DefaultMetricsSystem.instance().unregisterSource(SOURCE_NAME);
  instance = null;
}}}

Alternatively, {{create()}} could re-register when {{instance != null}} but the 
source is missing from the metrics system.

*Test:* in {{{}TestOzoneManagerStateMachine{}}}, or via 
{{{}MiniOzoneHAClusterImpl{}}}, call {{pause()}} and then {{{}unpause(){}}}. 
Assert that 
{{DefaultMetricsSystem.instance().getSource("OzoneManagerDoubleBufferMetrics")}}
 is non-null, and that {{getTotalNumOfFlushOperations()}} increases after a 
further write. Possibly related: HDDS-16908 (intermittent failure in 
{{TestOzoneManagerDoubleBufferWithDummyResponse}} metrics assertions), since 
tests share the static singleton.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

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

Reply via email to