[ 
https://issues.apache.org/jira/browse/HDDS-17038?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Aleksei Ieshin updated HDDS-17038:
----------------------------------
    Description: 
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! 
{code:java}
public static synchronized OzoneManagerDoubleBufferMetrics create() {
  if (instance != null) {
    return instance;      // still the old object, whose source was 
unregistered in step 1
  } ... {code}

{{`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:
 
{code:java}
public static synchronized void unRegister() {   // or keep it an instance 
method, but clear the static
  DefaultMetricsSystem.instance().unregisterSource(SOURCE_NAME);
  instance = null;
} {code}
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.

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


> 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.0.0, 2.2.0, 2.2.1
>            Reporter: Aleksei Ieshin
>            Priority: Minor
>
> 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! 
> {code:java}
> public static synchronized OzoneManagerDoubleBufferMetrics create() {
>   if (instance != null) {
>     return instance;      // still the old object, whose source was 
> unregistered in step 1
>   } ... {code}
> {{`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:
>  
> {code:java}
> public static synchronized void unRegister() {   // or keep it an instance 
> method, but clear the static
>   DefaultMetricsSystem.instance().unregisterSource(SOURCE_NAME);
>   instance = null;
> } {code}
> 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