Print

Print


Hi Fabrizio,

Actually, we have a couple of problems with redefining the "prqlen" field. 
The main one is forwarde/backward compatability. 1) Old servers must work 
with new clients and old clients must work with new servers. Therefore, the 
trailing field *must* stay as 32 bits. That means subdividing it. The best 
way is 8-8-16 as I indicated. Additionally, 2) Leandro has already worked up 
that particular change with his implementation of vectored reads. So, I 
strongly insist that the field be subdivided as 8-8-16.

Andy

----- Original Message ----- 
From: "Fabrizio Furano" <[log in to unmask]>
To: "Andrew Hanushevsky" <[log in to unmask]>
Cc: "Xrootd Mailing List" <[log in to unmask]>; "Peter Elmer" 
<[log in to unmask]>
Sent: Wednesday, June 28, 2006 1:54 AM
Subject: Re: kxr_bind again


> Hi Andy!
>
>  I am very advanced in the first impl of the multistream client. I want 
> only to summarize here the version of the bind/read req I am expecting:
>
> kxr_bind:
>
>    Request                         Normal Response
>
>    kXR_char  streamid[2]          kXR_char  streamid[2]
>    kXR_unt16 kXR_bind             kXR_unt16 0
>    kXR_char  sessid[16]           kXR_int32 2
>    kXR_int32 0                    kXR_unt16 substreamid
>
>
> kxr_read:
>
>  honestly I don't realize if the structs you specified can generate 
> misalignments in certain architectures. Also, I don't see the point in 
> sparing 1 byte for such a relatively long request. I'd be more generous 
> for the flags/path/prglen fields, just to keep consistent with all the 
> other requests, which have a 32bit dlen field as last field in the req 
> header. I'd keep that also to maintain a little more protocol 
> backcompatibility. Anyway, here it is my version:
>
>    Request                         Normal Response
>
>   kXR_char  streamid[2]          kXR_char  streamid[2]
>   kXR_unt16 kXR_read             kXR_unt16 status
>   kXR_char  fhandle[4]           kXR_int32 dlen
>
>   kXR_int64 roffset              kXR_char  data[dlen]
>   kXR_int32 rlen
>   kXR_int32 dlen
>
>
>   kXR_unt32 flags
>   kXR_unt32 path
>   struct    prqlist[prqlen]
>
>   struct prqlist {
>     kXR_char   prhandle[4];
>     kXR_int32  prlen;
>     kXR_int64  proffset;
>   };
>
>
> Where prqlen is the number of pre-read reqs. Hence the relationship:
>
> dlen = prqlen*sizeof(prqlist) + 2*sizeof(kXR_unt32)
>
> NOTE:
>  - path = 0 means that the respone has to be sent through the main login 
> stream
>  - the value of path also denotes the substream where to send the data 
> chunk requested in the req header
>  - the client does not care about the substream which will carry the 
> response to a read request. So the server is allowed not to honor the path 
> field for any reason. The idea behind is that a bunch of substreams is 
> considered internally as one mega-stream with individually selectable 
> substreams.
>  - I don't have any idea about the flags which we need. From my point of 
> view we can also consider to drop that field.
>
>
>
> NOTE2:
>
>  Today/tomorrow I will commit my code, which seems to start working. For 
> now it does not deal with the kxr_read modifications. It includes the 
> mods/additions to XProtocol.hh, so, if you have any change for that, 
> please wait a bit until I commit, and then change that version, just to 
> avoid confusion... Here is some more info:
>
>  - if the multistream support is disabled, then the old sock code is used. 
> The multistream support is implemented at low level in a subclass of 
> XrdClientSock.
>  - I did a test with multistream on but with only one stream and it seems 
> to work OK. More news to come.
>  - well, I cannot bind any test substream because there is no kxr_bind 
> yet... so anything can happen when you implement it and try to run the 
> advanced client... :-)
>
>
> What do you think?
> Bye!
>
> Fabrizio
>
>
>
>
>
> Andrew Hanushevsky wrote:
>> Hi Fabrizio,
>>
>> A quick response as I am on vacation right now. I was planning for the
>> server to return the substream ID and it will be an integer from 1 to n.
>> As for directing responses to a particular stream. Recall that all
>> requests go on the original login stream. The client directs which stream
>> is to be used for the response. Recall that we were going to modify the
>> read and write requests so that the stream ID could be inserted. This is
>> also compatible with vectored reads that Renee wants. The change is:
>>
>>> kXR_int32 prqlen
>>>
>>> to
>>>
>>> kXR_char  flags
>>> kXR_char  path
>>> kXR_unt16 prqlen
>>
>> in the read request and similarly for the right request (there is a 4 
>> byte
>> reserved field there). Note that "path" is the substream ID and it is a
>> character field as the stream id will be 1 to 255 (actually much 
>> smaller).
>> You may want to reflect that in the bind response.
>>
>> Notice that only read/write is multi-stream capable. All other requests
>> are always done on the login stream. It simplifies things very much.
>>
>> Andy
>>
>> On Wed, 21 Jun 2006, Fabrizio Furano wrote:
>>
>>> Hi Andy,
>>>
>>>   I am working on the multistream support, and I choosed the second way
>>> I commented in the previous message. The server has to generate an
>>> integer which will identify univoquely that substream in the pool which
>>> belongs to a session. I recall to you that part of the prev message.
>>>
>>>   The client does not expect a praticular way to generate that number.
>>> Even random is good, so you can do what you prefer. The client also will
>>> not care about the (sub)stream it will get a response from. The only
>>> important thing is that all the msgs belonging to a particular request
>>> (e.g. kxr_oksofar+kxr_ok) all go through the same substream. No matter
>>> which. Otherwise it's impossible to keep the ordering.
>>>
>>>   So, if you want, a first server side version could also randomize the
>>> choice of the response socket. this would be fine, since at the moment
>>> the protocol has no way of requesting the server to send a response
>>> through a particular substream.
>>>
>>>   Right now I only wrote the low level support for the multistream
>>> xfers, but I believe that also the client will randomize the choice of
>>> the substream where to send requests to. We'll see.
>>>
>>> Fabrizio
>>>
>>>
>>>
>>> -------- Original Message --------
>>> Subject: kxr_bind
>>> Date: Thu, 15 Jun 2006 11:25:52 +0200
>>> From: Fabrizio Furano <[log in to unmask]>
>>> To: Andrew Hanushevsky <[log in to unmask]>
>>>
>>> Hi Andy,
>>>
>>>   following our recent discussions on the multistream xfer, I propose
>>> this change in the kxr_bind spec:
>>>
>>>   Request                         Normal Response
>>>
>>>   kXR_char  streamid[2]          kXR_char  streamid[2]
>>>   kXR_unt16 kXR_bind             kXR_unt16 substreamid
>>>   kXR_char  sessid[16]           kXR_int32 0
>>>   kXR_int32 0
>>>
>>>
>