X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utilities%2Fovs-vsctl.c;h=a5bd64741af72299f05b675260344c1c0b521a49;hb=7e041ba51410125ec74cba2b5f0b6f1b0481baa9;hp=d752a547d1bb9d11956e1ef63caa61fd22fd9df0;hpb=e49190c4933bdb4219c7fe5fb84768a076a1ff75;p=openvswitch diff --git a/utilities/ovs-vsctl.c b/utilities/ovs-vsctl.c index d752a547..a5bd6474 100644 --- a/utilities/ovs-vsctl.c +++ b/utilities/ovs-vsctl.c @@ -138,9 +138,8 @@ static void parse_command(int argc, char *argv[], struct vsctl_command *); static const struct vsctl_command_syntax *find_command(const char *name); static void run_prerequisites(struct vsctl_command[], size_t n_commands, struct ovsdb_idl *); -static enum ovsdb_idl_txn_status do_vsctl(const char *args, - struct vsctl_command *, size_t n, - struct ovsdb_idl *); +static void do_vsctl(const char *args, struct vsctl_command *, size_t n, + struct ovsdb_idl *); static const struct vsctl_table_class *get_table(const char *table_name); static void set_column(const struct vsctl_table_class *, @@ -156,9 +155,9 @@ int main(int argc, char *argv[]) { extern struct vlog_module VLM_reconnect; - enum ovsdb_idl_txn_status status; struct ovsdb_idl *idl; struct vsctl_command *commands; + unsigned int seqno; size_t n_commands; char *args; @@ -184,14 +183,23 @@ main(int argc, char *argv[]) idl = the_idl = ovsdb_idl_create(db, &ovsrec_idl_class, false); run_prerequisites(commands, n_commands, idl); - /* Now execute the commands. */ - status = TXN_AGAIN_WAIT; + /* Execute the commands. + * + * 'seqno' is the database sequence number for which we last tried to + * execute our transaction. There's no point in trying to commit more than + * once for any given sequence number, because if the transaction fails + * it's because the database changed and we need to obtain an up-to-date + * view of the database before we try the transaction again. */ + seqno = ovsdb_idl_get_seqno(idl); for (;;) { - if (ovsdb_idl_run(idl) || status == TXN_AGAIN_NOW) { - status = do_vsctl(args, commands, n_commands, idl); + ovsdb_idl_run(idl); + + if (seqno != ovsdb_idl_get_seqno(idl)) { + seqno = ovsdb_idl_get_seqno(idl); + do_vsctl(args, commands, n_commands, idl); } - if (status != TXN_AGAIN_NOW) { + if (seqno == ovsdb_idl_get_seqno(idl)) { ovsdb_idl_wait(idl); poll_block(); } @@ -3597,20 +3605,6 @@ cmd_wait_until(struct vsctl_context *ctx) } } -static struct json * -where_uuid_equals(const struct uuid *uuid) -{ - return - json_array_create_1( - json_array_create_3( - json_string_create("_uuid"), - json_string_create("=="), - json_array_create_2( - json_string_create("uuid"), - json_string_create_nocopy( - xasprintf(UUID_FMT, UUID_ARGS(uuid)))))); -} - static void vsctl_context_init(struct vsctl_context *ctx, struct vsctl_command *command, struct ovsdb_idl *idl, struct ovsdb_idl_txn *txn, @@ -3666,7 +3660,7 @@ run_prerequisites(struct vsctl_command *commands, size_t n_commands, } } -static enum ovsdb_idl_txn_status +static void do_vsctl(const char *args, struct vsctl_command *commands, size_t n_commands, struct ovsdb_idl *idl) { @@ -3693,9 +3687,8 @@ do_vsctl(const char *args, struct vsctl_command *commands, size_t n_commands, } if (wait_for_reload) { - struct json *where = where_uuid_equals(&ovs->header_.uuid); - ovsdb_idl_txn_increment(txn, "Open_vSwitch", "next_cfg", where); - json_destroy(where); + ovsdb_idl_txn_increment(txn, &ovs->header_, + &ovsrec_open_vswitch_col_next_cfg); } symtab = ovsdb_symbol_table_create(); @@ -3713,7 +3706,7 @@ do_vsctl(const char *args, struct vsctl_command *commands, size_t n_commands, vsctl_context_done(&ctx, c); if (ctx.try_again) { - status = TXN_AGAIN_WAIT; + status = TXN_TRY_AGAIN; goto try_again; } } @@ -3770,8 +3763,7 @@ do_vsctl(const char *args, struct vsctl_command *commands, size_t n_commands, case TXN_SUCCESS: break; - case TXN_AGAIN_WAIT: - case TXN_AGAIN_NOW: + case TXN_TRY_AGAIN: goto try_again; case TXN_ERROR: @@ -3855,8 +3847,6 @@ try_again: free(c->table); } free(error); - - return status; } static const struct vsctl_command_syntax all_commands[] = {