void classifierd_wait(void) { if (classifierd_run_timer) { poll_timer_wait_until(time_msec() + CLASSIFIERD_RUN_TIMER_INTERVAL_MSEC); classifierd_run_timer = false; } ovsdb_idl_wait(idl); } /* classifierd_wait */
static void get_initial_snapshot(struct ovsdb_idl *idl) { while (1) { ovsdb_idl_run(idl); if (ovsdb_idl_has_ever_connected(idl)) { return; } ovsdb_idl_wait(idl); poll_block(); } }
static void idl_loop_commit_and_wait(struct idl_loop *loop) { if (loop->open_txn) { loop->committing_txn = loop->open_txn; loop->open_txn = NULL; loop->precommit_seqno = ovsdb_idl_get_seqno(loop->idl); } struct ovsdb_idl_txn *txn = loop->committing_txn; if (txn) { enum ovsdb_idl_txn_status status = ovsdb_idl_txn_commit(txn); if (status != TXN_INCOMPLETE) { switch (status) { case TXN_TRY_AGAIN: /* We want to re-evaluate the database when it's changed from * the contents that it had when we started the commit. (That * might have already happened.) */ loop->skip_seqno = loop->precommit_seqno; if (ovsdb_idl_get_seqno(loop->idl) != loop->skip_seqno) { poll_immediate_wake(); } break; case TXN_SUCCESS: /* If the database has already changed since we started the * commit, re-evaluate it immediately to avoid missing a change * for a while. */ if (ovsdb_idl_get_seqno(loop->idl) != loop->precommit_seqno) { poll_immediate_wake(); } break; case TXN_UNCHANGED: case TXN_ABORTED: case TXN_NOT_LOCKED: case TXN_ERROR: break; case TXN_UNCOMMITTED: case TXN_INCOMPLETE: OVS_NOT_REACHED(); } ovsdb_idl_txn_destroy(txn); loop->committing_txn = NULL; } } ovsdb_idl_wait(loop->idl); }
/* Retrieves the OVN Southbound remote location from the * "external-ids:ovn-remote" key in 'ovs_idl' and returns a copy of it. * * XXX ovn-controller does not support this changing mid-run, but that should * be addressed later. */ static char * get_ovnsb_remote(struct ovsdb_idl *ovs_idl) { while (1) { ovsdb_idl_run(ovs_idl); const struct ovsrec_open_vswitch *cfg = ovsrec_open_vswitch_first(ovs_idl); if (cfg) { const char *remote = smap_get(&cfg->external_ids, "ovn-remote"); if (remote) { return xstrdup(remote); } } VLOG_INFO("OVN OVSDB remote not specified. Waiting..."); ovsdb_idl_wait(ovs_idl); poll_block(); } }
int main(int argc, char *argv[]) { struct ovsdb_idl *idl; struct ctl_command *commands; struct shash local_options; unsigned int seqno; size_t n_commands; char *args; set_program_name(argv[0]); fatal_ignore_sigpipe(); vlog_set_levels(NULL, VLF_CONSOLE, VLL_WARN); vlog_set_levels_from_string_assert("reconnect:warn"); sbrec_init(); sbctl_cmd_init(); /* Log our arguments. This is often valuable for debugging systems. */ args = process_escape_args(argv); VLOG(ctl_might_write_to_db(argv) ? VLL_INFO : VLL_DBG, "Called as %s", args); /* Parse command line. */ shash_init(&local_options); parse_options(argc, argv, &local_options); commands = ctl_parse_commands(argc - optind, argv + optind, &local_options, &n_commands); if (timeout) { time_alarm(timeout); } /* Initialize IDL. */ idl = the_idl = ovsdb_idl_create(db, &sbrec_idl_class, false, false); run_prerequisites(commands, n_commands, idl); /* 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 (;;) { ovsdb_idl_run(idl); if (!ovsdb_idl_is_alive(idl)) { int retval = ovsdb_idl_get_last_error(idl); ctl_fatal("%s: database connection failed (%s)", db, ovs_retval_to_string(retval)); } if (seqno != ovsdb_idl_get_seqno(idl)) { seqno = ovsdb_idl_get_seqno(idl); if (do_sbctl(args, commands, n_commands, idl)) { free(args); exit(EXIT_SUCCESS); } } if (seqno == ovsdb_idl_get_seqno(idl)) { ovsdb_idl_wait(idl); poll_block(); } } }