X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fset%2Fgnunet-service-set.h;h=86313d17966c4182023f56ac51d807129e0bfa2a;hb=dda2c14c04b6ef6275934e752c6952f9e35dbf44;hp=b2904dc062e298e87ac10b183f973afe11b70bb9;hpb=6e92863ee3b53577d31f4a0e3bf5bad8e47f4437;p=oweals%2Fgnunet.git diff --git a/src/set/gnunet-service-set.h b/src/set/gnunet-service-set.h index b2904dc06..86313d179 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, 2014 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,8 +14,8 @@ 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 @@ -119,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; }; @@ -126,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); @@ -188,20 +212,6 @@ typedef void const struct GNUNET_MessageHeader *opaque_context); -/** - * Signature of functions that implement the message handling for - * the different set operations. - * - * @param op operation state - * @param msg received message - * @return #GNUNET_OK on success, #GNUNET_SYSERR to - * destroy the operation and the tunnel - */ -typedef int -(*MsgHandlerImpl) (struct Operation *op, - const struct GNUNET_MessageHeader *msg); - - /** * Signature of functions that implement operation cancellation * @@ -211,6 +221,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. @@ -247,11 +261,6 @@ struct SetVT */ DestroySetImpl destroy_set; - /** - * Callback for handling operation-specific messages. - */ - MsgHandlerImpl msg_handler; - /** * Callback for handling the remote peer's disconnect. */ @@ -261,6 +270,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; }; @@ -285,22 +318,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 @@ -310,6 +341,9 @@ struct ElementEntry }; +struct Listener; + + /** * Operation context used to execute a set operation. */ @@ -323,12 +357,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; @@ -366,7 +405,12 @@ struct Operation * Timeout task, if the incoming peer has not been accepted * after the timeout, it will be disconnected. */ - GNUNET_SCHEDULER_TaskIdentifier timeout_task; + struct GNUNET_SCHEDULER_Task *timeout_task; + + /** + * The type of the operation. + */ + enum GNUNET_SET_OperationType operation; /** * Unique request id for the request from a remote peer, sent to the @@ -396,6 +440,76 @@ struct Operation }; +/** + * 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; +}; + + /** * A set that supports a specific operation with other peers. */ @@ -416,7 +530,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. @@ -443,11 +557,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. */ @@ -460,10 +569,20 @@ 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 */ @@ -475,9 +594,22 @@ struct Set */ 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 @@ -510,4 +642,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