Document title: PEP#317 - Adding Pull Operations to Pegasus     Document details     Comments     Help with document reviews


[ ¤1] Pegasus Enhancement Proposal (PEP)

[ ¤2] PEP #:  317

[ ¤3] PEP Type: First review concept. After that functional

[ ¤4] Title: Extend Pegasus to support Pull Instance  CIM Operations

[ ¤5] Created: 15 Jan 2008

[ ¤6] Authors: Karl Schopmeyer

[ ¤7] Status:  Draft 

[ ¤8] Version History:

[ ¤9] Version [ ¤10] Date [ ¤11] Author [ ¤12] Change Description
[ ¤13] 1.0 [ ¤14] 19 February 2008 [ ¤15] ks [ ¤16] Initial Submission, Concepts and Overview
[ ¤17] 1.1 [ ¤18] 4 May 2008 [ ¤19] ks [ ¤20] Respond to questions and expand definitions
[ ¤21] 1.2 [ ¤22] 13 May 2008 [ ¤23] KS [ ¤24] Respond to comments from 1.1.  Add defintion of Issue and EnumerateCount operation
[ (k_schopmeyer) This version was approved in ballot by arch team with comments. Note that I have added some more comments since but that they are specifically notes as post approval comments.
¤25]
1.3
[ ¤26] 20 May 2008 [ ¤27] KS [ ¤28] Respond to 1.2 Issues and questions. Expand definition of Interfaces.

[ ¤29]  


[ ¤30] Abstract: This PEP defines the extensions to Pegasus to support the Pull instance operations defined in the DMTF Specification CIM Operations over HTTP version 1.3 preliminary.


[ ¤31] 1. Definition of the Problem

In order to further support scalability of the CIM enumerate operations and simplify the error handling, the DMTF has defined a new set of CIM operations in version 1.3 of the CIM Operations over HTTP specification (preliminary).  This extension defines the following new operations:
[ ¤32]
[ ¤33] Open Pull CIM Operations:
[ ¤34]
[ ¤42] Pull  CIM Operations:
[ ¤43] Other CIM Pull Associated Operations:
[ ¤48] The behavior pattern for the pull operations  is as follows:
[ ¤51]
  1. [ ¤52] The client opens a pull operation sequence with one of the open operations defined above.  The open determines which operation type is to be executed (enumerate, reference, associator, query and whether it is returning instances or object paths.  The client receives an enumeration context packet in the response. Note that the open operation includes parameters that are specific to that operation type (enumerate, etc.) and that correspond to the same parameters on the corresponding original operations (ex. propertyList, deepInheritance, etc.)  The server responds either with a response including a new operation context or with an error.  Note that the server may include objects in this response to the open operation.  This was specifically to allow for requests that will result in very small numbers of returned objects to be executed in a single operation. The client may also set some parameters with the open including 
  2. [ ¤58] Upon a successful open operation response, the client may execute pull operations to request more objects.   A pull operation MUST include the enumeration context received from the previous operation in the sequence (open or pull operation) and may modify the maximum number of objects allowed in the response.  Specifically the client may use the MaxObjectCount = 0 to force the interoperation timer to be restarted without getting any new objects in its response.  The server may  respond with either an array of objects of the type defined in the open or a valid CIMError.  
  3. [ ¤59] If the server responds with an error, the subsequent step for the server is determined by the ContinueOnError flag input by the client as part of the open.  If this flag was set to true, the server normally keeps the enumeration context open and will accept additional pull requests.  This allows an error in the process of preparing a response such that the client can get the maximum number of objects that are really available.  If the client has set ContinueOnError = false on the open, the server is expected to invalidate the operation context with the transmission of the CIMError. Any future client requests against this operation context would receive the InvalidContext error response.
  4. [ ¤60] Only a single pull operation may exist at any time for an enumeration context. The Client MUST not issue requests in parallel
  5. [ ¤61] If the parameter EndOfSequence which is one of the OUT parameters for both the open and pull operations is received by the client, it is an indicator that the server has completed the enumeration normally and is terminating.  At this point the enumeration context becomes invalid and the server will respond with an error to any future requests with this enumeration context.
  6. [ ¤62] The server must provide a reasonable guarantee that enumeration contexts are unique but there is no clear specification of the time frame for this uniqueness. 
  7. [ ¤63] If the client wishes to terminate an enumeration sequence before the server has returned an EndOfSequence it may issue a CloseEnumeration operation request.  This will terminate the sequence immediately and the enumeration context will become invalid.  Note that this operation may be issued by the client in parallel to an existing pull operation.
  8. [ ¤64] The enumeration context is to be considered opaque to the client since the form may vary from server to server.  The server may provide a different context definition with each response and the client MUST respond with the context from the most recent operation completed for the target sequence.
  9. [ ¤65] The specification does not define any relation between the tcp level connect and the operation context so that the client and server are free to chose this relationship.  Because the operations are all sequential (except for the possibility of multiple operations for the close) it is logical to consider that the client may directly relate a single client connection with an enumeration context.
  10. [ ¤66] While there are a number of different open request operations which define the different types of request, there are only three different pull operations (PullInstancesWithPath and PullInstancePaths) corresponding to the old ObjectsWithPath and CIMObjectPaths responses and PullInstances defined to support the PullQuery.   In all cases including the reference and associator operations the server responds with instances or instance paths rather than CIMObjects.   This was possible because these new operations are not defined to cover enumerating classes and therefore there is no need for the CIMObject type in the response. The goal was to create a set of operations and corresponding XML protocol entities that clearly support only instances in place of the mixed support of the current Association functions (which are required to support class and instance retrieval functionality in a single operation).
These operations are intended to initially supplement and eventually replace the existing block enumerate/reference/associatior operations.  The significantly improve the possibilities of scalability for both the client and server as follows:
[ ¤67]
[ ¤68] 1. Allows the server to determine the since of responses and to optimize the gathering of data in terms of the sizes that best satisfy the sever.
[ ¤69] 2. Allows the server to simplify the error handling so that any response is either error or data without any possibility of  data and error information being mixed.  In the single operation model, we had two basic problems a) there was no way for the server to respond with an error once the data begun transmission to the client (note that the error trailer never made it past preliminary) and there was never a clear direction concerning how the server could handle the possible multiple errors that could occur during responses involving multiple objects.  
[ ¤70] 3. Allows the client  (either the application code or infrastructure) to manage the quantity and rate of information received in response to a request for multiple objects.
[ ¤71]

[ ¤72] 2. Proposed Solution

The proposed solution is to implement these operations in both the Pegasus CIMServer and the C++ CIMClient.
[ ¤73]
[ ¤74] NOTE: The issue of the Pegasus SNIA client has not be considered in this PEP.  That should be considered a separate project.

[ ¤75] NOTE: For this release these will NOT be implemented in the cimom handle interface.
[ ¤76]
[ ¤77] In addition, we should consider extension of some of the other utilities like cimcli to use these operations when available but that is considered outside of the scope of this PEP.
[ ¤78]
[ ¤79]

[ ¤80] 2.1 Assumptions

[ ¤81] Integrating the Pull Operations into the operation of the Pegasus CIMServer

