On 1/10/24 20:29, Frode Nordahl wrote:
> During testing of the implementation of cooperative multitasking
> in the ovsdb-server we noticed that the very first yield being
> called in the jsonrpc-server always fired.
> 
> This indicates that the operations being after/before storage run
> is taking too long as it currently is.
> 
> Moving the storage run section to the top of the main loop lead
> to successful results using less yield calls as documented in the
> commit message of the next commit in this series.

I don't really understand what exactly is taking so much time and
why moving this part of the code helps.  Could you elaborate?

Best regards, Ilya Maximets.

> 
> Signed-off-by: Frode Nordahl <[email protected]>
> ---
>  ovsdb/ovsdb-server.c | 56 +++++++++++++++++++++++---------------------
>  1 file changed, 29 insertions(+), 27 deletions(-)
> 
> diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c
> index 4d29043f4..e1d4b1125 100644
> --- a/ovsdb/ovsdb-server.c
> +++ b/ovsdb/ovsdb-server.c
> @@ -195,6 +195,34 @@ main_loop(struct server_config *config,
>      ssl_error = NULL;
>      remotes_error = NULL;
>      while (!*exiting) {
> +        SHASH_FOR_EACH_SAFE (node, all_dbs) {
> +            struct db *db = node->data;
> +
> +            ovsdb_storage_run(db->db->storage);
> +            read_db(config, db);
> +            /* Run triggers after storage_run and read_db to make sure new 
> raft
> +             * updates are utilized in current iteration. */
> +            if (ovsdb_trigger_run(db->db, time_msec())) {
> +                /* The message below is currently the only reason to 
> disconnect
> +                 * all clients. */
> +                ovsdb_jsonrpc_server_reconnect(
> +                    jsonrpc, false,
> +                    xasprintf("committed %s database schema conversion",
> +                              db->db->name));
> +            }
> +            if (ovsdb_storage_is_dead(db->db->storage)) {
> +                VLOG_INFO("%s: removing database because storage 
> disconnected "
> +                          "permanently", node->name);
> +                remove_db(config, node,
> +                          xasprintf("removing database %s because storage "
> +                                    "disconnected permanently", node->name));
> +            } else if (!ovsdb_snapshot_in_progress(db->db)
> +                       && (ovsdb_storage_should_snapshot(db->db->storage) ||
> +                           ovsdb_snapshot_ready(db->db))) {
> +                log_and_free_error(ovsdb_snapshot(db->db, trim_memory));
> +            }
> +        }
> +
>          memory_run();
>          if (memory_should_report()) {
>              struct simap usage;
> @@ -221,6 +249,7 @@ main_loop(struct server_config *config,
>              reconfigure_remotes(jsonrpc, all_dbs, remotes),
>              &remotes_error);
>          report_error_if_changed(reconfigure_ssl(all_dbs), &ssl_error);
> +
>          ovsdb_jsonrpc_server_run(jsonrpc);
>  
>          if (*is_backup) {
> @@ -233,33 +262,6 @@ main_loop(struct server_config *config,
>  
>          ovsdb_relay_run();
>  
> -        SHASH_FOR_EACH_SAFE (node, all_dbs) {
> -            struct db *db = node->data;
> -
> -            ovsdb_storage_run(db->db->storage);
> -            read_db(config, db);
> -            /* Run triggers after storage_run and read_db to make sure new 
> raft
> -             * updates are utilized in current iteration. */
> -            if (ovsdb_trigger_run(db->db, time_msec())) {
> -                /* The message below is currently the only reason to 
> disconnect
> -                 * all clients. */
> -                ovsdb_jsonrpc_server_reconnect(
> -                    jsonrpc, false,
> -                    xasprintf("committed %s database schema conversion",
> -                              db->db->name));
> -            }
> -            if (ovsdb_storage_is_dead(db->db->storage)) {
> -                VLOG_INFO("%s: removing database because storage 
> disconnected "
> -                          "permanently", node->name);
> -                remove_db(config, node,
> -                          xasprintf("removing database %s because storage "
> -                                    "disconnected permanently", node->name));
> -            } else if (!ovsdb_snapshot_in_progress(db->db)
> -                       && (ovsdb_storage_should_snapshot(db->db->storage) ||
> -                           ovsdb_snapshot_ready(db->db))) {
> -                log_and_free_error(ovsdb_snapshot(db->db, trim_memory));
> -            }
> -        }
>          if (run_process) {
>              process_run();
>              if (process_exited(run_process)) {

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

Reply via email to