SORT BY:

LIST ORDER
THREAD
AUTHOR
SUBJECT


SEARCH

IPS HOME


    [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

    Re: iSCSI:Can each do there own thing?



    Let me try to analyze how I understand the possibilities.
    Please note that I have included what I consider a compromise.
    So, please read on.
    
    Currently (12-94) there is no text explaining when a key=value pair is 
    considered "sent". Thus, a side may consider it sent when it has sent 
    the first byte of the key. The other side need not consider such a key
    received (it only has the first byte) and may also send it. Both sides
    feel like originators. Furthermore, each side has to be ready to receive
    new key=value pairs after each PDU sent, so preparing more key=value
    pairs than fit in one PDU is impractical. This prohibits the "batch-
    processing" of keys, defined below.
    
    One of the new proposals, we'll call it "no-origination on split-key scheme"
    is such: we mandate that if one side receives a PDU ending with a 
    "partial key" (start of key, but no '=') (note that this is not the same as
    "partial key=value pair", which is defined by lack of terminating '\0'),
    then it may not originate any new keys, but may send responses to the
    keys (not necesarily key=value pairs) that it has received fully. 
    
    There is a possible "twist" on this scheme, where it is also allowed to
    originate new keys that are declarations.
    
    The competing proposal, we'll call it "empty PDUs until end-of-data scheme"
    is such: we mandate that until a node has seen the (new, to be added to
    header) "data-end flag" from the other side (which signals that the
    whole batch of key=value pairs that the other side wanted to negotiate
    at the moment has been received), it MUST send only empty PDU-s (ones
    with nothing in the DataSegment).
    
    This proposal enables the "batch-processing" of keys, defined about
    as follows:
    
        Prepare all key=value pairs you'd like to send;
        Send them with the peace of mind knowing that no text
        will come back until you've finished sending them completely;
        Receive all key=value pairs that the other side would like
        you to process together (sending only empty PDUs back meanwhile);
        Process all the received data.
        Repeat if necessary.
    
    Note that the negotiation logic is PDU boundary agnostic, it is
    only the sending layer that does something like that:
    
        if (have leftover) prepend leftover to current data
        chop off as much as fits in one PDU from the current data
        send the part just chopped off
        save the remainder in leftover
    
    This, IMHO, is as simple as it gets. However, we ideally need a new
    flag. While having the flag would be the cleanest, there is a way
    to get by without it as follows (we'll call this "empty PDU on split-pair
    scheme"): we mandate that if one side receives a PDU ending with a
    partial key=value pair (i.e., not having '\0' at the end), it MUST
    send an empty PDU. Thus, the presence or absence of the '\0' at the
    end of the last key=value pair works as the "end-of-data" flag.
    
    The batch-processing of keys approach works here as well, however, the 
    sending layer needs to do a little more trickery. Namely, if there is more
    data remaining to be sent in the subsequent PDUs, it must make sure
    that the current PDU does NOT end in a '\0'. It needs to chop off
    the '\0' if necessary and leave that for later as well. Padding makes
    the task a tad more complicated, i.e., it may have to chop off (from
    the tail end) some more bytes to have the PDU-end be properly aligned
    and have no '\0' at the end, but it is possible.
    
    The batch-processing approach does not work with the "no-origination
    on split-key scheme", with the twist or without. If the last key and
    '=' has fully fit in the PDU, the other side may start originating
    keys, affecting what our side may have wanted to originate itself.
    It isn't necessarily possible to force a key-split in the sending
    layer, because the keys are of relatively short length, and in fact
    (the remaining) data may consist of value alone. Thus, the sending
    layer modification described in "empty PDUs on split-pair scheme"
    does not work here. 
    
    However, and here I come to the possibility of a compromise---we
    can modify the "no-origination on split-key scheme" into a 
    "no-originatio on split-pair scheme" as follows: 
    we mandate that if one side receives a PDU ending with a 
    "partial key=value pair" (no '\0' at the end)
    then it may not originate any new keys, but may send responses to the
    key=value pairs that it has received fully. Again, the twist allowing
    to originate declarations is possible and functionally harmless.
    
    If this were the case, then the following modified batch-processing
    of keys approach would work:
    
        Prepare all key=value pairs you'd like to send;
        Send them with the peace of mind knowing that no keys
        (with the possible exception of harmless declarations)
        will be originated by the other side 
        until you've finished sending them completely;
        Meanwhile keep concatenating and buffering whatever the
        other side is sending back, but don't process yet.
        Receive any more data that the other side would like
        you to process at this point (sending only empty PDUs back meanwhile);
        Process all the received data.
        Repeat if necessary.
    
    The sending layer needs the modification where it ensures that if
    all data didn't fit, then the current PDU doesn't end with a '\0',
    thus prohibiting the other side from originating keys.
    
    This is IMHO very close to what Pat was proposing, yet does allow a variant
    of "batch processing". It also allows a more agressive processing for
    those who like it. This could be our compromise.
    
    Summary:
    
    1. "no-originating on split-key scheme"
    2. "no-originating (except declarations) on split-key scheme"
    3. "no-originating on split-pair scheme"
    4. "no-originating (except declarations) on split-pair scheme"
    5. "empty-PDUs until end-of-data scheme"
    6. "empty-PDU on split-pair scheme"
    
    2 is the least restrictive, however to take advantage of
    the permission to originate declarations when negotiations may
    not be originated, one has to look at key types. Thus, to take
    advantage of this, it requires the most complicated implementations.
    It is also longer to describe than 1. Otherwise, it has the same
    properties as 1.
    
    1 is what people seemed to be leaning towards yesterday.
    This scheme does not allow "batch-processing" of keys, since the
    sender has to be very PDU-boundary aware and leave the processing
    of keys that don't fit for later. It utilizes the bandwidth better
    than 5 or 6, but none of these schemes are considered for a very
    likely or performace critical case(s).
    
    The relation of 4 to 3 is the same as the one of 2 to 1.
    
    3 is a modification of 1 where a "split PDU" is clarified as
    not one with a split-key, but one with a split-pair at the end.
    This enables the sending side to effectively force no-origination,
    hence allowing modified but reasonably simple batch-processing of keys.
    It also still allows more agressive modifications to not do batch
    processing and send key responses sooner than a batch-processing
    implementation would.
    
    5 is the absolutely simplest scheme to implement and most restrictive
    in terms of what the protocol allows. It welcomes batch-processing of keys
    in its simplest form. Requires a new flag-bit in the PDU header
    for Text/Login Request/Response PDUs (4 total).
    
    6 is a modification of 5 that does not need the new flag in the
    header. Still allows very simple batch processing; only the sending
    layer needs a hack, allowing to force the other side to send only
    empty PDUs.
    
    Does this description seem accurate?
    
    My order of preference for these schemes would be:
    
    5, 6, 3, 4, 1, 2
    
    Martins Krikis, Intel Corp.
    
    Disclaimer: these opinions are mine and may not be those of my employer
    


Home

Last updated: Wed May 29 19:18:36 2002
10401 messages in chronological order