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

Sylvain Lebresne commented on CASSANDRA-2478:
---------------------------------------------

Let me try to clarify my position.

The current versioning is per-frame, so widening it would be a per-frame extra 
cost. Furthermore, I like that the header is just 8 bytes, because that's 1) 
small and 2) easy to decode (even for debuging with tcpdump or other).

And the idea of the current implementation was to say:
# there is just one version for the whole protocol.
# two different protocol versions are incompatible, period (though we should 
make the guarantee that a server is always able to understand at least the 
STARTUP message of every old versions to be able to return an error with what 
versions are supported).
# we will be nice and have server understand old protocol version for at least 
1 or 2 major C* version after we've changed them.

As far as I can tell, this does cover what we need, i.e. clients can always 
tell whether they can talk to a server or not and we have a clear compatibility 
story (not the same version == not compatible). I'll note that this is how we 
version our internal protocol (not trying to imply it's the exact same problem 
but ...).

That being said, I would agree there is at least 2 missing pieces in the 
implementation currently:
* The server should respond with an error to the STARTUP message if the version 
is not understood (with a list of supported version) which is not implementated 
yet.
* The OPTIONS/SUPPORTED pair of message could return the support protocol 
version too. But I plan to modify the SUPPORTED message in a separate ticket to 
make it more versatile anyway, so I'll do that then.

There is the argument that a 7 bits version number might not be enough. On 
that, my personal belief is that we don't have a choice: we have to make it 
enough if we want the protocol to be used. You can have a network protocol that 
change every two weeks. If it changes all the time, it's *not* a "protocol".  
And it happens that I think it's very possible to achieve a stable protocol, 
because imho there is not infinitely many things that the protocol can do 
(which again doesn't mean there isn't tons of stuff the current implementation 
doesn't handle correctl, but that's ok, it's *not* the final version and the 
goal *is* to add those missing stuff for the final version). This especially 
true imho because we have CQL. New queries capabalities will not imply a change 
in the protocol for instance. Typically, I don't know that libpq changes all 
the time or lacks hundreds of features.

bq. async messaging

I'm warming up to the idea of allowing async query handling too actually, 
especially because I think we can make it option for the client. But I'll open 
a separate ticket.

bq. challenge/response auth

As said above, I'm all for having SASL and I certainly intend to have that for 
version 1, I just prefer handling that in it's own ticket. Again, the committed 
version is not version 1.

Now, separating the versioning into a simple frame version and another 
per-connection message version is a possibily, but I'm afraid of the following 
downsides:
* It complicates things. You know have to care about case like the server 
handle the frame version but not the messaging one or the contrary. You also 
need to document the versions separatly, so you need a versionned document for 
the frame protocol and one for the message protocol. Again, feels like a single 
version where different version == incompatible is simpler.
* I really do believe that having the protocol stable (as in, one version per 
C* major version as a worst case) is not an option. Adding a more complex 
versioning doesn't convey that intention and will make it easier for us to make 
excuses to break the protocol often. I don't want that.
* I'm not sure the 3-part semantic versioning makes complete sense for a 
protocol.  A least the last part (the 'patch' version) does not make sense 
because this info will be carried by the C* version (you don't "patch" a 
protocol, you patch an implementation of that protocol). For the minor version, 
it's more debatable I suppose, but I would make the argument that it doesn't 
make sense either. Again because a protocol is different from it's 
implementation. Any change to a protocol will break either the server or the 
client so there isn't really minor changes. Again, on simple major version 
seems much simpler.

bq. (a) a signal to clients of compatibility

My argument below is that this signal exists since we do have a version

bq. (b) an acknowledgement of a possibly-remote chance of failure; a safety net

We have a safety net since we have a version. With the 'only major version' 
versioning I'm advocating, in the remote change we've fail at keeping things 
stable, one version purpose can be to introduce finer grained versioning. 
Introducing finer grained versioning right away is not a safety net, it's 
saying that you expect to fail.

                
> Custom CQL protocol/transport
> -----------------------------
>
>                 Key: CASSANDRA-2478
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-2478
>             Project: Cassandra
>          Issue Type: New Feature
>          Components: API, Core
>            Reporter: Eric Evans
>            Assignee: Sylvain Lebresne
>            Priority: Minor
>              Labels: cql
>             Fix For: 1.2
>
>         Attachments: cql_binary_protocol, cql_binary_protocol-v2
>
>
> A custom wire protocol would give us the flexibility to optimize for our 
> specific use-cases, and eliminate a troublesome dependency (I'm referring to 
> Thrift, but none of the others would be significantly better).  Additionally, 
> RPC is bad fit here, and we'd do better to move in the direction of something 
> that natively supports streaming.
> I don't think this is as daunting as it might seem initially.  Utilizing an 
> existing server framework like Netty, combined with some copy-and-paste of 
> bits from other FLOSS projects would probably get us 80% of the way there.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to