{'fraction_non_alphanumeric': 0.013745704467353952, 'fraction_numerical': 0.0, 'mean_word_length': 5.523809523809524, 'pattern_counts': {'":': 0, '<': 0, '<?xml version=': 0, '>': 0, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
Controlling the order of events in distributed systems

In an asynchronous distributed system, processes communicate only via messages with unbounded transmission time. Relative process speeds are arbitrary and processes do not have access to a common clock. In such systems, it is often easier to develop distributed programs when the underlying system offers certain message ordering guarantees. The main motivation of this dissertation is to provide a framework in which a user can specify the desired characteristics of the underlying system, and a protocol layer maps the underlying asynchronous system to the desired specification. 
The main contribution of this dissertation is an understanding of the limitations of inhibition based protocols (where a protocol operates by delaying events) in implementing message orderings. A message ordering specification is characterized as a set of acceptable runs. We study the problem of determining which message ordering specifications can be implemented in a distributed system. Further, if a specification can be implemented, we give a technique to determine whether it can be implemented by tagging information with user messages or if it requires control messages. To specify the message ordering, we use a novel method called forbidden predicates. All existing message ordering guarantees such as FIFO, flush channels, causal ordering, and logically synchronous ordering, (as well as many new message orderings) can be concisely specified using forbidden predicates. We then present an algorithm that determines from the forbidden predicate the type of protocol needed to implement that specification. 
We present two algorithms for message orderings. First we give an efficient algorithm for synchronous ordering, and second we present a general algorithm to generate protocols implementing a class of specifications that can be implemented by inhibition based protocols without control messages. 
Lastly, we present an implementation of a generator that gives efficient protocols for specifications that can be implemented by inhibition based protocols without control messages. This provides a framework in which a user specifies the desired message ordering and the framework guarantees the specification, insulating the user from the complexities of message orderings.