Today the Pegasus CIMServer process enumerations as follows:
[ ¤82] This mechanism was defined around a set of assumptions that proved not to be true including:
[ ¤88]
[ ¤89] 1.  Chunking and our internal segmenting should be represented by the same size segments.
[ ¤90] 2.  That the trailer for error response was an approved function whereas, in fact, it was preliminary in the DMTF HTTP 1.2 specification and was removed from the 1.2 final specification.
[ ¤91]
[ ¤92] The end result of the changes in specifications since this code was implemented is that:
[ ¤93]
[ ¤94] 1. We are today using an illegal trailer.
[ ¤95] 2. If a client does not specify chunking we have no way to reduce memory used for the preperation of operation responses.
[ ¤96]  
[ ¤97] There are several assumptions made in order to implement the new pull operations  with minimal impact on the majority of the Pegasus server:
  1. [ ¤98] Existing providers must continue to operate as they do today. This means no interface changes to the providers.
  2. [ ¤99] Existing Clients  and the existing enumerate/reference/associator operations must continue to operate as they do today.  The existence of these new operations must not impact existing operations.
  3. [ ¤100] The CIMServer and Client must continue to support all existing operations.  The Pull operations are additional functionality, not replacement functionality.
  4. [ ¤101] This functionality will correct the issues today in Pegasus with trailers and the use of chunks as the mechanism for segmenting responses.

[ ¤102] 2.2 Defining Behavior of Pull Operations

The pulled operations generally correspond to existing enumeration type operations (enumerate, enumerateNames, associators, references, etc.).  They do not introduce new operation concepts but allow the separation of the existing operations into multiple client requests to limit the amount of information passed in a single request/response operation for both the client and server. These operations do introduce a couple of additional limitations:
[ ¤103]
  1. [ ¤104] The reference and associator operations are applied to instances only (the original reference and associator operations were applied to classes and instances which is what added the concept of CIMObject to the whole model. Further the pulled operations are not extended to the enumerate class and qualifier operations because they are inherently bounded.
  2. [ ¤105] These CIM Operations introduce the concept of a estimate of the number of objects to be returned (0ptional).
  3. [ ¤106] These CIM Operations do not use the concept of delivering objects.  All of these operations deliver instances with paths and/or instance paths.
  4. [ ¤107] These CIM Operations provide separate operations for instances with and without paths.
  5. [ ¤108] The LocalOnly behavior which was defined for enumerations is NOT supported by these operations.  One of the decisions when designing this change was to delete from these functions any behavior that was considered deprecated as part of the previous versions of the specification. LocalOnly, because of its indeterminate behavior, was marked deprecated in version 1.2
  6. [ ¤109] The IncludeQualifiers parameter is not defined for these operations (See 4 above for reason).
  7. [ ¤110] Filters - The new operations add the concept of Filters on the operations with two parameters, FilterQueryLanguage and FilterQuery.  However, since the language is not clearly defined today, we propose that the initial implementation reject any operation for which the filter or query language parameters are set with the CIM_ERR_FILTERED_ENUMERATION_NOT_SUPPORTED error response.
The pulled operations differ significantly from existing CIM operations in that a series of CIM operations is used (Open, Pull, Close) to replace what today are single enumeration  operations. This requires that the server maintain a enumeration session (enumeration context). for the lifecycle of a set of pulled operations (which typically consist of an open and a number of pulls followed by an optional close).  Once the server receives and provides a successful response to a pull operation, it must maintain this context for the lifecycle of the enumeration.  The client must include this enumeration context in all operations subsequent to a successful Open operation. The lifecycle of the enumeration is defined by:
[ (mreddy) Is there any specific reason for maintaining context for the life cycle of the enumeration in Server?. Is the client also maintaining the context?.
(k_schopmeyer) Yes. The enumerationContext is the identifier for the sequence that represents one open and subsequent pulls, closes, etc.. It is what ties the Pull, Close, and count operations to a particular Open operation and to one another. Conceptually one could do this like a stateless web mechanism and put all of the information into the context sent back to the client so that the server would reconstruct state for each operation in the sequence from the context. However, it is more logical to maintain state in the server and use the context as a key into an existing state definition for that sequence which is what we are doing.
¤111]
  1. [ ¤112] Pull operations on the same enumeration context which cause its life to be extended as well as returning enumeration information to the client. Note that it is within the constraints of the specification for the server to change the context with each response so that the client must respond with the latest received context in all cases.
  2. [ ¤113] The close operation which closes and removes an existing enumeration context.  The operation is only required if the client wishes to close an enumeration before the complete response has been returned to the client.  
  3. [ ¤114] A marker on all of the responses indicating that the enumeration is complete (endOfSequence) and which causes the server to close the enumeration.
  4. [ ¤115] Interoperation timeouts on the enumeration context in the server which can cause the enumeration context to be closed and terminated by the server.
  5. [ ¤116] A flag defined by the client which causes the server to either terminate or (optionally) not terminate the enumeration session if an error occurs during any of the operations. (ContinuOnError)
Note that  connection close/open does not affect the enumeration context so that a pulled enumeration sequence  can continue through a client/server disconnect and reconnect.
[ ¤117]
[ ¤118] The Pull operations move object or object path information from the server to the client in the same manner  as the existing enumeration operations except that:
[ ¤119]
  1. [ ¤120] The client can limit the maximum number of objects returned in a single pull operation.
  2. [ ¤121] The server can further limit  the number of objects returned from the limit set by the client.
  3. [ ¤122] A request for zero objects is specifically allowed and can be used to reset the inter-operation timer on the context.
  4. [ ¤123] Any error terminates the current response operation.  Note that an error does not necessarily delete the context.  There is a parameter in the open that allows the client to define continue-upon-error behavior so that the client may attempt to continue the operation after the current error.
  5. [ ¤124] Note that the specification does not place specific requirements on the order of transmitting an error vs.  data so that the server could elect to send either any already gathered objects and the error for the next request or substitute the error for the returned objects.
  6. [ ¤125] The implication is that the server will send either entire groups of objects OR an error.  It cannot send both and there is no trailer so that an error can be attached to objects that might have been already sent in response to a particular operation.
  7. [ ¤126] The set of operations on a single enumeration context must be executed sequentially with one possible exception.  The close operation may be executed while a pull is outstanding.  Note that this is optional behavior and the server may also return an error if this simultaneous operation is requested. 
    [ ¤127]

[ ¤128] 2.3 Integrating the Pull Operations into the operation of the Pegasus CIMServer

Today the Pegasus CIMServer process enumerations as follows:
[ ¤129] There are several issues with this including the following:
[ ¤133]
  1. [ ¤134] The enumerations use the HTTP trailer which no longer exists so that there is no way to transmit an error.
  2. [ ¤135] The enumeration concept is tied inherently to the HTTP chunk concept.

[ ¤136] 2.4 Proposed Changes

Define the new operations in the Client and Server header files
  1. [ ¤137] Define the new operation requests in CIMClient.h and CIMClientInterface.h headers. (See section below for the interface definition)
  2. [ ¤138] Define the new operation requests and responses in CIMClient.* and CIMClientRep.*, and the client operation request decoder  and decoders.  These will generally extend the current patterns of encoding and decoding that exist in the current operations.  The one difference is that we propose to implement a version of the Enumeration Context Table within the client so that parameters like the namespace (which is actuallly required on each operation but only for the HTTP header on Pull, Close and Count operations need not be supplied by the client API on these operations.  Thus, once an operation context is established with an open, the context, namespace and possibly other information will be maintained within the infrrastructure to be added to subsequent Pull and Close calls.
  3. [ ¤139] Define the new operations for  the Server in Server/CIMOperationRequestDecoder.* and Server/CIMOperationResponseEncoder.*
  4. [ ¤140] Define the CIMMessages for the new operations in CIMMessage.
  5. [ ¤141] Define the Server Enumeration Context management mechanism. This mechanism will manage enumeration contexts with operations such as create, delete, update(), find(), setTimeout().
  6. [ ¤142] Extend CIMOperationRequestDispatcher to handle these new request operations and to map them to corresponding full enumeration requests.  The heart of the behavior change is in the dispatcher. Up to this point, requests are all processed individually be they existing or new pulled operations.  The dispatcher will a) tie the pull request to existing enumeration context, b) determine validity and provide appropriate responses, c).  pass information to the OperationAggregate processing so that responses can be metered back to the originator based on the parameters of the response.
  7. [ ¤143] Experimental Status - The new interfaces will be marked "Experimental" at least pending the "Final"  DMTF approval of the CIM Operations over HTTP and CIM/XML specifications. We will also include a PEGASUS_ENABLE_PULL_OPERATIONS flag to that they can be disabled in the server.
    [ ¤144]
