>
> I noticed in DatabaseDescriptor there are setters that are leaking it to
> JMX since cassandra-3.0. I am not sure whether we can just change it to
> IllegalArgumentException which will be then also thrown on startup where
> they were ConfigurationExceptions before


My concern here is maintenance, you can fix it once but it will break
again. I feel we need a more general solution, open to input here!

Looking into our own NodeTool we have two error codes - 1 that catches a
> few java and airlift exceptions and 2 for other errors. My guess is we aim
> to throw only exceptions that will lead to exit code 1, no? I am not sure.


Good point, nodetool is also a client to the JMX, but fully knows our API,
whatever solution we do we need to be careful with nodetool's assumptions.
Looking at org.apache.cassandra.tools.NodeTool#execute it doesn't look like
these errors are JMX related, but nodetool related (airlift is the CLI
parser used in nodetool); but IllegalArgumentException and
IllegalStateException could have been caused from a JMX call
(RuntimeException thrown from Cassandra would result in status = 2)

In many setters we were actually not doing the same checks we do on Startup
> too… I consider this being a bug.


Agree, if you can bypass our guards via JMX, that sounds like a bug to me


On Wed, Apr 6, 2022 at 8:50 AM Ekaterina Dimitrova <e.dimitr...@gmail.com>
wrote:

> I would say keep the old ones and add new ones to be compatible in
> addition.
> Now your catch led me to more thinking and I think throwing
> ConfigurationException deserves more attention. I noticed in
> DatabaseDescriptor there are setters that are leaking it to JMX since
> cassandra-3.0. I am not sure whether we can just change it to
> IllegalArgumentException which will be then also thrown on startup where
> they were ConfigurationExceptions before.
> Not sure what is the right course of action here to fix things without
> being considered breaking changes too as I see different people doing
> different things in our codebase.
> Looking into our own NodeTool we have two error codes - 1 that catches a
> few java and airlift exceptions and 2 for other errors. My guess is we aim
> to throw only exceptions that will lead to exit code 1, no? I am not sure.
> GetColumnIndexSize was added in trunk and I see it throws
> ConfigurationException, that was acknowledged in its test. Considering the
> setter was always doing it I guess this was just normal addition but It
> seems to me it is actually a bug… Now I can change it to throw
> IllegalArgumentException. Looking at the code I think different people
> probably have different understanding so I want to align us to ensure we
> don’t break tools by fixing or not stuff…
> In many setters we were actually not doing the same checks we do on
> Startup too… I consider this being a bug.
>
> On Tue, 5 Apr 2022 at 18:21, David Capwell <dcapw...@gmail.com> wrote:
>
>> There are 2 places that expose non-standard java classes, so JMX only
>> works if and only if the JMX client also has Cassandra's jars, else
>> they will fail; the 2 examples are
>>
>> org.apache.cassandra.service.StorageServiceMBean#enableAuditLog throws
>> org.apache.cassandra.exceptions.ConfigurationException, removing that
>> exception does not break binary compatibility, but does break source
>> as javac will say catching it isn't allowed as it doesn't throw.  If
>> you call the method without Cassandra jars the method will work
>> properly until a ConfigurationException is thrown, in which case a
>> ClassNotFoundException will be thrown, hiding the error message.
>>
>>
>> org.apache.cassandra.db.ColumnFamilyStoreMBean#forceCompactionForTokenRange
>> takes a collection of
>> org.apache.cassandra.dht.Range<org.apache.cassandra.dht.Token>, since
>> this is an operation the only people who could call it are those with
>> the jars in the path.
>>
>> Given that both are not properties and require setting values, jmx get
>> object does not break, so the impact is limited to the callers of each
>> method.
>>
>> We have a few options to address:
>>
>> 1) live with it.  Allow these cases to keep doing what they are doing,
>> but block new cases from popping up
>> 2) live with it, but expose new versions which do not break JMX
>> 3) remove ConfigurationException from
>> StorageServiceMBean#enableAuditLog and accept the source compatibility
>> issue
>> 4) remove or fix ColumnFamilyStoreMBean#forceCompactionForTokenRange
>> 5) #3 and #4
>>
>> What do others think?  In CASSANDRA-17527 I am adding a test to detect
>> these cases and block them, I am also fixing the JMX issues on trunk
>> that were not released, so this thread is only limited to the cases
>> that were actually released
>>
>> Thanks!
>>
>

Reply via email to