[ 
https://issues.apache.org/jira/browse/CASSANDRA-7622?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15316875#comment-15316875
 ] 

 Brian Hess commented on CASSANDRA-7622:
----------------------------------------

It appears there are a few different things that could be accomplished with 
Virtual Tables, and I'm curious which one this ticket will focus on - and I'd 
suggest that we consider breaking out the full set of things below into 
separate tickets as I think some deserve more discussion/debate than others.
1. CQL access to internal metrics and management.  This would be access to 
metrics (such as JMX) and management settings (such as cassandra.yaml 
settings).  These could be covered by read-only access to built-in virtual 
tables (update/write access is below).
2. CQL access to updating management settings.  This is different than 
management actions (such as `nodetool flush` or repair).
3. CQL access to management actions.  This is the category of things such as 
`nodetool flush`, repair, drain, etc.
4. CQL access to arbitrary classes that implement user-defined behavior.

I think that 1 is the least controversial, and clearly of high value.  My 
suggestion is that this be built-in Virtual Tables, perhaps in system._vt_*.  
For example system._vt_metrics as SELECT access to the JMX metrics, or 
system._vt_settings as SELECT access to yaml/command-line/etc settings.  These 
would be predefined virtual tables.  I am concerned about how we will indicate 
how we specify which node's metrics we are querying, and how we route the query 
to that node (more on this below - it applies to all 4 (and more if we come up 
with more) scenarios).

I also think that 2 is not very controversial.  This would allow updating 
settings.  That could be, for example via a CQL UPDATE command (e.g., `UPDATE 
system._vt_settings SET max_hint_window_in_ms = 10800000 WHERE node='1.2.3.4'` 
- for illustrative purposes).  The reason why this is different than 3 is that 
after doing the update, a read will return the same value, since it was 
changed.  Would we want to support `UPDATE system._vt_settings SET 
max_hint_window_in_ms = 10800000` and update all nodes, which is not valid CQL 
since we don't specify a partition key?  

I'm not sure about 3, and I think it should be discussed further.  The thing is 
that something like `ALTER system_virtual.actions SET drain=true` or really 
`UPDATE system_virtual.actions SET drain=true` what would the value be if we 
SELECT it after the ALTER/UPDATE?  It feels like it would be set back to FALSE 
after the drain, which semantically feels strange.  I like [~snazy]'s 
suggestion of completely separate CQL syntax for these actions.  Maybe 
something like `EXECUTE ACTION drain ON '1.2.3.4'` - again, syntax just for 
illustrative purposes.  The semantics here is that the system is being altered, 
but outside a table, so a SELECT doesn't have the confusion as above.  As 
[~snazy] pointed out, we would also need to make sure we are careful about 
access to this capability (perhaps user/role permissions is sufficient, and we 
just need to add new permission types).

4 is probably the one that causes the most pause, IMO, as there would be 
arbitrary user code running in the read and write path.  We need to take care 
with that - as we have with UDFs.  It isn't exactly clear to me what the goal 
is for arbitrary virtual tables.  What are we trying to accomplish with this 
extension point?

As I mentioned above, I'm curious how we will route the query (SELECT, UPDATE, 
EXECUTE, whatever) to the right node.  In the simple case of SELECT of JMX 
metrics, how would we query the JMX metrics of node 1.2.3.4?  These 
queries/operations are per-node, not cluster-wide, so we need to think about 
that.  Is that the partition key of the virtual table (`.... PARTITION BY 
((node), ...)`)?  How would we route that internally in CQL (and with awareness 
on the driver)?  

It sounds like it would require a special partitioner (like system tables have 
- or maybe ByteOrderedPartitioner could work with a customer replication 
strategy, but with Murmur3Partitioner things are hard (it's essentially hash 
inversion)) and possibly replication strategy (I don't think that a replication 
strategy alone would cover this, right [~jjordan]).  If these are fully 
user-defined (as [~jjirsa] suggests), then we need to have a way to specify 
partitioners at the table (or at least keyspace) level, as opposed to cluster 
wide (which would actually be a nice change, IMO).  If they are built-in, then 
we can cover this case like we do with system keyspace tables.

Another approach may be to have the drivers deal with the routing.  The Virtual 
Tables could be special cases for routing purposes and have an API call to 
specify which node to query - or the LoadBalancingPolicy could inspect the 
Statement and route appropriately, which could work for any/all partitioners 
and/or replication strategies.  If it is a LoadBalancingPolicy, then what 
happens if we use the "wrong" one (not the VirtualTableLoadBalancingPolicy, 
say) for a Virtual Table query - I guess a new Error type.


> Implement virtual tables
> ------------------------
>
>                 Key: CASSANDRA-7622
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-7622
>             Project: Cassandra
>          Issue Type: Improvement
>            Reporter: Tupshin Harper
>            Assignee: Jeff Jirsa
>             Fix For: 3.x
>
>
> There are a variety of reasons to want virtual tables, which would be any 
> table that would be backed by an API, rather than data explicitly managed and 
> stored as sstables.
> One possible use case would be to expose JMX data through CQL as a 
> resurrection of CASSANDRA-3527.
> Another is a more general framework to implement the ability to expose yaml 
> configuration information. So it would be an alternate approach to 
> CASSANDRA-7370.
> A possible implementation would be in terms of CASSANDRA-7443, but I am not 
> presupposing.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to