The Enumeration Context - The specification allows a completely opaque enumeration context that is created by the server for the open operation and returned to the client.  This context must be passed by the client for each pull operation and for the close operation.  Note that it is assumed that the server may modify the context for each pull operation so that the client must always returns the latest enumeration context received on the prior operation.  It is expected that we will use an enumeration context that is simply a guid that is unique so that the context can be found on the server when pull or close operations are received.  In addition, the server will be required to keep interoperation times on the enumeration context and to timeout and remove an enumeration context when the timer runs out.  We expect that the guid will not change between the open and pull operations.  It is an implementation choice to make the guid unique for each operation but, for the moment, we do not see significant gain in modifying it for each pull operation.  NOTE: This is not a major issue and we may revisit it during implementation.  In any case, the client MUST assume that it is modified and return the most recent received enumerationContext.
[ ¤145]
[ ¤146] Characteristics of a Session - The DMTF specification allows keeping enumeration sessions open across connection terminations and shutdowns of the server.  In our case, we propose that we will keep enumerations sessions open across  connection terminations but not across restart of the server.
[ ¤147]
[ ¤148] Mapping between the Pull operations and corresponding operations to the providers
[ ¤149]
[ ¤150] It is intended that we DO NOT modify the provider interface at this point to provide for pull operations specifically to providers.  Modifying the provider interface  is a non-compatible change although one can see significant performance enhancements if we do this in the future.   Instead, the providers will continue to provide responses as they do today to full enumeration requests.   However, since the responses are already processed through the system as segments, our objective is to extend the same concept to the pull operations.
[ ¤151]
[ ¤152] Handling the Pull Operations within the Pegasus Server
[ ¤153]
[ ¤154] We intend that the majority of support for the behavior of the operations be done withing the CIMOperationRequestDispatcher as follows:
[ ¤155]
[ ¤156]
Enumeration Context Table Define an EnumerationContextTable that will be used to issue and maintain open enumerationContext objects.  An enumerationContext object will be maintained for each open context and will contain the context string,  the pointer to the OperationAggregate opened for this enumeration sequence, the operationTimeout parameter and any active timers to time interoperation times.  This will be attached to the CIMOperationRequestDispatcher and will be implemented as a hashtable.  New contexts will be created by the open operations and all subsequent pull, close and enumerationCount operations will be tested against the valid enumerationContext values in this table. This table can also be used to check other parameters of the pull, close, ... operations for valadity against the open also.
[ ¤157]
[ ¤158] Use of OperationAggregate Object - We will extend the OperationAggregate object  in the CIMOperationRequestDispatcher and  its behavior to account for the the handling of responses for the new operations.  This will extend the the OperationAggregate functions to build responses specifically for the Open, Pull, and Close operations.
[ ¤159]
[ ¤160] The Open Pull operations will open a new enumeration context and  make the requests to the providers and repository using the existing mechanisms in the CIMOPerationRequestDispatcher.  In effect these new operations will operate the same as the comparable Enumerate/Associator/Reference operations except that they will mark the create OperationAggregate object as "pull" operations so that the aggregator code processes the responses in accordance with the Open parameters (ex. maxObjectCount rather than process the complete response.   The providers will continue to operate as they do now, returning objects that are generated through the OperationResponse mechanism back to the OperationAggregate object for the defined operation.  The Open operations will process the following errors:
[ ¤161]

[ ¤167] Pull Operations on existing enumeration contexts will use the Operation Aggregation object  to meter segments of objects from the providers to the correct output queue and with counts of the objects in each response corresponding to the Pull request.  In effect, the OperationAggregate is the central point where responses from the providers/repository and temporarily held and then metered out as responses to the operation originator in accordance with received pull operations.
[ ¤168]
[ ¤169] The Pull Operations process the following errors:
[ ¤170]

[ ¤173] The OperationAggration functions have been expanded to not only release response messages to the operation originator (the aggregator which originally operated to either completely aggregate response components into a single response or the meter the responses to the request originator individually.  Now, because there is no guarantee that the the size of the resposne to the client will be the same size or larger than the responses from the providers, the aggregator may need to restructure the response messages to correspond with the maxObjectCount that can be received in each individual Open or Pull request.
[ ¤174]
[ ¤175] The Close operation will close an open enumerationContext and will mark the corresponding OperationAggreage object as "finished" .  If all responses from providers have been received, the OperationAggregate object can be released immediatly.  If they have not all been received, the OperationAggregate function will release any further responses as they are received. In this release, we will not process concurrent closes.
[ ¤176] The Close Operation will provide the following errors responses:
[ ¤177]
[ ¤178]

[ ¤181]          The EnumerationCount operation may provide an estimate of the number of elements that would be included in a response sequence.  For the initial         version     this will always respond "NMOT_SUPPORTED" from the Pegasus server.


[ ¤182] Possible Limiting Parameters for Pull Operations
[ ¤183]
[ ¤184]
  1. [ ¤185] Maximum interoperation timeout. This parameter is required by the DMTF specification.  This is the minimum  time that the server will maintain an enumerationContext open from the time one operation in a pull sequence is completed until a subsequent operation is received.  If this time limit is exceeded, the server will simply close the enumerationContext and clean up any outstanding activities associated with that context.  Any requests received subsequent to that time can expect to simply recieve an CIM_ERR_INVALID_ENUMERATION_CONTEXT error response.  It is logical for this to be a dynamic variable that can be set at least at server build time and possibly at run or startup time.
  2. [ ¤186] Maximum number of Enumerations Open - This is not required but could be considered a logical limit for a server to limit the number of parallel activities that the server would maintain in parallel.  If this were implemented, an Open request that exceeded this limit would receive an error response.  With the CIM_ERR_SERVER_LIMIT_EXCEEDED status.   ISSUE: We will not implement this option for the initial version of the funcitonality.
  3. [ ¤187] Maximum size for the maxObjectCount parameter - It is allowable for the server to consider setting some maximum limit on the size of pull operations and this is provided for in the DMTF specifications.  It is logical for this to be a dynamic variable that can be set at least at build time and possibly at run or startup time.

[ ¤188] 2.5. CIM Client Interface  Extensions

The following is an initial definition of the client API changes if we use exactly the definitions in the
[ ¤189] specification:
[ ¤190]
[ ¤191] ISSUE: Add the descriptions for all of the other operations.  
[ ¤192]  

[ ¤193] 2.5.1 CIMClient.h Interface extensions

[ ¤194]   Note that these will be within an experimental ifdef block
[ ¤195]

[

¤196] 
//KS-PULL 

    /** The openenumerateInstances method opens a pulled
    enumeration instances context to enumerate  instances of a CIM Class 
    in the target Namespace and optionally returns instances. 

    @param enumerationContext CIMEnumerationContext, a returned parameter 
    that provides context for subsequent pull operations. This parameter is
    considered opaque to the user.

    @param  EndOfSequence Boolean parameter that the server 
    provides to define the end of the enumeration. If this 
    parameter* is returned true, the server has determined that 
    the** enumeration is complete and as closed the
    enumerationContext.

    @param nameSpace CIMNamespaceName The nameSpace parameter is a string that 
    defines the target namespace. See defintion of
    \URL[Namespace]{DefinitionofTerms.html#NAMESPACE}.

    @param className The className input parameter defines the
    Class that is the basis for the enumeration.

    @param deepInheritance If the deepInheritance input
    parameter is true, this specifies that, for each
    returned Instance of the Class, all properties of the Instance MUST
    be present (subject to constraints imposed by the other
    parameters), including any which were added by subclassing the specified
    Class. If false, each returned Instance includes only
    properties defined for the specified Class.

    The Enumerate Instances operation returns the same number of instances
    regardless of whether or not the DeepInheritance flag is set.  The
    DeepInheritance flag is only used to determine whether or not 
    the subclass property values should be returned.

    @param includeClassOrigin If the Boolean includeClassOrigin input
    parameter is true, this specifies that the
    CLASSORIGIN attribute MUST be present on all appropriate
    elements in each returned Instance. If false, no
    CLASSORIGIN attributes are present in each returned
    Instance.

    @param filterQueryLanguage If the filterQueryLanguage* 
    paramter is provided it defines an query language to be used 
    with the filterQuery. This is an optional parameter and using it may cause
    the operation to be rejected by some CIM servers.

    @param filterQuery String defining a filter query to be applied to 
    the enumeration. This is an optional parameter and using it may cause
    the operation to be rejected by some CIM Servers.  

    @param propertyList If the propertyList input parameter is not
    NULL, the members of the array define one or more CIMProperty
    names.  Each returned Instance MUST NOT include elements
    for any Properties missing from this list.  Note that if
    LocalOnly is specified as true (or
    DeepInheritance is specified as false) this acts as an
    additional filter on the set of Properties returned (for example,
    if CIMProperty A is included in the
    PropertyList but LocalOnly is set to true and
    A is not local to a returned Instance, then it will not be
    included in that Instance). If the PropertyList input parameter
    is an empty array this signifies that no Properties are included in each
    returned Instance. If the PropertyList input parameter is
    NULL this specifies that all Properties (subject to the conditions
    expressed by the other parameters) are included in each returned
    Instance.

    If the propertyList contains duplicate elements,
    the Server MUST ignore the duplicates but otherwise process the request
    normally.  If the PropertyList contains elements which are
    invalid CIMProperty names for any target Instance, the Server MUST
    ignore such entries but otherwise process the request normally.

    @param operationTimeout Int32Arg that defines the interoperation
    timeout in seconds between operations of a pull enumeration sequence.
    The server shall maintain a returned enumeration context for at least the
    time specified by this parameter.  If the parameter is set to NULL
    the server defines the operationTimeout time.  If the user sets the
    to a time greater than that allowed by the server, the server may
    its maximum timeout time in place of the supplied parameter.  If the user
    sets the timeout time to zero the server may ignore timeout time completely.
 

    @param continueOnError - Boolean parameter that defines whether the server
    should continue to return instances subsequent to a CIMException error
    occurring in the server.  If this parameter is "true" the server may
    continue processing responses subsequent to an error.  If it is "false"
    the server must terminate the response upon the first error.  This
    parameter is optional and not all servers accept it.  A server may
    generate an exception response if this parameter is set "true'.

    @param maxObjectCount - Defines the maximum number of elements that this 
    Open operation can return. Any Uint32 value is legal including 0.
    The server may deliver up to maxObjectCount objects.  The server may
    deliver fewer elements including possibly zero elements. In any case, the
    server will reset the operationTimeout so that maxObjectCount of zero can
    be used to keep a pull sequence open without receiving elements

    @return If successful, the method returns zero or more named
    Instances that meet the required criteria.

    If unsuccessful, one of the following status codes MUST be returned
    by this method, where the first applicable error in the list (starting
    with the first element of the list, and working down) is the error
    returned. Any additional method-specific interpretation of the error in
    is given in parentheses.

        
    */

    Array openEnumerateInstances(
        CIMEnumerationContext& enumerationContext,
        Boolean& endOfSequence,
        const CIMNamespaceName& nameSpace,
        const CIMName& className,
        const Boolean deepInheritance,
        const Boolean includeClassOrigin,
        const CIMPropertyList& propertyList = CIMPropertyList(),
        const String& filterQueryLanguage = String::EMPTY,
        const String& filterQuery = String::EMPTY,
        const Uint32Arg& operationTimeout  = Uint32Arg(),
        const Boolean continueOnError = false,
        const Uint32Arg& maxObjectCount = Uint32Arg(0)
        );

    /** 
       TBD add description
    */

    Array openEnumerateInstancePaths(
        CIMEnumerationContext& enumerationContext,
        Boolean& endOfSequence,
        const CIMNamespaceName& nameSpace,
        const CIMName& className,
        const String& filterQueryLanguage = String::EMPTY,
        const String& filterQuery = String::EMPTY,
        const Uint32Arg& operationTimeout = Uint32Arg(),
        const Boolean continueOnError = false,
        const Uint32Arg& maxObjectCount = Uint32Arg(0)
        );
    
    /** TBD description
    */
    
    Array openReferenceInstances(
        CIMEnumerationContext& enumerationContext,
        Boolean& endOfSequence,
        const CIMNamespaceName& nameSpace,
        const CIMObjectPath& objectName,
        const CIMName& resultClass = CIMName(),
        const String& role = String::EMPTY,
        const Boolean includeClassOrigin = false,
        const CIMPropertyList& propertyList = CIMPropertyList(),
        const String& filterQueryLanguage = String::EMPTY,
        const String& filterQuery = String::EMPTY,
        const Uint32Arg& operationTimeout = Uint32Arg(),
        const Boolean continueOnError = false,
        const Uint32Arg& maxObjectCount = Uint32Arg(0)
        );

    /** 
     * TBD Add Description
    */

    Array openReferenceInstancePaths(
        CIMEnumerationContext& enumerationContext,
        Boolean& endOfSequence,
        const CIMNamespaceName& nameSpace,
        const CIMObjectPath& objectName,
        const CIMName& resultClass = CIMName(),
        const String& role = String::EMPTY,
        const String& filterQueryLanguage = String::EMPTY,
        const String& filterQuery = String::EMPTY,
        const Uint32Arg& operationTimeout = Uint32Arg(),
        const Boolean continueOnError = false,
        const Uint32Arg& maxObjectCount = Uint32Arg(0)
        );
    
    /**
     * TBD Add Description
    */

    Array openAssociatorInstances(
        CIMEnumerationContext& enumerationContext,
        Boolean& endOfSequence,
        const CIMNamespaceName& nameSpace,
        const CIMObjectPath& objectName,
        const CIMName& assocClass = CIMName(),
        const CIMName& resultClass = CIMName(),
        const String& role = String::EMPTY,
        const String& resultRole = String::EMPTY,
        Boolean includeClassOrigin = false,
        const CIMPropertyList& propertyList = CIMPropertyList(),
        const String& filterQueryLanguage = String::EMPTY,
        const String& filterQuery = String::EMPTY,
        const Uint32Arg& operationTimeout = Uint32Arg(),
        const Boolean continueOnError = false,
        const Uint32Arg& maxObjectCount = Uint32Arg(0)
        );

    /** TBD Add Description
    */
    Array openAssociatorInstancePaths(
        CIMEnumerationContext& enumerationContext,
        Boolean& endOfSequence,
        const CIMNamespaceName& nameSpace,
        const CIMObjectPath& objectName,
        const CIMName& assocClass = CIMName(),
        const CIMName& resultClass = CIMName(),
        const String& role = String::EMPTY,
        const String& resultRole = String::EMPTY,
        const String& filterQueryLanguage = String::EMPTY,
        const String& filterQuery = String::EMPTY,
        const Uint32Arg& operationTimeout = Uint32Arg(),
        const Boolean continueOnError = false,
        const Uint32Arg& maxObjectCount = Uint32Arg(0)
        );

    /** The pullInstancesWithPath operation retrieves instance paths
       from an open enumeration that requests paths and represented by 
       a CIMEnumerationContext.
      
       @param enumerationContext must be a valid context returned by
       an open operation or a previous pull operation.
     
       @param endOfSequence is a Boolean parameter that is false
       until the server has returned the complete set of elements to
       be returned.
      
       @param maxObjectCount defines the maximum number of elements
       that may be returned by the server for this operation. See ***
       for a complete definition.

       If successful the operation returns zero or more CIMObjectPaths.

       If not successful the operation returns one of the following
       exceptions:
            

    */

    /** TBD Add Description
     */
    Array pullInstancesWithPath(
        CIMEnumerationContext& enumerationContext,
        Boolean& endOfSequence,
        const Uint32Arg& maxObjectCount = Uint32Arg(0)
        );
    /** TBD Add Description
     */
    Array pullInstancePaths(
        CIMEnumerationContext& enumerationContext,
        Boolean& endOfSequence,
        const Uint32Arg& maxObjectCount = Uint32Arg(0)
        );

    /** TBD add description */
    void closeEnumeration(
        CIMEnumerationContext& enumerationContext
        );

    /** TBD add description */
    Uint64Arg enumerationCount(
        CIMEnumerationContext& enumerationContext
        );

//KS_PULL_END

[ ¤218] 2.5.2 NumericArgs Interface Object

[ ¤219] We implemented a simple set of objects to allow the Uint32 and Uint64 objects to be passed through the CIMClient API and managed in the server while including the concept of NULL.  These classes allow the user to pass either a value or NULL through these interfaces and provide test, set, and clear functions. These are defined in common as follows:

[
(r_kumpf) Why not just use PEG_NOT_FOUND?
(k_schopmeyer) We need to implement something that will allow all possible values of Uint32 and Uint64 and still show CIMValue.
1. What we did which is multiple simple classes to add the NULL concept.
2. use CIMValue which means that we would have to dynamically test for the correct typing in the client.
3. Set up extra parameters on the call to account for the NULLness. This means that we also have to do something in the server since it needs to understand NULL also.

Not sure what you mean by just use PEG_NOT_FOUND. Lets discuss this one. RESULTS: After discussion we agreed to keep this set of new classes pending further understanding after the initial implementation is complete.

¤220]
class PEGASUS_COMMON_LINKAGE Uint32Arg { public:     Uint32Arg();     Uint32Arg(const Uint32Arg& x);     Uint32Arg(Uint32 x);     ~Uint32Arg();     Uint32Arg& operator=(const Uint32Arg& x);     const Uint32& getValue() const;     void setValue(Uint32 x);     Boolean isNull() const;     void setNullValue(); private:     Uint32 _value;     Boolean _null; }; class PEGASUS_COMMON_LINKAGE Uint64Arg { public:     Uint64Arg();     Uint64Arg(const Uint64Arg& x);     Uint64Arg(Uint64 x);     ~Uint64Arg();     Uint64Arg& operator=(const Uint64Arg& x);     const Uint64& getValue() const;     void setValue(Uint64 x);     Boolean isNull() const;     void setNullValue(); private:     Uint64 _value;     Boolean _null; };

[ ¤221] 2.6 List of Modules that will change

This is an initial list and will change as development progresses:
[ ¤222] Pegasus/Client
[ ¤223]
[ ¤229] Pegasus/Common

[ ¤230]
[ ¤231]

[ ¤238] Pegasus/Server
[ ¤239]
[ ¤240]

[ ¤244]

ProviderManager2
[ ¤245]
[ ¤246]
OperationResponseHandler.*
[ ¤247] Default/MessageHandler.*

[ ¤248]
[ ¤249]

New Files for the Pull Operations

[ ¤250] Test files

  1. [ ¤251] Pegasus/Client/tests/PullEnumeration - Automated test of the new operations as a server test.
  2. [ ¤252] Static tests - Some tests for error conditions that cannot be tested through the PullEnumeration test program.
  3. [ ¤253] Common/NumericArgs (.h and .cpp) - Interfaces for the Uint32 and Uint64 parameters that must be passed through the API with NULL

[ ¤254] 2.7 New CIM_Error Exceptions

There are a number of new error codes defined in the DMTF HTTP specification as follows:
[ ¤255]
[ ¤256]
  1. [ ¤257] CIM_ERR_INVALID_ENUMERATION_CONTEXT - Error response if the server cannot find the context defined in the operation.  Implemented by CIMOperationDispatcher if a Pull or Close is received for which there is no enumerationContext in the EnumerationContextTable.
  2. [ ¤258] CIM_ERR_INVALID_OPERATION_TIMEOUT -  The operation timeout specified in the operation request is not supported by the server.  Typically this applies if the client  demands interoperation timeouts that are larger than the server is willing to support.  We propose that Pegasus establish a configuration parameter that would define the maximum allowable timeout but that if the request is larger than this limit, we would use our internal limit rather than the received parameter. However, there is one case where this may be returned.  I timeout parameter of zero is a request for unlimited time. Thre should be at least an option to disallow this and for the moment we return this errof if the request operationTimeout is set to zero.
  3. [ ¤259] CIM_ERR_PULL_HAS_BEEN_ABANDONED -  This error would be generated by the server if an operation was terminated due to the receipt of a simultaneous close operation during the execution of the Pull/Open operation.   Pegasus will issue this error if a Close or is received while a Pull is active in the server. Pegasus server will not use this in the initial version of this funcitonality.
  4. [ ¤260] CIM_ERR_FILTERED_ENUMERATION_NOT_SUPPORTED - The client defined a filter parameter with the request but the server does not support filters. ISSUE: Should we do this if either the filter and/or the filter language parameters are provided with the request. Pegasus will issue this error if either the filter or filter query language is non-null in an open request. CONCLUSION: We issue this error if either filter or querylanguage parameters exist.
  5. [ ¤261] CIM_ERR_CONTINUATION_ON_ERROR_NOT_SUPPORTED -  Error response from the server if the client requests the continueOnError and the server does not support continueOnError.  In this version, we propose that Pegasus not support the continueOnError. Pegasus will provide this error in all cases where the continueOnError parameter is received with a "true" value.
  6. [ ¤262] CIM_ERR_SERVER_LIMITS_EXCEEDED - The server has failed the operation because it has exceeded some server limits.  Note that this error is really much more general than just the Pull operations.
  7. [ ¤263] CIM_ERR_SERVER_IS_SHUTTING_DOWN - The server is in the process of shutting down and cannot process the operation at this time. NOTE: We have not thought out when we would issue this error at this point. NOT USED BY THE PEGASUS SERVER.

[ ¤264] 2.8 New Build Options

[ ¤265] PEGASUS_PULL_OPERATION_MINIMUM_TIMEOUT

[ ¤266] Description: If set defines the minimum time in seconds that an enumeration context defining a sequence of open/pull operations will remain in existence subsequent to the completion by the server of the response to a open or pull operation.  The server may discard the enumeration context when this timout is exceeded so that any further pull/close operations using that enumeration context would generate a error from the server with the status

[ (r_kumpf) I suggest 20 seconds.
(k_schopmeyer) Agreed.
¤267]
Default Value: 5 seconds

[ ¤268] Recommended Value (Development Build): 5

[ ¤269] Recommended Value (Release Build): 5

[ ¤270] Required: No

[ ¤271] Considerations: This variable is of interest only if the PEGASUS_ENABLE_PULL_OPERATIONS variable is set to TRUE.

[ ¤272] PEGASUS_ENABLE_PULL_OPERATIONS

[ ¤273] Description: If true the PULL operations (open..., pull..., close, enumerationCount) are enabled in the Pegasus server. This flag also removes the defined interfaces from the Pegasus client.

[ ¤274] Default Value: true

[ ¤275] Recommended Value (Development Build): true

[ ¤276] Recommended Value (Release Build): TBD

[ ¤277] Required: No

[ ¤278] Considerations: This variable is used to disable the use of these operations for environments where they are not to be used.  Note that since these operations are not yet in final specification status in the DMTF there may be users who elect not to allow them either in the Pegasus Server or client

[ ¤279]
[ (r_kumpf) Is there a requirement to make this configurable?
(k_schopmeyer) Very good question. Not sure but I can see why in servers there might be an interest in the admin setting sizing parameters like this IF they had sufficient information to actually make a decision. Right now, I am not sure what information they would use to make this decision. In fact I am not sure how the developers really makes a decision about this now, certainly we are guessing with the defaults.
I hesitate to make a configurable variable for which the admin can only guess.
In fact, it would be more logical in the long term to make this part of the dynamic memory management so that, for example, the more memory we use or the more outstanding operations, the smaller the max return size.
For the moment, I propose the fixed parameter just to have some parameterization that can be expanded later to dynamic or internally managed.

¤280]
PEGASUS_PULL_OPERATION_MAXIMUM_OBJECT_COUNT

[ (r_kumpf) To clarify the previous comment, I think it would be better to eliminate the PEGASUS_PULL_OPERATION_MAXIMUM_OBJECT_COUNT build variable until we have a better idea about how to limit the response size.
(k_schopmeyer) AGREED. We will remove all but the enable parameter for now. We will keep the max internally but remove the external ability to set as part of the build until we understand better the impact of this new set of operations
¤281]
Description: This numeric parameter defines the maximum number of objects (instances or object paths) that the Pegasus server will be allowed to return for a single open, or pull operations as part of a pull operation sequence.  If the client supplies a maxObjectCount larger than this defined number, the server will return only the number defined by this parameter.  If this parameter is defined as zero (0), the server will ignore this parameter.

[ ¤282] Default Value: 1000

[ ¤283] Recommended Value (Development Build): 1000

[ ¤284] Recommended Value (Release Build): 1000

[ ¤285] Required: No

[ ¤286] Considerations: This variable is of interest only if the PEGASUS_ENABLE_PULL_OPERATIONS variable is set to TRUE.

[ ¤287] 2.9 Issues with the DMTF Specification today

[ ¤288] The specification today is in preliminary form which means a) it may have errors which hopefully initial implementations will sort out b) this is the chance to get our vote in on any issues.  This section maintains a list of known issues with the spec or which we may want to introduce back into the spec before it goes final.

