On 4/13/21 12:00 AM, Ilya Maximets wrote:
> This is required for the stream record/replay functionality of
> ovsdb-server.  With record/replay of UUIDs we could record all
> incoming transactions and replay them later while being sure
> that ovsdb-server will generate exactly same UUIDs for all the
> data updates.
> 
> Signed-off-by: Ilya Maximets <[email protected]>
> ---

I have a few minor nits below but regardless:

Acked-by: Dumitru Ceara <[email protected]>

>  lib/uuid.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 76 insertions(+)
> 
> diff --git a/lib/uuid.c b/lib/uuid.c
> index 13d20ac64..8a16606da 100644
> --- a/lib/uuid.c
> +++ b/lib/uuid.c
> @@ -26,11 +26,16 @@
>  
>  #include "aes128.h"
>  #include "entropy.h"
> +#include "fatal-signal.h"
> +#include "openvswitch/vlog.h"
> +#include "ovs-replay.h"
>  #include "ovs-thread.h"
>  #include "sha1.h"
>  #include "timeval.h"
>  #include "util.h"
>  
> +VLOG_DEFINE_THIS_MODULE(uuid);
> +
>  static struct aes128 key;
>  static uint64_t counter[2];
>  BUILD_ASSERT_DECL(sizeof counter == 16);
> @@ -54,6 +59,63 @@ uuid_init(void)
>      pthread_once(&once, do_init);
>  }
>  
> +/* Record/replay of uuid generation. */
> +static replay_file_t uuid_replay_file;
> +static int uuid_replay_seqno;
> +
> +static void
> +uuid_replay_file_close(void *aux OVS_UNUSED)
> +{
> +    ovs_replay_file_close(uuid_replay_file);
> +}
> +
> +static void
> +uuid_replay_file_open(void)
> +{
> +    int error;
> +
> +    ovs_replay_lock();
> +    error = ovs_replay_file_open("__uuid_generate", &uuid_replay_file,
> +                                 &uuid_replay_seqno);
> +    ovs_replay_unlock();
> +    if (error) {
> +        VLOG_FATAL("failed to open uuid replay file: %s.",
> +                   ovs_strerror(error));
> +    }
> +    fatal_signal_add_hook(uuid_replay_file_close, NULL, NULL, true);
> +}
> +
> +static void
> +uuid_replay_file_read(struct uuid *uuid)
> +{
> +    int norm_seqno = ovs_replay_normalized_seqno(uuid_replay_seqno);
> +    int retval, len;
> +
> +    ovs_replay_lock();
> +    ovs_assert(norm_seqno == ovs_replay_seqno());
> +    ovs_assert(ovs_replay_seqno_is_read(uuid_replay_seqno));
> +
> +    retval = ovs_replay_read(uuid_replay_file, uuid, sizeof *uuid,
> +                             &len, &uuid_replay_seqno, true);
> +    if (retval || len != sizeof *uuid) {
> +        VLOG_FATAL("failed to read from replay file: %s.",
> +                   ovs_strerror(retval));
> +    }
> +    ovs_replay_unlock();
> +}
> +
> +static void
> +uuid_replay_file_write(struct uuid *uuid)
> +{
> +    int retval;
> +
> +    retval = ovs_replay_write(uuid_replay_file, uuid, sizeof *uuid, true);
> +    if (retval) {
> +        VLOG_FATAL("failed to write uuid to replay file: %s.",
> +                   ovs_strerror(retval));
> +    }
> +}
> +
>  /* Generates a new random UUID in 'uuid'.
>   *
>   * We go to some trouble to ensure as best we can that the generated UUID has
> @@ -82,10 +144,16 @@ void
>  uuid_generate(struct uuid *uuid)
>  {
>      static struct ovs_mutex mutex = OVS_MUTEX_INITIALIZER;
> +    enum ovs_replay_state replay_state = ovs_replay_get_state();
>      uint64_t copy[2];
>  
>      uuid_init();
>  
> +    if (replay_state == OVS_REPLAY_READ) {

Would OVS_UNLIKELY() make sense here?

> +        uuid_replay_file_read(uuid);
> +        return;
> +    }
> +
>      /* Copy out the counter's current value, then increment it. */
>      ovs_mutex_lock(&mutex);
>      copy[0] = counter[0];
> @@ -99,6 +167,10 @@ uuid_generate(struct uuid *uuid)
>      aes128_encrypt(&key, copy, uuid);
>  
>      uuid_set_bits_v4(uuid);
> +
> +    if (replay_state == OVS_REPLAY_WRITE) {

Same question here.

> +        uuid_replay_file_write(uuid);
> +    }
>  }
>  
>  struct uuid
> @@ -276,6 +348,10 @@ do_init(void)
>      uint8_t random_seed[16];
>      struct timeval now;
>  
> +    if (ovs_replay_is_active()) {
> +        uuid_replay_file_open();
> +    }
> +
>      /* Get seed data. */
>      get_entropy_or_die(random_seed, sizeof random_seed);
>      xgettimeofday(&now);
> 

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to