Dian-Xuan Yang created HDDS-16218:
-------------------------------------

             Summary: Malformed log arguments in SCM HA hide the checkpoint 
transaction index, the reverted state index and the SCM id
                 Key: HDDS-16218
                 URL: https://issues.apache.org/jira/browse/HDDS-16218
             Project: Apache Ozone
          Issue Type: Bug
          Components: SCM HA
            Reporter: Dian-Xuan Yang
            Assignee: Dian-Xuan Yang


Four logging statements in {{hadoop-hdds/server-scm}} pass their arguments in a 
way SLF4J cannot render as
intended, so the values an operator needs are missing from the log exactly when 
something has failed.

1. {{SCMHAManagerImpl.installCheckpoint}} (SCMHAManagerImpl.java:323, from 
HDDS-6161):

{code:java}
LOG.error("Failed to install Snapshot as SCM failed to replace"
    + " DB with downloaded checkpoint. Checkpoint transaction {}", e,
    checkpointTxnInfo.getTransactionIndex());
{code}

SLF4J only promotes the *last* argument to a throwable. Here the last argument 
is a {{long}}, so the
exception is consumed by the single {{{}}} placeholder and printed where the 
transaction index belongs,
while the index itself is dropped. The line reads {{Checkpoint transaction 
java.io.IOException: <message>}}
and carries no stack trace of its own.

2. The revert path of the same method (SCMHAManagerImpl.java:344, from 
HDDS-6161):

{code:java}
LOG.error("Replacing SCM state with Term : {} and Index:",
    termIndex.getTerm(), termIndex.getTerm());
{code}

The message has no placeholder for the index and the term accessor is passed 
twice, so the index of the
state SCM fell back to is never recorded before {{exitManager.exitSystem(1, 
...)}} terminates the process.

3. and 4. {{SCMRatisServerImpl.addSCM}} and {{removeSCM}} 
(SCMRatisServerImpl.java:359 from HDDS-4718,
SCMRatisServerImpl.java:395 from HDDS-7853):

{code:java}
LOG.error("Failed to add new SCM: {}. Ratis reply: {}" +
    request.getScmId(), raftClientReply);
{code}

The SCM id is concatenated onto the format string with {{+}} instead of being 
passed as an argument, so the
Ratis reply lands in the slot meant for the id, the second {{{}}} is emitted 
literally, and the id trails
after the message: {{Failed to add new SCM: <reply>. Ratis reply: {}<scmId>}}.

h3. How to reproduce

* Site 1 is reached whenever {{HAUtils.replaceDBWithCheckpoint}} fails during a 
follower's Ratis
  install-snapshot — an ordinary IO error on the SCM metadata directory is 
enough.
* Sites 3 and 4 are reached whenever {{addSCM}}/{{removeSCM}} receives an 
unsuccessful Ratis reply, e.g.
  bootstrapping a new SCM into a ring that cannot reach quorum.

The rendering was confirmed against slf4j-api 2.0.18 + slf4j-reload4j 2.0.18 + 
reload4j 1.2.26, the binding
Ozone ships: for {{error("... transaction {}", exception, indexLong)}},
{{MessageFormatter.arrayFormat(...).getThrowable()}} returns {{null}}, the 
message inlines the exception's
{{toString()}} where the index should be, and the index appears nowhere in the 
output. With the arguments in
the intended order the index renders in the placeholder and the full stack 
trace is attached.

h3. Expected

Every message renders the value it advertises, and exceptions are passed in the 
trailing throwable position.
No behaviour change is involved — only the rendered log lines.




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