[ ¤289] Note that the goal for the specification is final this spring.

[ ¤290] 1. Error in IMETHODRESPONSE definition in DSP0201. The new operations require some way to return parameters and none was included in the definition

[ ¤291] Current:

[ ¤292] <!ELEMENT IMETHODRESPONSE (ERROR|IRETURNVALUE?))>
[ ¤293] <!ATTLIST IMETHODRESPONSE
[ ¤294]            %CIMName;>

[ ¤295] Corrected:  CR 455

[ ¤296] <!ELEMENT IMETHODRESPONSE (ERROR|IRETURNVALUE?,PARAMVALUE*))>
[ ¤297] <!ATTLIST IMETHODRESPONSE
[ ¤298]            %CIMName;>

[ ¤299] 2. The specification does not define the relationship between the Open and Pull operations so that a client could logically use either the PullInstancesWithPath or the PullInstancePaths with any open operation. This will be extended to provide a definition of the relationship and a means to generate an error if an incorrect request is made. ACTION: Add language to final specification to insure that the correct Pulls correspond to their opens.  Also we will check this within the server so that only the PullInstancesWithPath, for example, can follow an OpenEnumerateInstances, OpenAssociators, OpenReferences and only hte PullInstancePaths can be used with OpenEnumerateInstancePaths, etc.

