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 >>> >>> >