diff --git a/lib/northbound_cli.c b/lib/northbound_cli.c index f9794bee3c..b199dd61f8 100644 --- a/lib/northbound_cli.c +++ b/lib/northbound_cli.c @@ -83,6 +83,7 @@ static int nb_cli_classic_commit(struct vty *vty) static void nb_cli_pending_commit_clear(struct vty *vty) { vty->pending_commit = 0; + vty->buffer_cmd_count = 0; XFREE(MTYPE_TMP, vty->pending_cmds_buf); vty->pending_cmds_buflen = 0; vty->pending_cmds_bufpos = 0; @@ -102,12 +103,19 @@ int nb_cli_pending_commit_check(struct vty *vty) static int nb_cli_schedule_command(struct vty *vty) { - /* Append command to dynamically sized buffer of scheduled commands. */ + /* Append command to dynamically sized buffer of scheduled commands. + * vty->buf -Incoming config + * vty->pending_cmds_buf - Pending buffer where incoming configs are + * accumulated for later processing + * vty->pending_cmds_bufpos - length of the pending buffer + * + */ if (!vty->pending_cmds_buf) { vty->pending_cmds_buflen = 4096; vty->pending_cmds_buf = XCALLOC(MTYPE_TMP, vty->pending_cmds_buflen); } + if ((strlen(vty->buf) + 3) > (vty->pending_cmds_buflen - vty->pending_cmds_bufpos)) { vty->pending_cmds_buflen *= 2; @@ -121,6 +129,9 @@ static int nb_cli_schedule_command(struct vty *vty) /* Schedule the commit operation. */ vty->pending_commit = 1; + vty->buffer_cmd_count++; + if (vty->buffer_cmd_count == NB_CMD_BATCH_SIZE) + nb_cli_pending_commit_check(vty); return CMD_SUCCESS; } diff --git a/lib/northbound_cli.h b/lib/northbound_cli.h index 4c8dc50bd2..43c40f49e1 100644 --- a/lib/northbound_cli.h +++ b/lib/northbound_cli.h @@ -20,6 +20,9 @@ enum nb_cfg_format { NB_CFG_FMT_XML, }; +/* Maximum config commands in a batch*/ +#define NB_CMD_BATCH_SIZE 5000 + extern struct nb_config *vty_shared_candidate_config; /* diff --git a/lib/vty.h b/lib/vty.h index be54159aa9..c6f9f5a3a7 100644 --- a/lib/vty.h +++ b/lib/vty.h @@ -149,6 +149,7 @@ struct vty { struct nb_config *candidate_config_base; /* Dynamic transaction information. */ + size_t buffer_cmd_count; bool pending_allowed; bool pending_commit; char *pending_cmds_buf;