[ ¤300] NOTE: We are finding some minor issues in the specification that are being corrected as we proceed.  Hopefully, this will be the second implementation of this extension and will be enough to allow the DMTF specifications (DSP200 and DSP200) to go final for the versions that incorporate the changes for the Pull operations.

[ ¤301] 3. The DMTF Specification does not define any relationship between the user identity and the operations of a sequence of pull operations.  Thus, it would be legal for one user to perform an open and another user to execute a pull.  This is being discussed within the DMTF but we do not intend to add tests for this pending clarification by the DMTF. PROPOSAL: We will test and not allow a change of user within an enumeration sequence.

[ ¤302] 4. What is the impact of a server NOT responding with the path component for operations like OpenEnumerateInstancesWithPath or with just the local path component?  This behavior is NOT defined in the specification.

[ ¤303] 5. Impact of losing some responses as, for example, if a client timeout occurs during one operation in the sequence.

[ ¤304] 6. Possibly clarify relationship between priority of delivering existing data and returning an error when an error is recieved with the continueOnError = false.

[ ¤305] 7. Clarify the possible forms of NULL for the return parameters.  Today, the DMTF specification requires that the parameter exist but it may be NULL.  Should we extend this to allow a missing return parameter (EndOfSequence, etc.) to have a specific meaning. Note that there are a number of open issues with the definition of the return parameters (EnumerationContext, endOfSequence, etc.) in the specification and there will be text added to the next version to clarify these issues and lack of clarity.
[ (k_schopmeyer) Post approval - New dmtf issue. The statistical data model does not allow for added operations so that today these show up as discarded statistical data. Not sure yet what the resolution of this issue will be.
¤306]

