Priyesh K created HDDS-15783:
--------------------------------

             Summary: ScmListCodec fails to deserialize empty lists from Ratis 
log due to java.lang.Object element type regression
                 Key: HDDS-15783
                 URL: https://issues.apache.org/jira/browse/HDDS-15783
             Project: Apache Ozone
          Issue Type: Bug
          Components: SCM, SCM HA
            Reporter: Priyesh K
            Assignee: Priyesh K


During an SCM HA cluster upgrade, SCM fails while replaying the Ratis log with 
the following error:
{code:java}
2026-07-05 10:00:12,699 ERROR 
[36209121-a632-4067-a36d-a6e0194cd83e@group-65230FEE3C3A-StateMachineUpdater]-org.apache.ratis.statemachine.StateMachine:
 Terminating with exit status 1: Failed to resolve 
java.lang.Objectorg.apache.ratis.thirdparty.com.google.protobuf.InvalidProtocolBufferException:
 Failed to resolve java.lang.Object    at 
org.apache.hadoop.hdds.scm.ha.io.ScmCodecFactory$ClassResolver.get(ScmCodecFactory.java:177)
 at 
org.apache.hadoop.hdds.scm.ha.io.ScmCodecFactory$ClassResolver.get(ScmCodecFactory.java:147)
 at 
org.apache.hadoop.hdds.scm.ha.io.ScmListCodec.deserialize(ScmListCodec.java:72) 
     at 
org.apache.hadoop.hdds.scm.ha.SCMRatisRequest.decode(SCMRatisRequest.java:154)  
     at 
org.apache.hadoop.hdds.scm.ha.SCMStateMachine.applyTransaction(SCMStateMachine.java:146)
     at 
org.apache.ratis.server.impl.RaftServerImpl.applyLogToStateMachine(RaftServerImpl.java:1888)
 at 
org.apache.ratis.server.impl.StateMachineUpdater.applyLog(StateMachineUpdater.java:255)
      at 
org.apache.ratis.server.impl.StateMachineUpdater.run(StateMachineUpdater.java:194)
   at java.base/java.lang.Thread.run(Thread.java:833)2026-07-05 10:00:12,702 
INFO 
[shutdown-hook-0]-org.apache.hadoop.hdds.scm.server.StorageContainerManagerStarter:
 SHUTDOWN_MSG:  {code}
*Root cause*
An empty List/ArrayList was written into the SCM Ratis log, and the new 
ScmListCodec cannot deserialize it.On serialize, empty lists are stored with 
element type java.lang.Object. On deserialize, the codec always tries to 
resolve that type and get an element codec — even when there are zero 
elements.This is a regression from the reflection-based codec refactor 
([HDDS-14740 |https://issues.apache.org/jira/browse/HDDS-14740 ]/ [HDDS-14846|

https://issues.apache.org/jira/browse/HDDS-14846

]). The old ListCodec had the same Object.class sentinel on serialize, but on 
deserialize it only loaded the element codec inside the value loop



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