Modified the number of writes to service at most

20 interfaces.

Signed-off-by: Ayan Banerjee <ayan@cumulusnetworks.com>
Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2015-05-19 17:24:43 -07:00
parent 2f8f370e35
commit e8f45e82d4
4 changed files with 69 additions and 35 deletions

View File

@ -640,6 +640,7 @@ ospf_write (struct thread *thread)
{ {
struct ospf *ospf = THREAD_ARG (thread); struct ospf *ospf = THREAD_ARG (thread);
struct ospf_interface *oi; struct ospf_interface *oi;
struct ospf_interface *last_serviced_oi = NULL;
struct ospf_packet *op; struct ospf_packet *op;
struct sockaddr_in sa_dst; struct sockaddr_in sa_dst;
struct ip iph; struct ip iph;
@ -669,16 +670,21 @@ ospf_write (struct thread *thread)
ipid = (time(NULL) & 0xffff); ipid = (time(NULL) & 0xffff);
#endif /* WANT_OSPF_WRITE_FRAGMENT */ #endif /* WANT_OSPF_WRITE_FRAGMENT */
/* convenience - max OSPF data per packet, while ((pkt_count < ospf->write_oi_count) && oi && (last_serviced_oi != oi))
* and reliability - not more data, than our
* socket can accept
*/
maxdatasize = MIN (oi->ifp->mtu, ospf->maxsndbuflen) -
sizeof (struct ip);
while ((pkt_count < ospf->write_multiplier) && ospf_fifo_count(oi->obuf))
{ {
/* If there is only packet in the queue, the oi is removed from
write-q, so fix up the last interface that was serviced */
if (last_serviced_oi == NULL) {
last_serviced_oi = oi;
}
pkt_count++; pkt_count++;
/* convenience - max OSPF data per packet,
* and reliability - not more data, than our
* socket can accept
*/
maxdatasize = MIN (oi->ifp->mtu, ospf->maxsndbuflen) -
sizeof (struct ip);
/* Get one packet from queue. */ /* Get one packet from queue. */
op = ospf_fifo_head (oi->obuf); op = ospf_fifo_head (oi->obuf);
assert (op); assert (op);
@ -804,19 +810,30 @@ ospf_write (struct thread *thread)
/* Now delete packet from queue. */ /* Now delete packet from queue. */
ospf_packet_delete (oi); ospf_packet_delete (oi);
}
/* Move this interface to the tail of write_q to /* Move this interface to the tail of write_q to
serve everyone in a round robin fashion */ serve everyone in a round robin fashion */
list_delete_node (ospf->oi_write_q, node); list_delete_node (ospf->oi_write_q, node);
if (ospf_fifo_head (oi->obuf) == NULL) if (ospf_fifo_head (oi->obuf) == NULL)
{ {
oi->on_write_q = 0; oi->on_write_q = 0;
} last_serviced_oi = NULL;
else oi = NULL;
{ }
listnode_add (ospf->oi_write_q, oi); else
} {
listnode_add (ospf->oi_write_q, oi);
}
/* Setup to service from the head of the queue again */
if (!list_isempty (ospf->oi_write_q))
{
node = listhead (ospf->oi_write_q);
assert (node);
oi = listgetdata (node);
assert (oi);
}
}
/* If packets still remain in queue, call write thread. */ /* If packets still remain in queue, call write thread. */
if (!list_isempty (ospf->oi_write_q)) if (!list_isempty (ospf->oi_write_q))

View File

@ -2533,35 +2533,50 @@ DEFUN (no_ospf_auto_cost_reference_bandwidth,
DEFUN (ospf_write_multiplier, DEFUN (ospf_write_multiplier,
ospf_write_multiplier_cmd, ospf_write_multiplier_cmd,
"write-multiplier <1-50>", "ospf write-multiplier <1-100>",
"Number of writes per thread callback\n") "OSPF specific commands\n"
"Write multiplier\n"
"Maximum number of interface serviced per write\n")
{ {
struct ospf *ospf = vty->index; struct ospf *ospf = vty->index;
u_int32_t write_multiplier; u_int32_t write_oi_count;
write_multiplier = strtol (argv[0], NULL, 10); write_oi_count = strtol (argv[0], NULL, 10);
if (write_multiplier < 1 || write_multiplier > 50) if (write_oi_count < 1 || write_oi_count > 100)
{ {
vty_out (vty, "write-multiplier value is invalid%s", VTY_NEWLINE); vty_out (vty, "write-multiplier value is invalid%s", VTY_NEWLINE);
return CMD_WARNING; return CMD_WARNING;
} }
ospf->write_multiplier = write_multiplier; ospf->write_oi_count = write_oi_count;
return CMD_SUCCESS; return CMD_SUCCESS;
} }
ALIAS (ospf_write_multiplier,
write_multiplier_cmd,
"write-multiplier <1-100>",
"Write multiplier\n"
"Maximum number of interface serviced per write\n")
DEFUN (no_ospf_write_multiplier, DEFUN (no_ospf_write_multiplier,
no_ospf_write_multiplier_cmd, no_ospf_write_multiplier_cmd,
"no write-multiplier", "no ospf write-multiplier",
NO_STR NO_STR
"Number of writes per thread callback\n") "OSPF specific commands\n"
"Write multiplier\n")
{ {
struct ospf *ospf = vty->index; struct ospf *ospf = vty->index;
ospf->write_multiplier = OSPF_WRITE_MULTIPLIER_DEFAULT; ospf->write_oi_count = OSPF_WRITE_INTERFACE_COUNT_DEFAULT;
return CMD_SUCCESS; return CMD_SUCCESS;
} }
ALIAS (no_ospf_write_multiplier,
no_write_multiplier_cmd,
"no write-multiplier",
NO_STR
"Write multiplier\n")
const char *ospf_abr_type_descr_str[] = const char *ospf_abr_type_descr_str[] =
{ {
"Unknown", "Unknown",
@ -2793,7 +2808,7 @@ DEFUN (show_ip_ospf,
/* Show write multiplier values */ /* Show write multiplier values */
vty_out (vty, " Write Multiplier set to %d %s", vty_out (vty, " Write Multiplier set to %d %s",
ospf->write_multiplier, VTY_NEWLINE); ospf->write_oi_count, VTY_NEWLINE);
/* Show refresh parameters. */ /* Show refresh parameters. */
vty_out (vty, " Refresh timer %d secs%s", vty_out (vty, " Refresh timer %d secs%s",
@ -7323,9 +7338,9 @@ ospf_config_write (struct vty *vty)
ospf->spf_max_holdtime, VTY_NEWLINE); ospf->spf_max_holdtime, VTY_NEWLINE);
/* Write multiplier print. */ /* Write multiplier print. */
if (ospf->write_multiplier != OSPF_WRITE_MULTIPLIER_DEFAULT) if (ospf->write_oi_count != OSPF_WRITE_INTERFACE_COUNT_DEFAULT)
vty_out (vty, " ospf write-multiplier %d%s", vty_out (vty, " ospf write-multiplier %d%s",
ospf->write_multiplier, VTY_NEWLINE); ospf->write_oi_count, VTY_NEWLINE);
/* Max-metric router-lsa print */ /* Max-metric router-lsa print */
config_write_stub_router (vty, ospf); config_write_stub_router (vty, ospf);
@ -7766,6 +7781,8 @@ ospf_vty_init (void)
/* write multiplier commands */ /* write multiplier commands */
install_element (OSPF_NODE, &ospf_write_multiplier_cmd); install_element (OSPF_NODE, &ospf_write_multiplier_cmd);
install_element (OSPF_NODE, &no_ospf_write_multiplier_cmd); install_element (OSPF_NODE, &no_ospf_write_multiplier_cmd);
install_element (OSPF_NODE, &write_multiplier_cmd);
install_element (OSPF_NODE, &no_write_multiplier_cmd);
/* Init interface related vty commands. */ /* Init interface related vty commands. */
ospf_vty_if_init (); ospf_vty_if_init ();

View File

@ -233,7 +233,7 @@ ospf_new (void)
} }
new->t_read = thread_add_read (master, ospf_read, new, new->fd); new->t_read = thread_add_read (master, ospf_read, new, new->fd);
new->oi_write_q = list_new (); new->oi_write_q = list_new ();
new->write_multiplier = OSPF_WRITE_MULTIPLIER_DEFAULT; new->write_oi_count = OSPF_WRITE_INTERFACE_COUNT_DEFAULT;
return new; return new;
} }

View File

@ -219,8 +219,8 @@ struct ospf
struct thread *t_deferred_shutdown; /* deferred/stub-router shutdown timer*/ struct thread *t_deferred_shutdown; /* deferred/stub-router shutdown timer*/
struct thread *t_write; struct thread *t_write;
#define OSPF_WRITE_MULTIPLIER_DEFAULT 3 #define OSPF_WRITE_INTERFACE_COUNT_DEFAULT 20
int write_multiplier; /* Num of packets sent per thread invocation */ int write_oi_count; /* Num of packets sent per thread invocation */
struct thread *t_read; struct thread *t_read;
int fd; int fd;
unsigned int maxsndbuflen; unsigned int maxsndbuflen;