[ ¤307] 3. Rationale

[ ¤308] This will be a required part of future CIM Operation over HTTP specifications.   We feel that it is important for Pegasus to support  these operations to achieve the scalability that is becoming important  in production environments

[ ¤309] 4. Schedule

[ ¤310] The goal is that this work be included in Pegasus 2.8.0

[ ¤311] 5. Discussion

[ ¤312] Discussion vers 1.0

[ ¤313] Question:

¤34] Pull CIM Operations:
[ ¤314] [ ¤35]

[ ¤316] Response: This is a clear difference with the existing behavior in particular for the replacement for enumerate instances.  We are expecting the system to respond with the paths in all cases.  It would appear that the best solution is that if the providers do not respond with the path, the server must add it but at this point I have not implemented that because of the extra processing cost.   

[ ¤317] RESPONSE2: We have implemented the addition of the path component to all of the pull responses.

[ ¤318]

[ ¤319] FURTHER ACTION: I put this question back to the DMTF (i.e. can the path be null) but no response yet.  I know that the WBEMSolutions server builds the path in the server if the providers do not build it.

[ ¤320] Question:

Other CIM Operations:
[ ¤321] [ ¤40]

[ ¤323] Response

[ ¤324] Yes. Error responses are possible for all of these new operations.  Note also that these operations introduced some new error codes.  Note that we included more defintion of error responses in version 1.1 of the PEP

