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

ASF GitHub Bot updated ZOOKEEPER-5013:
--------------------------------------
    Labels: pull-request-available  (was: )

> QuorumPeerTestBase.MainThread constructor chain does not initialize member 
> variables
> ------------------------------------------------------------------------------------
>
>                 Key: ZOOKEEPER-5013
>                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-5013
>             Project: ZooKeeper
>          Issue Type: Bug
>          Components: tests
>            Reporter: ConfX
>            Priority: Major
>              Labels: pull-request-available
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> The `QuorumPeerTestBase.MainThread` test utility class has inconsistent 
> constructor implementations. One constructor chain (lines 203-260) does not 
> initialize the `clientPort`, `myid`, `quorumCfgSection`, and `otherConfigs` 
> member variables, causing `getClientPort()` and `getMyid()` to return 
> incorrect default values (0).
> h3. Constructor at lines 116-161 - CORRECT
> This constructor properly initializes all member variables:
> {code:java}
> public MainThread(int myid, int clientPort, String quorumCfgSection,
>                   Map<String, String> otherConfigs, int tickTime) throws 
> IOException {
>     baseDir = ClientBase.createTmpDir();
>     this.myid = myid;
>     this.clientPort = clientPort;           // ✓ CORRECTLY INITIALIZED
>     this.quorumCfgSection = quorumCfgSection; // ✓ CORRECTLY INITIALIZED
>     this.otherConfigs = otherConfigs;        // ✓ CORRECTLY INITIALIZED
>     LOG.info("id = {} tmpDir = {} clientPort = {}", myid, baseDir, 
> clientPort);
>     confFile = new File(baseDir, "zoo.cfg");    
>     FileWriter fwriter = new FileWriter(confFile);
>     fwriter.write("tickTime=" + tickTime + "\n");
>     // ... writes config file ...
>     fwriter.write("clientPort=" + clientPort + "\n");
>     // ... rest of constructor ...
> } {code}
> h3. Constructor at lines 203-260 - BUGGY
> {code:java}
> public MainThread(int myid, int clientPort, int adminServerPort,
>                   Integer secureClientPort, String quorumCfgSection,
>                   String configs, String peerType,
>                   boolean writeDynamicConfigFile, String version) throws 
> IOException {
>     tmpDir = ClientBase.createTmpDir();
>     // ✗ MISSING: this.myid = myid;
>     // ✗ MISSING: this.clientPort = clientPort;
>     // ✗ MISSING: this.quorumCfgSection = quorumCfgSection;
>     // ✗ MISSING: this.otherConfigs = ...;    
>     LOG.info("id = {} tmpDir = {} clientPort = {} adminServerPort = {}",
>              myid, tmpDir, clientPort, adminServerPort);  // Logs it but 
> doesn't store!    
>     File dataDir = new File(tmpDir, "data");
>     // ... writes config file ...    
>     if (clientPort != UNSET_STATIC_CLIENTPORT) {
>         fwriter.write("clientPort=" + clientPort + "\n");  // Writes to file 
> but not to member!
>     }
>     // ... rest of constructor - member variables never assigned ...
> } {code}
> When tests use a constructor that eventually calls the buggy constructor 
> chain (lines 175 → 195 → 199 → 203), the following methods return incorrect 
> values:
>  - `getClientPort()` returns 0 instead of the actual port
>  - `getMyid()` returns 0 instead of the actual myid
>  - `getQuorumCfgSection()` returns null
>  - `getOtherConfigs()` returns null
> h2. Fix
> {code:java}
> public MainThread(int myid, int clientPort, int adminServerPort,
>                   Integer secureClientPort, String quorumCfgSection,
>                   String configs, String peerType,
>                   boolean writeDynamicConfigFile, String version) throws 
> IOException {
>     tmpDir = ClientBase.createTmpDir();    
>     // ADD THESE LINES:
>     this.myid = myid;
>     this.clientPort = clientPort;
>     this.quorumCfgSection = quorumCfgSection;
>     this.otherConfigs = null;  // This constructor doesn't have otherConfigs 
> parameter    
>     
>     LOG.info("id = {} tmpDir = {} clientPort = {} adminServerPort = {}",
>              myid, tmpDir, clientPort, adminServerPort);
>     // ... rest of constructor unchanged ...
> } {code}
> I'm happy to send a PR for this issue.



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

Reply via email to