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