diff --git a/ccmlib/node.py b/ccmlib/node.py index e559cb9c..767db401 100644 --- a/ccmlib/node.py +++ b/ccmlib/node.py @@ -858,8 +858,17 @@ def nodetool(self, cmd, capture_output=True, wait=True, timeout=None, verbose=Tr if not isinstance(nodetool, list): nodetool = [nodetool] # see https://www.oracle.com/java/technologies/javase/8u331-relnotes.html#JDK-8278972 - nodetool.extend(['-h', host, '-p', str(self.jmx_port), '-Dcom.sun.jndi.rmiURLParsing=legacy']) - nodetool.extend(cmd.split()) + args = ['-h', host, '-p', str(self.jmx_port), '-Dcom.sun.jndi.rmiURLParsing=legacy'] + if len(nodetool) > 1: + nodetool.extend(cmd.split()) + # put args at the end of command line options, as "scylla nodetool" + # expects them as options of the subcommand + nodetool.extend(args) + else: + # while java-based tool considers them as options of the nodetool + # itself + nodetool.extend(args) + nodetool.extend(cmd.split()) return self._do_run_nodetool(nodetool, capture_output, wait, timeout, verbose) diff --git a/ccmlib/scylla_node.py b/ccmlib/scylla_node.py index d1bd6ad4..8bd2725e 100644 --- a/ccmlib/scylla_node.py +++ b/ccmlib/scylla_node.py @@ -776,16 +776,23 @@ def _update_jmx_pid(self, wait=True): self.jmx_pid = None def nodetool(self, cmd, capture_output=True, wait=True, timeout=None, verbose=True): - if not self.has_jmx: + try: + # nodetool subcommand was added in 5.5, so check if it is available + # before using it. + nodetool = [os.path.join(self.get_bin_dir(), "scylla"), "nodetool"] + subprocess.check_call(nodetool + ["help"], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) if self.is_docker(): host = 'localhost' else: host = self.address() - nodetool = [os.path.join(self.get_bin_dir(), "scylla"), "nodetool"] nodetool.extend(['-h', host, '-p', '10000']) nodetool.extend(cmd.split()) return self._do_run_nodetool(nodetool, capture_output, wait, timeout, verbose) + except subprocess.CalledProcessError: + pass + # the java nodetool depends on JMX + assert self.has_jmx # Fall-back to the java nodetool for pre 5.5.0~dev versions, which don't yet have the native nodetool # Kill scylla-jmx in case of timeout, to supply enough debugging information