optimize DB fetch in syncdomain.php
authorAlexey Andriyanov <alan@al-an.info>
Mon, 6 Apr 2015 11:17:26 +0000 (14:17 +0300)
committerAlexey Andriyanov <alan@al-an.info>
Mon, 6 Apr 2015 11:34:55 +0000 (14:34 +0300)
In large 802.1q environments syncdomain used to spend much time
(~ 1 minute) to prefetch DB data and prepare the deploy queue.
This was happen due to many sequential calls to getVLANSwitchInfo,
spotEntity and considerConfiguredConstraint.

This commit replaces those calls by just two bulk queries:
getVLANSwitchInfoRows, listConstraint.

The performance impact is 5 times faster in my environment.

scripts/syncdomain.php

index b36408aac59c902f0582f4604da07b618f135876..e1cdd01952604ccaad65dde7a8bc108285daf86f 100755 (executable)
@@ -57,23 +57,6 @@ default:
 $max = array_fetch ($options, 'max', 0);
 $nolock = array_key_exists ('nolock', $options);
 
-$switch_list = array();
-if (! isset ($options['vdid']))
-       $switch_list = getVLANSwitches();
-else
-       try
-       {
-               $mydomain = getVLANDomain ($options['vdid']);
-               foreach ($mydomain['switchlist'] as $switch)
-                       $switch_list[] = $switch['object_id'];
-       }
-       catch (RackTablesError $e)
-       {
-               print_message_line ("Cannot load domain data with ID ${options['vdid']}");
-               print_message_line ($e->getMessage());
-               exit (1);
-       }
-
 $todo = array
 (
        'pull' => array ('sync_ready', 'resync_ready'),
@@ -119,12 +102,17 @@ if (! $nolock)
 }
 
 // fetch all the needed data from DB (preparing for DB connection loss)
+$vswitch_filter = array();
+if (isset ($options['vdid']))
+       $vswitch_filter['domain_id'] = $options['vdid'];
+$switch_list = getVLANSwitchInfoRows ($vswitch_filter);
+$enabled_switches = listConstraint ('object', 'SYNC_802Q_LISTSRC');
+
 $switch_queue = array();
-foreach ($switch_list as $object_id)
+foreach ($switch_list as $vswitch)
 {
-       $cell = spotEntity ('object', $object_id);
-       $new_disabled = ! considerConfiguredConstraint ($cell, 'SYNC_802Q_LISTSRC');
-       $vswitch = getVLANSwitchInfo ($object_id);
+       $object_id = $vswitch['object_id'];
+       $new_disabled = ! isset ($enabled_switches[$object_id]);
        $queue = detectVLANSwitchQueue ($vswitch);
        if ($queue != 'disabled' && $new_disabled)
        {
@@ -139,7 +127,7 @@ foreach ($switch_list as $object_id)
        }
 
        if (in_array ($queue, $todo[$options['mode']]))
-               $switch_queue[] = $cell;
+               $switch_queue[] = spotEntity ('object', $object_id);
 }
 
 // YOU SHOULD NOT USE DB FUNCTIONS BELOW IN THE PARENT PROCESS