Incremental macsuck improvements through reduction of database calls
This commit is contained in:
@@ -53,6 +53,8 @@ sub do_macsuck {
|
||||
$device->ip;
|
||||
return;
|
||||
}
|
||||
|
||||
my $ip = $device->ip;
|
||||
|
||||
# would be possible just to use now() on updated records, but by using this
|
||||
# same value for them all, we _can_ if we want add a job at the end to
|
||||
@@ -88,16 +90,17 @@ sub do_macsuck {
|
||||
if ($device_ports->{$port}->is_uplink and not setting('macsuck_bleed')) {
|
||||
debug sprintf
|
||||
' [%s] macsuck - port %s is uplink, topo broken - skipping.',
|
||||
$device->ip, $port;
|
||||
$ip, $port;
|
||||
next;
|
||||
}
|
||||
|
||||
debug sprintf ' [%s] macsuck - port %s vlan %s : %s nodes',
|
||||
$device->ip, $port, $vlan, scalar keys %{ $fwtable->{$vlan}->{$port} };
|
||||
$ip, $port, $vlan, scalar keys %{ $fwtable->{$vlan}->{$port} };
|
||||
|
||||
# make sure this port is UP in netdisco
|
||||
$device_ports->{$port}->update({up_admin => 'up', up => 'up'});
|
||||
|
||||
foreach my $mac (keys %{ $fwtable->{$vlan}->{$port} }) {
|
||||
# make sure this port is UP in netdisco
|
||||
$device_ports->{$port}->update({up_admin => 'up', up => 'up'});
|
||||
|
||||
# get VLAN from Q-BRIDGE if available
|
||||
$vlan = $fwtable->{$vlan}->{$port}->{$mac}
|
||||
@@ -108,13 +111,13 @@ sub do_macsuck {
|
||||
for keys %{ $fwtable->{0} };
|
||||
|
||||
++$total_nodes;
|
||||
store_node($device->ip, $vlan, $port, $mac, $now);
|
||||
store_node($ip, $vlan, $port, $mac, $now);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
debug sprintf ' [%s] macsuck - %s forwarding table entries',
|
||||
$device->ip, $total_nodes;
|
||||
$ip, $total_nodes;
|
||||
$device->update({last_macsuck => \$now});
|
||||
}
|
||||
|
||||
@@ -140,48 +143,33 @@ sub store_node {
|
||||
my $nodes = schema('netdisco')->resultset('Node');
|
||||
|
||||
# TODO: probably needs changing if we're to support VTP domains
|
||||
my $old = $nodes->search({
|
||||
mac => $mac,
|
||||
vlan => $vlan,
|
||||
-bool => 'active',
|
||||
-not => {
|
||||
switch => $ip,
|
||||
port => $port,
|
||||
},
|
||||
});
|
||||
|
||||
# lock rows,
|
||||
# and get the count so we know whether to set time_recent
|
||||
my $old_count = scalar $old->search(undef,
|
||||
{
|
||||
columns => [qw/switch vlan port mac/],
|
||||
for => 'update',
|
||||
})->all;
|
||||
|
||||
$old->update({ active => \'false' });
|
||||
|
||||
my $new = $nodes->search({
|
||||
'me.switch' => $ip,
|
||||
'me.port' => $port,
|
||||
'me.vlan' => $vlan,
|
||||
'me.mac' => $mac,
|
||||
});
|
||||
my $old = $nodes->search(
|
||||
{ mac => $mac,
|
||||
-bool => 'active',
|
||||
-not => {
|
||||
switch => $ip,
|
||||
port => $port,
|
||||
vlan => $vlan,
|
||||
},
|
||||
})->update( { active => \'false' } );
|
||||
|
||||
# new data
|
||||
$new->update_or_create(
|
||||
$nodes->update_or_create(
|
||||
{
|
||||
switch => $ip,
|
||||
port => $port,
|
||||
vlan => $vlan,
|
||||
mac => $mac,
|
||||
active => \'true',
|
||||
oui => substr($mac,0,8),
|
||||
time_last => \$now,
|
||||
($old_count ? (time_recent => \$now) : ()),
|
||||
(($old != 0) ? (time_recent => \$now) : ()),
|
||||
},
|
||||
{ for => 'update' }
|
||||
{
|
||||
key => 'primary',
|
||||
for => 'update',
|
||||
}
|
||||
);
|
||||
|
||||
# upgrade old schema
|
||||
# an entry for this MAC existed in old schema with vlan => null
|
||||
# which now has either vlan number or 0
|
||||
$new->search({vlan => undef})->delete({only_nodes => 1});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
|
||||
BEGIN;
|
||||
|
||||
UPDATE node SET vlan = '0' WHERE vlan IS NULL;
|
||||
|
||||
COMMIT;
|
||||
Reference in New Issue
Block a user