Hi,
> > When I implemented a similar protocol I kept
> > the response code.
>
> I suppose you mean that you kept the opt code?
Actually I went as far as to have different codes for a
the request and response pairs of messages. It made debugging
easier as well :)
I suppose the debugging is made particularly easier in those L1 servers
where on one hand they're receiving requests from clients, and in the
other they're also receiving responses from servers.
> Why would you want the error to be parsed by a different decoder?
The error responses are fundamentally different from a normal response,
and contain the reason for the error. Generally, they contain the error
message and the stack trace rendered to text.
The get on the response future returns a response object, and the
client can use instanceof to see exactly what type of response was
returned. Most of the time this is done within the framework.
Ok, so the error op code is also due to a decoder selection decision.
Having had a day to think about this, I think I'll go with your approach
since the impact to the response header is minimal.
> > I haven't thought too deeply on the client implementation itself...
Luckily, you have the advantage of having someone who has walked through
this process, more than once. :)
> p.s. Thanks for the feedback :)
you're welcome.
--- On Mon, 1/4/10, Galder Zamarreno<galder(a)redhat.com> wrote:
> From: Galder Zamarreno<galder(a)redhat.com>
> Subject: Re: [infinispan-dev] Hot Rod - pt2
> To: infinispan-dev(a)lists.jboss.org
> Date: Monday, January 4, 2010, 5:25 AM
>
>
> On 12/29/2009 07:35 PM, Alex Kluge wrote:
>>> Why do you have OpCode in your
>>> response header? Surely this is
> redundant? If
>>> the client is sync, it knows what it sent.
> If it is
>>> async, it has a message ID.
>>>>>>> True, I fixed that.
>>
>> I don't think it's a significant
> issue, and it is sort of redundant
>> in this case because you have the status response,
> however, it isn't
>> completely clear cut. When I implemented a similar
> protocol I kept
>> the response code.
>
> I suppose you mean that you kept the opt code?
>
>> It simplifies what you need to track within a
>> request/response cycle, and allows for easy
> extensibility. For
>> example, on error I return a different response type
> (a different
>> op code) which causes the response to be parsed by a
> different
>> message decoder.
>
> Why would you want the error to be parsed by a different
> decoder?
>
>>
>> I also made it easy to register custom requests and
> responses, and this
>> is facilitated by having distinct op codes for each.
>
> True. If you have a custom op in a custom request and
> response, this can
> be handled by a custom message decoder, assuming that the
> granularity of
> the message decoder would be based on the op code. This
> would indeed
> make it easier for the protocol to be extended.
>
> I haven't thought too deeply on the client implementation
> itself, so
> this will be clearer once I get around to doing that. For
> the time
> being, I'll leave it as it is and will revisit this
> decision at that point.
>
>>
>>
>
>
> Alex
>>
>>
>> --- On Wed, 12/16/09, Galder Zamarreno<galder(a)redhat.com>
> wrote:
>>
>>> From: Galder Zamarreno<galder(a)redhat.com>
>>> Subject: Re: [infinispan-dev] Hot Rod - pt2
>>> To: infinispan-dev(a)lists.jboss.org
>>> Date: Wednesday, December 16, 2009, 8:16 AM
>>>
>>>
>>> On 12/16/2009 02:53 PM, Manik Surtani wrote:
>>>>
>>>> On 16 Dec 2009, at 13:38, Galder Zamarreno
> wrote:
>>>>
>>>>>
>>>>>
>>>>> On 12/16/2009 12:14 PM, Manik Surtani
> wrote:
>>>>>>
>>>>>> On 16 Dec 2009, at 09:26, Galder
> Zamarreno
>>> wrote:
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On 12/15/2009 01:13 PM, Manik
> Surtani
>>> wrote:
>>>>>>>> A few comments:
>>>>>>>>
>>>>>>>> - Why do you have OpCode in
> your
>>> response header? Surely this is
> redundant? If
>>> the client is sync, it knows what it sent.
> If it is
>>> async, it has a message ID.
>>>>>>>
>>>>>>> True, I fixed that.
>>>>>>>
>>>>>>>> - 'Not So Dumb' and 'Clever'
> response
>>> headers should be optional? Surely this
> stuff is only
>>> sent when there is a topology change? We
> also may need
>>> some extra info here - how does the back-end know
> to send
>>> this info? If a client hits different
> back-end nodes,
>>> and there is a topology change, how does Node A
> decide that
>>> it should not bother with topology info since the
> client
>>> already hit Node B after the topo change and has
> the new
>>> topology map? Perhaps a TopologyVersion (==
> JGroups
>>> View ID) should be sent back with any topo map,
> and the
>>> client would send it's current TopologyVersion
> with every
>>> request (non-dumb clients only)? Could be a
> vlong...
>>>>>>>
>>>>>>> Yeah, as you and Mircea suggest,
> clients
>>> sending the view id could help
>>>>>>> better manage size of responses.
>>>>>>>
>>>>>>> Something to note here is that not
> all
>>> cluster view changes necessarily
>>>>>>> involve a client side topology
> view
>>> change, cos if you have N infinispan
>>>>>>> nodes in the cluster, you could
> have M
>>> running hot rod server where M<=
>>>>>>> N. So, Hot rod will need to figure
> out
>>> when there's been a view change
>>>>>>> in the cluster that involves the
> addition
>>> or removal of a hot rod
>>>>>>> running Infinispan instance
> (similar thing
>>> to what happens when a
>>>>>>> clustered EJB is deployed, the
> target list
>>> for that clustered EJB gets
>>>>>>> updated).
>>>>>>
>>>>>> Yes.
>>>>>>
>>>>>>> So, bearing in mind this, could we
> just
>>> use the JGroups view id for
>>>>>>> this? AFAIK, it's 0 based long
> but
>>> shouldn't cause problems with
>>>>>>> complete cluster restarts. If the
> whole
>>> cluster gets restarted, existing
>>>>>>> connections will be closed and at
> that
>>> point, clients could revert back
>>>>>>> to trying to connect one of their
> known
>>> hot rod servers and pass -1 as
>>>>>>> view id which means that I have no
> view,
>>> so the responding server would
>>>>>>> send back the hot rod cluster
> view.
>>>>>>
>>>>>> Provided the client knows the servers
> have all
>>> been restarted.
>>>>>>
>>>>>> I think a better approach is that the
> client
>>> sends its last known topology version
> (vClient). The
>>> server node it connects to compares vClient with
> vServer
>>> (the version that the servers are aware of).
> if
>>> vClient != vServer then resend topology map.
>>>>>
>>>>> I added that already this morning to the
> request
>>> header :)
>>>>>
http://community.jboss.org/wiki/HotRodProtocol
>>>>>
>>>>> Not-so-dumb and clever clients send their
> latest
>>> viewId to the server
>>>>> and the server compares would compare it
> and if
>>> different, send the new
>>>>> topology.
>>>>>
>>>>> Note that in the response, I had added a
> "View
>>> change marker" field so
>>>>> that the client knows whether a view
> change
>>> follows or not. The reason I
>>>>> had done this is because I didn't think
> the client
>>> could simply compare
>>>>> the vServer with the vClient and decide
> whether
>>> more needs to be read or
>>>>> not.
>>>>
>>>> No, the server decides whether the Topo map is
> out of
>>> date. If so, it sends a new one. The
> client just
>>> applies the new one if a new one is sent.
>>>
>>> Indeed, but this was about the client knowing that
> a new
>>> topo has been
>>> sent to it. I mean, how does the client know that
> server
>>> has actually
>>> sent back a new topology? I was using that field
> to
>>> indicate to the
>>> client: "hey, a new view follows the head after
> this field
>>> read". I can
>>> then read the vServer sent...etc.
>>>
>>>>
>>>>> You could have an scenario where a client
> starts
>>> up and sends 3 request
>>>>> in pararell, all with vClient=-1 because
> no
>>> replies have been received
>>>>> from hot rod server. When the server
> replied to
>>> those 3 req, it would
>>>>> have sent for example, vServer=4. The
> first
>>> response to be processed
>>>>> would have update the local vClient to 4,
> but the
>>> other two responses
>>>>> would still contain the vServer=4. So,
> they would
>>> somehow need to read,
>>>>> or discard the response.
>>>>>
>>>>> And after writing this and thinking it
> again, the
>>> "View change marker"
>>>>> is not be necessary. If vClient and
> vServer are
>>> equals, the client knows
>>>>> the total length of the body so it can
> read it and
>>> discard it directly.
>>>
>>> Hmmmm, but thinking through this again, the total
> body
>>> includes other
>>> stuff. So I do need that marker unless the header
> comes
>>> with a total
>>> number of bytes in header, in which case yeah, I
> can
>>> discard the
>>> remaining bytes from the header and ignore the
> topology
>>> information cos
>>> I have already applied it.
>>>
>>>>>
>>>>>>
>>>>>>> I'll add this to the wiki.
>>>>>>>
>>>>>>>>
>>>>>>>> Cheers
>>>>>>>> Manik
>>>>>>>>
>>>>>>>>
>>>>>>>> On 14 Dec 2009, at 20:08,
> Galder
>>> Zamarreno wrote:
>>>>>>>>
>>>>>>>>> Hi all,
>>>>>>>>>
>>>>>>>>> Re:
http://community.jboss.org/wiki/HotRodProtocol
>>>>>>>>>
>>>>>>>>> I've updated the wiki with
> the
>>> following stuff:
>>>>>>>>> - Renamed replaceIfEquals
> to
>>> replaceIfUnmodified
>>>>>>>>> - Added remove and
>>> removeIfUnmodified.
>>>>>>>>> - Added containsKey
> command.
>>>>>>>>> - Added getWithCas command
> so that
>>> cas value can be returned. I decided
>>>>>>>>> for a separate command
> rather than
>>> adding cas to get return because you
>>>>>>>>> don't always want cas to
> be
>>> returned. Having a separate command makes
>>>>>>>>> better use of network
> bandwith.
>>>>>>>>> - Added stats command.
> JMX
>>> attributes are basically accessible through
>>>>>>>>> this, including cache
> size.
>>>>>>>>> - Added error handling
> section and
>>> updated status codes.
>>>>>>>>>
>>>>>>>>> Note that Mircea added
> some
>>> interesting comments and I replied to them
>>>>>>>>> directly in the wiki.
>>>>>>>>>
>>>>>>>>> Still remaining to add:
>>>>>>>>> - Commands:
> putForExternalRead
>>> evict, clear, version, name and quite
>>>>>>>>> commands.
>>>>>>>>> - Passing flags.
>>>>>>>>>
>>>>>>>>> Regards,
>>>>>>>>>
>>>>>>>>> p.s. Updating this has
> been quite
>>> a struggle due to F12 + FF 3.5.5
>>>>>>>>> crashing at least 5 times,
> plus
>>> parts of the wiki dissapearing after
>>>>>>>>> publishing them!
>>>>>>>>> --
>>>>>>>>> Galder Zamarreño
>>>>>>>>> Sr. Software Engineer
>>>>>>>>> Infinispan, JBoss Cache
>>>>>>>>>
>>> _______________________________________________
>>>>>>>>> infinispan-dev mailing
> list
>>>>>>>>> infinispan-dev(a)lists.jboss.org
>>>>>>>>>
https://lists.jboss.org/mailman/listinfo/infinispan-dev
>>>>>>>>
>>>>>>>> --
>>>>>>>> Manik Surtani
>>>>>>>> manik(a)jboss.org
>>>>>>>> Lead, Infinispan
>>>>>>>> Lead, JBoss Cache
>>>>>>>>
http://www.infinispan.org
>>>>>>>>
http://www.jbosscache.org
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>> _______________________________________________
>>>>>>>> infinispan-dev mailing list
>>>>>>>> infinispan-dev(a)lists.jboss.org
>>>>>>>>
https://lists.jboss.org/mailman/listinfo/infinispan-dev
>>>>>>>
>>>>>>> --
>>>>>>> Galder Zamarreño
>>>>>>> Sr. Software Engineer
>>>>>>> Infinispan, JBoss Cache
>>>>>>>
>>> _______________________________________________
>>>>>>> infinispan-dev mailing list
>>>>>>> infinispan-dev(a)lists.jboss.org
>>>>>>>
https://lists.jboss.org/mailman/listinfo/infinispan-dev
>>>>>>
>>>>>> --
>>>>>> Manik Surtani
>>>>>> manik(a)jboss.org
>>>>>> Lead, Infinispan
>>>>>> Lead, JBoss Cache
>>>>>>
http://www.infinispan.org
>>>>>>
http://www.jbosscache.org
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>> _______________________________________________
>>>>>> infinispan-dev mailing list
>>>>>> infinispan-dev(a)lists.jboss.org
>>>>>>
https://lists.jboss.org/mailman/listinfo/infinispan-dev
>>>>>
>>>>> --
>>>>> Galder Zamarreño
>>>>> Sr. Software Engineer
>>>>> Infinispan, JBoss Cache
>>>>>
> _______________________________________________
>>>>> infinispan-dev mailing list
>>>>> infinispan-dev(a)lists.jboss.org
>>>>>
https://lists.jboss.org/mailman/listinfo/infinispan-dev
>>>>
>>>> --
>>>> Manik Surtani
>>>> manik(a)jboss.org
>>>> Lead, Infinispan
>>>> Lead, JBoss Cache
>>>>
http://www.infinispan.org
>>>>
http://www.jbosscache.org
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
> _______________________________________________
>>>> infinispan-dev mailing list
>>>> infinispan-dev(a)lists.jboss.org
>>>>
https://lists.jboss.org/mailman/listinfo/infinispan-dev
>>>
>>> --
>>> Galder Zamarreño
>>> Sr. Software Engineer
>>> Infinispan, JBoss Cache
>>> _______________________________________________
>>> infinispan-dev mailing list
>>> infinispan-dev(a)lists.jboss.org
>>>
https://lists.jboss.org/mailman/listinfo/infinispan-dev
>>>
>>
>>
>>
>>
>> _______________________________________________
>> infinispan-dev mailing list
>> infinispan-dev(a)lists.jboss.org
>>
https://lists.jboss.org/mailman/listinfo/infinispan-dev
>
> --
> Galder Zamarreño
> Sr. Software Engineer
> Infinispan, JBoss Cache
> _______________________________________________
> infinispan-dev mailing list
> infinispan-dev(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/infinispan-dev
>
_______________________________________________
infinispan-dev mailing list
infinispan-dev(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/infinispan-dev
--
Galder Zamarreño
Sr. Software Engineer
Infinispan, JBoss Cache