[ ¤325] Question:

[ ¤326] [ (r_kumpf) Can you please clarify the meaning of this parameter? Should 'maximum' have been 'minimum'? I would have expected that the server would ultimately own the decision about when to time out a context, not the client.
[
¤327]
¤45] Operation Timeout value - This set the maximum time the server must wait between client pull operations before timing out the context for an existing operation sequence

[ ¤328] Response: Correct should have been mininum. This was corrected.

[ ¤329] Question:

  • [ ¤331] [ (r_kumpf) Is an enumeration context associated with a user? If I could guess someone else's enumeration context, could I 'steal' some of their instances?
    [
    ¤332]
    ¤50] Upon a successful open operation response, the client may execute pull operations to request more objects.  
  • [ ¤333]  

    [ ¤334] Response:  At this point it is not specifically limited to a user.  This is a valid question and one that we should probably address.  However since we are using a guid for the context, we would expect it would be difficult for another user to grab a valid context.  We could consider extending this to force same user but this should probably be part of the spec, not just our limitation.

    [ ¤335] RESPONSE2: While awaiting further conclusions from the DMTF we will implement this to limit to a single user.  Note that there is a similar issue with namespace.

    [ ¤336]  

    [ ¤337] Question:

  • [ ¤338] [ ¤54] The server must provide a reasonable guarantee that enumeration contexts are unique but there is no clear specification of the time frame for this uniqueness. 
  • [ ¤339] [ (r_kumpf) Is there a specification for the behavior of the server in response to an existing Pull operation when a CloseEnumeration request is made in parallel?
  • [ ¤340]
  • [ ¤341] RESPONSE: There are two possibilities in the spec.  Allow concurrent in which case the close would terminate the Pull or provide the error response indicating that the concurrent close is not allowed.  For this version, I would prefer to do the simpler. We will prohibit the parallel operation until this behavior is fully tested.
  • [ ¤342]
    [
    ¤343]
    (k_schopmeyer) What is teh expected value if there is a timeout during the operation
  • [ ¤344]  

    [ ¤345] Question:

    [ ¤346] [ (r_kumpf) What is the expected behavior if a client times out while waiting for the response to a Pull operation? I wonder if it would make sense to consider a 'blocking' flag for the enumeration. If the 'blocking' flag is false, the server would return 0 instances if it didn't have any available immediately. (Think non-blocking socket operation.)
    [
    ¤347]
    ¤56] The enumeration context is to be considered opaque to the client since the form may vary from server to server.  The server may provide a different context definition with each response and the client MUST respond with the context from the most recent operation completed for the target sequence.

    [ ¤348] Response: We have a real issue here in that we can assume that something will be lost if the client times out while any particular operation is in process.  This is one of those disconnect concepts. The client is timing out but the server does not really know about it.  I agree that we should look into Rogers suggestion here.

    [ ¤349] RESPONS2: Further Clarification.  We do operate this way.  If the user has requested but there is nothing available, we will return the response with zero elements rather than waiting.  In the future, we probably need to consider a more complete algorithm because this one can also lead to many "smaller" responses when we have only a few objects but the client has requested a larger number.  However, in the current code we respond with what exists in the OperationAggregator when the Pull Operation is received.

    [ ¤350] However, this still leaves an open issue if a client for some reason does time out.  The pull operation processing logic in the CIMOperationRequestDispatcher does not know that this happened so it would continue to deliver if another pull was received, not knowing that something was lost in the middle.  It would appear that the client must handle this by dropping the context itself.

    [ ¤351]

    [ ¤352] Question:

    [ ¤353] [ (r_kumpf) Is there an expectation that an error will be given precedence over data if the CloseOnError flag is true?
    [
    ¤354]
    ¤100] Note that the specification does not place specific requirements on the order of transmitting an error vs.  data so that the server could elect to send either any already gathered objects and the error for the next request or substitute the error for the returned objects.

    [ ¤355] Response: At this point the specification does not specifically cover this issue.  In general however, if the continueOnError is not set, we have generally agreed that the user considers the error primary and we are OK to close as soon as the error is processed through the dispatcher independent of any return objects that may exist in the dispatcher at the time.  We will shut down the enumeration as rapidly as possible and logical when a

    [ ¤356] Question:

    [ ¤357] (r_kumpf) This summary assumes the client specifically requests a chunked transfer encoding.
    [
    ¤358]
    ¤105]
    [ ¤359] [ ¤106]

    [ ¤360] RESPONSE: This text was extended.

    [ ¤361] Question:

    [ ¤362] [ (r_kumpf) Is an error condition communicated by throwing a CIMException?
    [
    ¤363]
    ¤237]     If unsuccessful, one of the following status codes MUST be returned

    [ ¤364]  Response: Yes. same as existing error conditions.

    [ ¤365] Question:

    [ ¤366] [ (k_schopmeyer) Note that there is one additional interface (PullInstances) that corresponds to the returns from enumerate instances.
    [
    ¤367]
    ¤359]
    [ ¤368] [ ¤360]     /* TBD add description*/

    [ ¤369]

    [ ¤370] Response: We are not implementing the Query function at this point so this Pull is not needed since it is tied to query.

    [ ¤371]  

    [ ¤372] Question:

    [ ¤373] [ (k_schopmeyer) Since the specification is in preliminary status today we have a chance to be certain that the spec meets our needs before it goes final by being one of the early implementations.
    [
    ¤374]
    ¤398] This will be a required part of future CIM Operation over HTTP specifications.   We feel that it is important for Pegasus to support  these operations to achieve the scalability that is becoming important  in production environments

    [ ¤375] Comments from version 1.1 and responses

    [ ¤376] [ (r_kumpf) Is it correct to ignore the filter parameter? I would have thought an error such as CIM_ERR_NOT_SUPPORTED would be returned. (Tag 153 indicates this is handled as an error.)
    [
    ¤377]
    (k_schopmeyer) Change the text to read generate the defined exception if either the filter query language or the filter parameters are provided. Ignored was a poor statement from the first version of the PEP
    [ ¤378] ¤101] Filters - These new operations add the concept of Filters on the operations with two parameters, FilterQueryLanguage and FilterQuery.  However, since the language is not clearly defined today, we propose that the initial

    [ ¤379] RESPONSE: Modified so that we specify any use of these parameters as a server exception.

    [ ¤380] [ (r_kumpf) Will these be experimental interfaces?
    [
    ¤381]
    (k_schopmeyer) Good question. I have not specified them as experimental but should probably be until we get to final spec.
    [ ¤382] ¤128] Define the new operation requests in CIMClient.h and CIMClientInterface.h headers. (See section below for the interface definition)

    [ ¤383] RESPONSE: Yes

    [ ¤384] The Enumeration Context - The specification allows a completely opaque enumeration context that is created by the server for the open operation and returned to the client.  This context must be passed by the client for each pull operation and for the close operation.  Note that it is assumed that the server may modify the context for each pull operation so that the client must always returns the latest enumeration context received on the prior operation.  It is expected that we will use an enumeration context that is simply a guid that is unique so that the context can be found on the server when pull or close operations are received.  In addition, the server will be required to keep interoperation times on the enumeration context and to timeout and remove an enumeration context when the timer runs out.  In our c
    [ ¤385] [ (r_kumpf) The previous sentence is incomplete. How is the interoperation timeout measured?
    [
    ¤386]
    ¤135]

    [ ¤387] RESPONSE: Corrected

    [ ¤388] [ (r_kumpf) Why is this an error? The server may elect to return fewer objects (see tag 47).
    [
    ¤389]
    (k_schopmeyer) We have a choice here to reject as invalid or simply respond with our max limit. the DMTF spec is unclear on any particular behavior.
    [ ¤390] ¤155] Reject if the maxObjectCount is set higher than the server-defined limit.

    [ ¤391] RESPONSE: Modified so that this is NOT an error

    [ ¤392] [ ¤158] Pull Operations on existing enumeration contexts will use the Operation Aggregation object  to meter segments of objects from the providers to the correct output queue and with counts of the objects in each response corresponding to the Pull request.  In effect, the OperationAggregate is the central point where responses from the providers/repository and temporarily held and then metered out as responses to the operation originator in accordance with received pull operations.
    [ ¤393] [ (r_kumpf) I guess the client has no way to specify a minimum object count? So the server could return one instance per pull operation if it wanted to, or it could always wait for maxObjectCount objects before responding?
    [
    ¤394]
    (k_schopmeyer) Correct, simply a max limit. Zero is a valid lower limit and allows the client to reset the interoperation timer without getting any new objects.
    [ ¤395] ¤159]

    [ ¤396] RESPONSE: No correction necessary. 

    [ ¤397] [ (r_kumpf) Since the specification is preliminary (tag 440), I guess we will need a build variable to allow support for the new operations to be disabled?
    [
    ¤398]
    (k_schopmeyer) Agreed
    [ ¤399] ¤181]

    [ ¤400] RESPONSE: Agreed that these funcitons will be conditional operation.  This does not mean that we will disable all the code if the functions are disabled, just the operation of the functions.  Env Var added.

    [ ¤401] [ ¤373]     /* TBD add description*/
    [ ¤402] [ (r_kumpf) Are these interface declarations intended to be literal, or just representative? The method names should start with a lower case letter, for consistency. Also, the 'with' should have a capital W.
    [
    ¤403]
    (k_schopmeyer) Call them representative. the case was fixed and there will be one more fix over the weekend. Also adding the documentaiton.
    [ ¤404] ¤374]     Array<CIMInstance> PullInstanceswithPath(

    [ ¤405] RESPONSE: They were not updated when the capitalization issues were found.  Updated except that not all comments have been included.

    [ ¤406] RESPONSE2: They have been updated to match CIMClient.h

    [ ¤407] ¤388]     void CloseEnumeration(
    [ ¤408] [ (r_kumpf) Is there a reason the CIMEnumerationContext is not const?
    [
    ¤409]
    (k_schopmeyer) Oversight since this one is IN only
    [ ¤410] ¤389]         CIMEnumerationContext& enumerationContext(
    [ ¤411] [ ¤390]         );

    [ ¤412] RESPONSE: Modify this parameter.

    [ ¤413]  

  • [ ¤414] be issued if the timeout received does not fit within the defined limites
  • [ ¤415] [ (r_kumpf) The Pegasus behavior specified here seems to contradict the statement at tag 172. What happens when a Close request is received while a Pull is outstanding?
    [
    ¤416]
    (k_schopmeyer) The spec allows either the concurrent close or this exception if the implementation choses not to do concurrent close. For the first version, I chose to reject the concurrent close.
    [ ¤417] ¤434] CIM_ERR_PULL_HAS_BEEN_ABANDONED -  This error would be generated by the server if an operation was terminated due to the receipt of a simultaneous close operation during the execution of the Pull/Open operation.   Pegasus will issue this error if a Close or is received while a Pull is active in the server.
  • [ ¤418]
  • [ ¤419]  

    [ ¤420] RESPONSE: we concluded that for the moment, at least, we are not using this exception since we are not yet allowing concurrent close operation. The documentation and code reflect this.

    [ ¤421]  

  • [ ¤422] [ ¤437] CIM_ERR_SERVER_LIMITS_EXCEEDED - The server has failed the operation because it has exceeded some server limits.  Note that this error is really much more general than just the Pull operations.
  • [ ¤423] [ (r_kumpf) Note: Pegasus currently returns an HTTP '503 Service Unavailable' status in this case.
    [
    ¤424]
    (k_schopmeyer) This is a definition in the spec but at this point I don't see any use within the Pegasus environment.
    [ ¤425] ¤438] CIM_ERR_SERVER_IS_SHUTTING_DOWN - The server is in the process of shutting down and cannot process the operation at this time. NOTE: We have not thought out when we would issue this error at this point.
  • [ ¤426]  

    [ ¤427] RESPONSE: We will leave this one in the documentation noting that we do not use it. Note that the client must include this as a possible response but that the Pegasus server will not use it.


    [ ¤428]
    [ ¤429] Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
    [ ¤430] EMC Corporation; Symantec Corporation; The Open Group.
    [ ¤431]
    [ ¤432] Permission is hereby granted, free of charge, to any person obtaining a copy
    [ ¤433] of this software and associated documentation files (the "Software"), to
    [ ¤434] deal in the Software without restriction, including without limitation the
    [ ¤435] rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
    [ ¤436] sell copies of the Software, and to permit persons to whom the Software is
    [ ¤437] furnished to do so, subject to the following conditions:
    [ ¤438]
    [ ¤439] THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
    [ ¤440] ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
    [ ¤441] "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
    [ ¤442] LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
    [ ¤443] PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
    [ ¤444] HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
    [ ¤445] ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
    [ ¤446] WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


    [ ¤447]  

    [ ¤448] Template last modified: March 26th 2006 by Martin Kirk
    [ ¤449]
    Template version: 1.11