X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fset%2Fgnunet-service-set.h;h=68d8fe81f60a6a75fcffdaa7247765fca3a1ffc8;hb=6a4d709e73096dde998015e5851b0022ecf8af0a;hp=b92eb47ff1bb61cbfd9b75d3bc6c160ced2e13ee;hpb=82f034f771b4fd8e18c61487f4bd239e0e200408;p=oweals%2Fgnunet.git diff --git a/src/set/gnunet-service-set.h b/src/set/gnunet-service-set.h index b92eb47ff..68d8fe81f 100644 --- a/src/set/gnunet-service-set.h +++ b/src/set/gnunet-service-set.h @@ -1,6 +1,6 @@ /* This file is part of GNUnet - (C) 2013 Christian Grothoff (and other contributing authors) + Copyright (C) 2013, 2014 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -14,10 +14,9 @@ You should have received a copy of the GNU General Public License along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ - /** * @file set/gnunet-service-set.h * @brief common components for the implementation the different set operations @@ -120,6 +119,30 @@ struct OperationSpecification * When are elements sent to the client, and which elements are sent? */ enum GNUNET_SET_ResultMode result_mode; + + /** + * Always use delta operation instead of sending full sets, + * even it it's less efficient. + */ + int force_delta; + + /** + * Always send full sets, even if delta operations would + * be more efficient. + */ + int force_full; + + /** + * #GNUNET_YES to fail operations where Byzantine faults + * are suspected + */ + int byzantine; + + /** + * Lower bound for the set size, used only when + * byzantine mode is enabled. + */ + int byzantine_lower_bound; }; @@ -127,7 +150,7 @@ struct OperationSpecification * Signature of functions that create the implementation-specific * state for a set supporting a specific operation. * - * @return a set state specific to the supported operation + * @return a set state specific to the supported operation, NULL on error */ typedef struct SetState * (*CreateImpl) (void); @@ -166,13 +189,27 @@ typedef void /** - * Signature of functions that implement the creation of set operations - * (currently "evaluate" and "accept"). + * Signature of functions that implement accepting a set operation. + * + * @param op operation that is created by accepting the operation, + * should be initialized by the implementation + */ +typedef void +(*OpAcceptImpl) (struct Operation *op); + + +/** + * Signature of functions that implement starting the evaluation of + * set operations. * - * @param op operation that is created, should be initialized by the implementation + * @param op operation that is created, should be initialized to + * begin the evaluation + * @param opaque_context message to be transmitted to the listener + * to convince him to accept, may be NULL */ typedef void -(*OpCreateImpl) (struct Operation *op); +(*OpEvaluateImpl) (struct Operation *op, + const struct GNUNET_MessageHeader *opaque_context); /** @@ -198,6 +235,10 @@ typedef void (*CancelImpl) (struct Operation *op); +typedef struct SetState * +(*CopyStateImpl) (struct Set *op); + + /** * Dispatch table for a specific set operation. Every set operation * has to implement the callback in this struct. @@ -222,12 +263,12 @@ struct SetVT /** * Callback for accepting a set operation request */ - OpCreateImpl accept; + OpAcceptImpl accept; /** * Callback for starting evaluation with a remote peer. */ - OpCreateImpl evaluate; + OpEvaluateImpl evaluate; /** * Callback for destruction of the set state. @@ -248,6 +289,30 @@ struct SetVT * Callback for canceling an operation by its ID. */ CancelImpl cancel; + + CopyStateImpl copy_state; +}; + + +/** + * MutationEvent gives information about changes + * to an element (removal / addition) in a set content. + */ +struct MutationEvent +{ + /** + * First generation affected by this mutation event. + * + * If @a generation is 0, this mutation event is a list + * sentinel element. + */ + unsigned int generation; + + /** + * If @a added is #GNUNET_YES, then this is a + * `remove` event, otherwise it is an `add` event. + */ + int added; }; @@ -272,22 +337,20 @@ struct ElementEntry struct GNUNET_HashCode element_hash; /** - * Generation the element was added by the client. - * Operations of earlier generations will not consider the element. - */ - unsigned int generation_added; - - /** - * Generation the element was removed by the client. - * Operations of later generations will not consider the element. - * Only valid if @e removed is #GNUNET_YES. + * If @a mutations is not NULL, it contains + * a list of mutations, ordered by increasing generation. + * The list is terminated by a sentinel event with `generation` + * set to 0. + * + * If @a mutations is NULL, then this element exists in all generations + * of the respective set content this element belongs to. */ - unsigned int generation_removed; + struct MutationEvent *mutations; /** - * #GNUNET_YES if the element has been removed in some generation. + * Number of elements in the array @a mutations. */ - int removed; + unsigned int mutations_size; /** * #GNUNET_YES if the element is a remote element, and does not belong @@ -297,6 +360,9 @@ struct ElementEntry }; +struct Listener; + + /** * Operation context used to execute a set operation. */ @@ -310,12 +376,17 @@ struct Operation const struct SetVT *vt; /** - * Tunnel to the peer. + * Channel to the peer. */ struct GNUNET_CADET_Channel *channel; /** - * Message queue for the tunnel. + * Port this operation runs on. + */ + struct Listener *listener; + + /** + * Message queue for the channel. */ struct GNUNET_MQ_Handle *mq; @@ -327,7 +398,9 @@ struct Operation struct OperationSpecification *spec; /** - * Operation-specific operation state. + * Operation-specific operation state. Note that the exact + * type depends on this being a union or intersection operation + * (and thus on @e vt). */ struct OperationState *state; @@ -341,6 +414,25 @@ struct Operation */ struct Operation *prev; + /** + * The identity of the requesting peer. Needs to + * be stored here as the op spec might not have been created yet. + */ + struct GNUNET_PeerIdentity peer; + + /** + * Timeout task, if the incoming peer has not been accepted + * after the timeout, it will be disconnected. + */ + struct GNUNET_SCHEDULER_Task *timeout_task; + + /** + * Unique request id for the request from a remote peer, sent to the + * client, which will accept or reject the request. Set to '0' iff + * the request has not been suggested yet. + */ + uint32_t suggest_id; + /** * #GNUNET_YES if this is not a "real" set operation yet, and we still * need to wait for the other peer to give us more details. @@ -354,10 +446,81 @@ struct Operation unsigned int generation_created; /** - * Set to #GNUNET_YES if the set service should not free the - * operation, as it is still needed (e.g. in some scheduled task). + * Incremented whenever (during shutdown) some component still + * needs to do something with this before the operation is freed. + * (Used as a reference counter, but only during termination.) */ - int keep; + unsigned int keep; +}; + + +/** + * SetContent stores the actual set elements, + * which may be shared by multiple generations derived + * from one set. + */ +struct SetContent +{ + /** + * Number of references to the content. + */ + unsigned int refcount; + + /** + * Maps `struct GNUNET_HashCode *` to `struct ElementEntry *`. + */ + struct GNUNET_CONTAINER_MultiHashMap *elements; + + unsigned int latest_generation; + + /** + * Mutations requested by the client that we're + * unable to execute right now because we're iterating + * over the underlying hash map of elements. + */ + struct PendingMutation *pending_mutations_head; + + /** + * Mutations requested by the client that we're + * unable to execute right now because we're iterating + * over the underlying hash map of elements. + */ + struct PendingMutation *pending_mutations_tail; + + /** + * Number of concurrently active iterators. + */ + int iterator_count; +}; + + +struct GenerationRange +{ + /** + * First generation that is excluded. + */ + unsigned int start; + + /** + * Generation after the last excluded generation. + */ + unsigned int end; +}; + + +struct PendingMutation +{ + struct PendingMutation *prev; + struct PendingMutation *next; + + struct Set *set; + + /** + * Message that describes the desired mutation. + * May only be a #GNUNET_MESSAGE_TYPE_SET_ADD or + * #GNUNET_MESSAGE_TYPE_SET_REMOVE. + */ + struct GNUNET_MessageHeader *mutation_message; }; @@ -381,7 +544,7 @@ struct Set * Client that owns the set. Only one client may own a set, * and there can only be one set per client. */ - struct GNUNET_SERVER_Client *client; + struct GNUNET_SERVICE_Client *client; /** * Message queue for the client. @@ -408,11 +571,6 @@ struct Set */ struct GNUNET_CONTAINER_MultiHashMapIterator *iter; - /** - * Maps `struct GNUNET_HashCode *` to `struct ElementEntry *`. - */ - struct GNUNET_CONTAINER_MultiHashMap *elements; - /** * Evaluate operations are held in a linked list. */ @@ -425,18 +583,47 @@ struct Set /** * Current generation, that is, number of previously executed - * operations on this set + * operations and lazy copies on the underlying set content. */ unsigned int current_generation; + /** + * List of generations we have to exclude, due to lazy copies. + */ + struct GenerationRange *excluded_generations; + + /** + * Number of elements in array @a excluded_generations. + */ + unsigned int excluded_generations_size; + /** * Type of operation supported for this set */ enum GNUNET_SET_OperationType operation; + /** + * Each @e iter is assigned a unique number, so that the client + * can distinguish iterations. + */ + uint16_t iteration_id; + + /** + * Generation we're currently iteration over. + */ + unsigned int iter_generation; + + /** + * Content, possibly shared by multiple sets, + * and thus reference counted. + */ + struct SetContent *content; }; +extern struct GNUNET_STATISTICS_Handle *_GSS_statistics; + + /** * Destroy the given operation. Call the implementation-specific * cancel function of the operation. Disconnects from the remote @@ -444,9 +631,11 @@ struct Set * operations per set. * * @param op operation to destroy + * @param gc #GNUNET_YES to perform garbage collection on the set */ void -_GSS_operation_destroy (struct Operation *op); +_GSS_operation_destroy (struct Operation *op, + int gc); /** @@ -467,4 +656,13 @@ const struct SetVT * _GSS_intersection_vt (void); +int +_GSS_is_element_of_set (struct ElementEntry *ee, + struct Set *set); + +int +_GSS_is_element_of_operation (struct ElementEntry *ee, + struct Operation *op); + + #endif