[ https://issues.apache.org/jira/browse/CASSANDRA-7392?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14738498#comment-14738498 ]
Stefania commented on CASSANDRA-7392: ------------------------------------- bq. I don't think the check is necessary, lazySet is sufficient Thanks, replaced. bq. Don't reset MonitorableThreadLocal, that requires retrieving the threadlocal, and then storing a value in the AR (which would be cheap if lazy set). Set the state associated with the task to "done" and let the monitoring thread ignore it. Ideally you only have to get the threadlocal once per request. Ok, I removed the reset. The monitoring thread is already checking only operations that are in progress. bq. When doing state transitions on the monitoring ref I don't think you need CAS. You can read and then lazySet and there is a small chance that the logging will think something was dropped when it wasn't. The primary functionality of shedding still works and that is always an approximation. Ok, but does a lazySet() really buy a lot compared to a CAS? I mean we are introducing a race, albeit with no consequences at the moment. bq. How does creating a monitoring state ref not stored anywhere work?. Is this for things that read, but aren't actually read operations? I looked up the call chain and that appears to be the case. Yes read commands are used internally to do things that are not read queries from users so I don't think we should abort these. Actually I changed the call chain for {{SinglePartitionReadCommand.queryMemtableAndDisk()}} so that we pass down the {{readOp}} in an otherwise empty {{executionController}}. bq. Can you make these properties? I would also say that 10 milliseconds is closer to more often (of course I am hand waving). If it's necessary to check that often for precision/timeliness then sure. Not sure what cross node timeouts are generally set at. It will probably be fine either way. Properties created. Should they be user visible in the yaml too? What about {{MessagingService.LOG_DROPPED_INTERVAL_IN_MS}}, should this be replaced with the property we just created or shall we leave it alone? Basically these are messages that weren't even processed, as opposite to started and then timed out. As for a default value for checking, the default read timeout is 5 seconds, so let's use 1% of this, 50 milli seconds? bq. So here is a pony. One thing I am leery of is overly chatty relative to its utility logging and rolling logs. Reporting on N different timed out queries every five seconds is going to be too much and cause log rolling pushing out other relevant statements. So the pony is to sort them by # of timeouts, only display N=5, and aggregate them all into a single log statement. If there are more than five, add an ellipsis indicating some were dropped, along with the #. Then add a property allowing the maximum number to be displayed to be configured so people can get all of them on the outside chance it is helpful. Done, we log only the top 5 operations with the highest number of timeouts, where 5 is a configurable property. For each operation we log the CQL string, how many times it timed out, the interval and the details of the first and last timeout. bq. The next pony is backoff. In a bad situation where we have elected to report the last time we ran, we should start reporting less frequently up to a point. This is functionality that can be factored out usefully IMO for other kinds of logging/reporting. And then people can have the option of turning backoff off if it's not what they want (or load the backoff strategy by reflection). But like I said, ponies. The important thing is to not spam the log, causing rolling, and obscure other log info. Something like {{NoSpanLogger}} except it needs to cache similar log messages rather than identical messages and it should be configurable? I have run out of time today so I haven't thought about this much so far. bq. MonitoringTask doesn't test the minor, but important case, if there are no failed operations does it refrain from logging? So < timeout, or abort() returns false. Done with abort returning false for all operations. bq. This kind of thing should have a Thread.yield() in it. We run several unit tests in parallel and if tests spin they can interfere with other tests. Same for similar loops. Done, thanks. bq. Reduce report delay millis for test? Wall clock time spent sleeping extends the total time that tests run. Or maybe just poke the task manually so that you don't have to wait at all? Reducing the timeout is problematic since it leads to false positives. If there is a way to get a free lunch with the test running faster it would be good. Done, we extract the failed operations directly now. I disabled reporting except for one test, just to exercise the code path. > Abort in-progress queries that time out > --------------------------------------- > > Key: CASSANDRA-7392 > URL: https://issues.apache.org/jira/browse/CASSANDRA-7392 > Project: Cassandra > Issue Type: New Feature > Components: Core > Reporter: Jonathan Ellis > Assignee: Stefania > Priority: Critical > Fix For: 3.x > > > Currently we drop queries that time out before we get to them (because node > is overloaded) but not queries that time out while being processed. > (Particularly common for index queries on data that shouldn't be indexed.) > Adding the latter and logging when we have to interrupt one gets us a poor > man's "slow query log" for free. -- This message was sent by Atlassian JIRA (v6.3.4#6332)