La présente annexe contient des exemples de fichiers de configuration pour le composant Dispatcher de Load Balancer.
Les exemples de fichiers se trouvent dans le répertoire suivant :
#!/bin/bash # # configuration.sample - Exemple de fichier de configuration pour composant Dispatcher # # # Ce script doit être lancé par le superutilisateur. # # iam=`whoami` # if [ "$iam" != "root" ]if [ "$iam" != "root" ] # then # echo "Vous devez vous connecter en tant que superutilisateur pour exécuter ce script" # exit 2 # fi # # Démarrez d'abord le serveur # # dsserver start # sleep 5 # # Démarrez ensuite l'exécuteur # # dscontrol executor start # # Il est possible d'arrêter le répartiteur à tout moment à l'aide # des commandes "dscontrol executor stop" et "dsserver stop" # pour arrêter respectivement l'exécuteur et le serveur avant # d'arrêter le logiciel Dispatcher. # # L'étape suivante dans la configuration du répartiteur est de définir # l'adresse NFA (adresse de non-réacheminement) et les adresses de clusters. # # L'adresse NFA permet d'accéder à distance au répartiteur # afin d'effectuer des opérations d'administration et de configuration. # Cette adresse est obligatoire car le répartiteur doit acheminer # des paquets vers les adresses de clusters. # # L'adresse CLUSTER correspond au nom d'hôte (ou à l'adresse IP) # auquel les clients distants se connectent. # # Vous pouvez indifféremment utiliser les noms d'hôte et les adresses IP # dans ce fichier. # # NFA=hostname.domain.name # CLUSTER=www.yourcompany.com # echo "Chargement de l'adresse de non réacheminement" # dscontrol executor set nfa $NFA # # L'étape suivante dans la configuration du répartiteur consiste à créer # un cluster. Le répartiteur acheminera les requêtes envoyées # à l'adresse de cluster vers les serveurs associés # à ce cluster. Vous pouvez configurer plusieurs adresses de # clusters et leur associer plusieurs serveurs à l'aide du répartiteur. # Utilisez une configuration similaire pour CLUSTER2, CLUSTER3, etc. # # echo "Chargement de la première adresse de cluster" # dscontrol cluster add $CLUSTER # # L'étape suivante consiste à définir les ports utilisés par ce cluster. # Toute requête reçue par le répartiteur sur un port défini # sera réacheminée vers le port correspondant de l'un # des serveurs. # # echo "Création de ports pour le cluster : $CLUSTER" # dscontrol port add $CLUSTER:20+21+80 # # La dernière étape consiste à associer chaque serveur # aux ports de ce cluster. # Vous pouvez utiliser indifféremment le nom # d'hôte ou l'adresse IP des serveurs. # # SERVER1=server1name.domain.name # SERVER1=nomserveur1.domaine.nom # SERVER2=nomserveur2.domaine.nom # SERVER3=nomserveur3.domaine.nom # echo "Ajout des serveurs" # dscontrol server add $CLUSTER:20+21+80: # $SERVER1+$SERVER2+$SERVER3 # # Nous allons maintenant lancer les composants d'équilibrage de charge # du répartiteur. Le premier composant s'appelle le gestionnaire. # Les autres composants d'équilibrage de charge sont les # conseillers. Si le gestionnaire et les conseillers ne fonctionnent pas, # le répartiteur envoie des requêtes au format de permutation circulaire # (round-robin). Une fois le gestionnaire lancé, les décisions de pondération # basées sur le nombre # de connexions nouvelles et actives sont utilisées, et # les requêtes entrantes # sont envoyées au meilleur serveur. Les conseillers fournissent # au gestionnaire des informations supplémentaires sur la capacité # du serveur de répondre # aux demandes etde déterminer si un serveur fonctionne. Si # si un serveur est actif ou non. Si un conseiller détecte # l'inactivité d'un serveur, ce dernier est arrêté. # ont été définies pour inclure les données de l'assistant) et aucune autre demande n'est envoyée au serveur. # La dernière étape de configuration des composants d'équilibrage de charge # est la définition des proportions du gestionnaire. Ce dernier met à # jour la pondération de chaque serveur en fonction de quatre règles : # 1. Nombre de connexions actives sur chaque serveur. # 2. Nombre de nouvelles connexions sur chaque serveur. # 3. Informations fournies par les conseillers. # 4. Informations fournies par le conseiller au niveau système. # La somme de ces proportion doit être égale à 100. Par exemple, # si l'on définit les proportions du gestionnaire de la façon suivante : # dscontrol manager proportions 48 48 0 0 # 48 % des informations proviendront des connexions nouvelles, 48%, # des connexions actives, 4%, des conseillers et les entrées # système ne sont pas prises en compte. # # REMARQUE : par défaut, les proportions du gestionnaire sont définies à 50 50 0 0. # # echo "Démarrage du gestionnaire (manager)..." # dscontrol manager start # echo "Démarrage du conseiller (advisor) FTP sur le port 21..." # dscontrol advisor start ftp 21 # echo "Démarrage du conseiller (advisor) HTTP sur le port 80..." # dscontrol advisor start http 80 # echo "Démarrage du conseiller (advisor) Telnet sur le port 23..." # dscontrol advisor start telnet 23 # echo "Démarrage du conseiller (advisor) SMTP sur le port 25..." # dscontrol advisor start smtp 25 # echo "Démarrage du conseiller (advisor) POP3 sur le port 110..." # dscontrol advisor start pop3 110 # echo "Démarrage du conseiller (advisor) NNTP sur le port 119..." # dscontrol advisor start nntp 119 # echo "Démarrage du conseiller (advisor) SSL sur le port 443..." # dscontrol advisor start ssl 443 # # echo "Définition des proportions du gestionnaire..." # dscontrol manager proportions 58 40 2 0 # # L'étape finale de la configuration de la machine Dispatcher consiste à affecter # un alias à la carte NIC (Network Interface Card). # # REMARQUE : N'utilisez pas cette commande dans un environnement # haute disponibilité. Les scripts go* configureront les cartes NIC et # le bouclage, si nécessaire. # dscontrol executor configure $CLUSTER # Si l'adresse de cluster se trouve sur une autre carte NIC # ou un sous-réseau autre que ceux de l'adresse NFA, utilisez la syntaxe suivante pour la commande de configuration de cluster. # dscontrol executor configure $CLUSTER tr0 0xfffff800 # tr0 étant votre carte NIC (tr1, la seconde carte réseau en anneau à jeton, # en0 la première carte ethernet) et 0xfffff800 étant un masque # de sous-réseau valide pour votre site. # # # Les commandes suivantes permettent de définir les valeurs par défaut. # Utilisez ces commandes pour modifier les valeurs par défaut. # dscontrol manager loglevel 1 # dscontrol manager logsize 1048576 # dscontrol manager sensitivity 5 # dscontrol manager interval 2 # dscontrol manager refresh 2 # # dscontrol advisor interval ftp 21 5 # dscontrol advisor loglevel ftp 21 1 # dscontrol advisor logsize ftp 21 1048576 # dscontrol advisor timeout ftp 21 unlimited # dscontrol advisor interval telnet 23 5 # dscontrol advisor loglevel telnet 23 1 # dscontrol advisor logsize telnet 23 1048576 # dscontrol advisor timeout telnet 23 unlimited # dscontrol advisor interval smtp 25 5 # dscontrol advisor loglevel smtp 25 1 # dscontrol advisor logsize smtp 25 1048576 # dscontrol advisor timeout smtp 25 unlimited # dscontrol advisor interval http 80 5 # dscontrol advisor loglevel http 80 1 # dscontrol advisor logsize http 80 1048576 # dscontrol advisor timeout http 80 unlimited # dscontrol advisor interval pop3 110 5 # dscontrol advisor loglevel pop3 110 1 # dscontrol advisor logsize pop3 110 1048576 # dscontrol advisor timeout pop3 110 unlimited # dscontrol advisor interval nntp 119 5 # dscontrol advisor loglevel nntp 119 1 # dscontrol advisor logsize nntp 119 1048576 # dscontrol advisor timeout nntp 119 unlimited # dscontrol advisor interval ssl 443 5 # dscontrol advisor loglevel ssl 443 1 # dscontrol advisor logsize ssl 443 1048576 # dscontrol advisor timeout ssl 443 unlimited #
Voici un exemple de fichier de configuration de Load Balancer intitulé configuration.cmd.sample à utiliser sous Windows.
@echo off rem configuration.cmd.sample - Exemple de fichier de configuration pour rem le composant Dispatcher. rem rem Démarrez dsserver à partir du panneau Services rem rem rem Démarrez ensuite l'exécuteur rem rem call dscontrol executor start rem rem L'étape suivante de la configuration de Dispatcher consiste à définir rem l'adresse NFA (adresse de non-réacheminement) et les rem adresses de clusters. rem rem L'adresse NFA permet d'accéder à distance au répartiteur rem afin d'effectuer des opérations d'administration de configuration. rem Cette adresse est obligatoire car le répartiteur doit réacheminer rem des paquets vers les adresses de clusters. rem rem L'adresse CLUSTER est le nom d'hôte (ou l'adresse IP) auquel rem les clients distants se connectent. rem rem Vous pouvez indifféremment utiliser les noms d'hôte et les adresses IP rem dans ce fichier. rem NFA=[adresse de non-réacheminement] rem CLUSTER=[nom du cluster] rem rem set NFA=nom_hôte.domaine.nom rem set CLUSTER=www.votresociété.com rem echo "Chargement de l'adresse de non réacheminement" rem call dscontrol executor set nfa %NFA% rem rem Les valeurs par défaut sont affectées aux commandes suivantes. rem Utilisez ces commandes pour modifier les valeurs par défaut. rem call dscontrol executor set fintimeout 30 rem rem L'étape suivante dans la configuration du répartiteur consiste à créer rem un cluster. Le répartiteur acheminera les requêtes envoyées rem à l'adresse de cluster vers les serveurs associés rem à ce cluster. Vous pouvez configurer plusieurs adresses de rem clusters à l'aide du répartiteur. rem Utilisez une configuration similaire pour CLUSTER2, CLUSTER3, etc. rem rem echo "Chargement de la première adresse de cluster" rem call dscontrol cluster add %CLUSTER% rem rem L'étape suivante consiste à définir les ports utilisés par ce cluster. rem Une requête reçue par le répartiteur sur un port défini rem est réacheminée vers le port correspondant rem de l'un des serveurs. rem rem echo "Création des ports de CLUSTER : %CLUSTER%" rem call dscontrol port add %CLUSTER%:20+21+80 rem rem La dernière étape consiste à associer chaque serveur aux rem ports définis pour le cluster. Vous pouvez utiliser indifféremment rem le nom d'hôte ou l'adresse IP des machines serveurs. rem rem set SERVER1=nomserveur1.domaine.nom rem set SERVER2=nomserveur2.domaine.nom rem set SERVER3=nomserveur3.domaine.nom rem echo "Ajout des serveurs" rem call dscontrol server add %CLUSTER%:20+21+80: rem %SERVER1%+%SERVER2%+%SERVER3% rem rem Nous allons maintenant lancer les composants d'équilibrage de charge rem du répartiteur. Le premier composant s'appelle le gestionnaire. rem Les autres composants d'équilibrage de charge sont les rem conseillers. Si le gestionnaire et les conseillers ne sont pas rem actifs, le répartiteur envoie des requêtes au format de permutation circulaire rem (round-robin). Une fois le gestionnaire lancé, les décisions de rem pondération basées sur le nombre de connexions nouvelles et actives rem sont utilisées et les requêtes entrantes sont envoyées au meilleur rem serveur. Les conseillers donnent un aperçu au gestionnaire de la rem capacité des serveurs à répondre aux requêtes et à détecter rem déterminer si un serveur est arrêté. Si un conseiller détecte rem qu'un serveur est arrêté, il est marqué comme étant arrêté (dès lors que rem les parties gestionnaire ont été définies pour inclure rem les entrées du conseiller) et aucune autre demande n'est envoyée au serveur. rem entrées du conseiller) et aucune requête ne sera acheminée vers le serveur. rem La dernière étape de configuration des composants d'équilibrage de charge rem est la définition des proportions du gestionnaire. Ce dernier met à rem jour la pondération de chaque serveur en fonction rem de quatre règles : rem 1. Nombre de connexions actives sur chaque serveur. rem 2. Nombre de nouvelles connexions pour chaque serveur. rem 3. Informations fournies par les conseillers. rem 4. Informations fournies par le conseiller au niveau système. rem rem La somme de ces proportions doit être égale à 100. Par exemple, rem si l'on définit les proportions avec rem dscontrol cluster set <cluster> proportions 48 48 4 0 rem 48 % des informations proviendront des connexions nouvelles, rem des connexions actives, 4 % des conseillers et les entrées rem du système ne sont pas prises en compte. rem rem REMARQUE : par défaut, les propriétés du gestionnaires sont définies comme suit : rem 50 50 0 0 rem echo "Démarrage du gestionnaire (manager)..." rem call dscontrol manager start rem echo "Démarrage du conseiller (advisor) FTP sur le port 21..." rem call dscontrol advisor start ftp 21 rem echo "Démarrage du conseiller (advisor) HTTP sur le port 80..." rem call dscontrol advisor start http 80 rem echo "Démarrage du conseiller Telnet sur le port 23 ..." rem call dscontrol advisor start telnet 23 rem echo "Démarrage du conseiller SMTP sur le port 25 ..." rem call dscontrol advisor start smtp 25 rem echo "Démarrage du conseiller POP3 sur le port 110 ..." rem call dscontrol advisor start pop3 110 rem echo "Démarrage du conseiller NNTP sur le port 119 ..." rem call dscontrol advisor start nntp 119 rem echo "Démarrage du conseiller SSL sur le port 443 ..." rem call dscontrol advisor start ssl 443 rem rem echo "Définition des proportions du cluster..." rem call dscontrol cluster set %CLUSTER% proportions 58 40 2 0 rem rem L'étape finale de configuration du répartiteur est rem l'affectation d'un alias à la carte d'interface réseau (NIC). rem rem rem REMARQUE : N'utilisez pas cette commande dans un environnement à rem haute disponibilité. Les scripts go* configureront les cartes NIC rem et l'unité de bouclage si nécessaire. rem rem dscontrol executor configure %CLUSTER% rem Si votre adresse de cluster se trouve sur une autre carte NIC rem ou sur un sous-réseau autre que l'adresse NFA, utilisez la rem commande de configuration de cluster suivante. rem dscontrol executor configure %CLUSTER% tr0 0xfffff800 rem où tr0 est la carte NIC (tr1 pour la seconde carte réseau en anneau à jeton, rem en0, la première carte Ethernet) et 0xfffff800, rem un masque de sous-réseau valide de votre site. rem rem rem Les valeurs par défaut sont affectées aux commandes suivantes. rem Utilisez ces commandes pour modifier les valeurs par défaut. rem call dscontrol manager loglevel 1 rem call dscontrol manager logsize 1048576 rem call dscontrol manager sensitivity 5 rem call dscontrol manager interval 2 rem call dscontrol manager refresh 2 rem rem call dscontrol advisor interval ftp 21 5 rem call dscontrol advisor loglevel ftp 21 1 rem call dscontrol advisor logsize ftp 21 1048576 rem call dscontrol advisor timeout ftp 21 unlimited rem call dscontrol advisor interval telnet 23 5 rem call dscontrol advisor loglevel telnet 23 1 rem call dscontrol advisor logsize telnet 23 1048576 rem call dscontrol advisor timeout telnet 23 unlimited rem call dscontrol advisor interval smtp 25 5 rem call dscontrol advisor loglevel smtp 25 1 rem call dscontrol advisor logsize smtp 25 1048576 rem call dscontrol advisor timeout smtp 25 unlimited rem call dscontrol advisor interval http 80 5 rem call dscontrol advisor loglevel http 80 1 rem call dscontrol advisor logsize http 80 1048576 rem call dscontrol advisor timeout http 80 unlimited rem call dscontrol advisor interval pop3 110 5 rem call dscontrol advisor loglevel pop3 110 1 rem call dscontrol advisor logsize pop3 110 1048576 rem call dscontrol advisor timeout pop3 110 unlimited rem call dscontrol advisor interval nntp 119 5 rem call dscontrol advisor loglevel nntp 119 1 rem call dscontrol advisor logsize nntp 119 1048576 rem call dscontrol advisor timeout nntp 119 unlimited rem call dscontrol advisor interval ssl 443 5 rem call dscontrol advisor loglevel ssl 443 1 rem call dscontrol advisor logsize ssl 443 1048576 rem call dscontrol advisor timeout ssl 443 unlimited rem
Vous trouverez ci-dessous un exemple de fichier de conseiller intitulé ADV_type.
/** * ADV_type : Conseiller HTTP de Load Balancer * * * Cette classe définit un exemple de conseiller personnalisé pour Load Balancer. A l'instar de tout * les conseillers, le conseiller personnalisé étend la fonction de la base du conseiller * appelée ADV_Base. C'est en fait la base du conseiller qui exécute * la plupart des fonctions du conseiller, telles que la communication des charges à Load Balancer * pour les utiliser dans l'algorithme de pondération de Load Balancer. * La base du conseiller effectue également les opérations d'ouverture et de * fermeture de socket et fournit des méthodes d'envoi et de * réception au conseiller. Le conseiller lui-même permet uniquement * d'envoyer et de recevoir des données vers et depuis le port du serveur * avisé. Les méthodes TCP de la base de l'assistant sont programmées pour calculer la * la charge. Un indicateur du constructeur de ADV_base remplace, si vous le souhaitez, * la charge existante par la nouvelle charge renvoyée par le conseiller. * * Remarque : en fonction d'une valeur définie dans le constructeur, la base de l'assistant fournit * la charge à l'algorithme de pondération à une fréquence donnée. Si * l'assistant n'a pas terminé ses opérations afin de * renvoyer une charge valide, la base de l'assistant utilise * la charge précédente. * * ATTRIBUTION DE NOM * * La convention d'attribution de nom est la suivante : * * - Le fichier doit se trouver dans le répertoire Load Balancer suivant : * * lb/servers/lib/CustomAdvisors/ (lb\servers\lib\CustomAdvisors sous Windows) * * - Le nom de l'assistant doit être précédé de "ADV". L'assistant peut * être lancé avec uniquement le nom, mais l'assistant "ADV_sample", par exemple, * peut être lancé avec "modèle". * * - Le nom du conseiller doit être en minuscules. * * En respectant ces règles, le chemin et le nom du conseiller * donné en exemple sont les suivants : * * <répertoire de base>/lib/CustomAdvisors/ADV_sample.class * *
* Les conseillers, tout comme les autres éléments de Load Balancer, * doivent être compilés avec la version Java recommandée. Pour * garantir l'accès aux classes Load Balancer, vérifiez que le fichier * ibmlb.jar (dans le sous-répertoire lib du répertoire * de base) figure dans la variable CLASSPATH du système. * * Méthodes fournies par ADV_Base : * * - ADV_Base (Constructeur) : * * - Paramètres * - String sName = Nom du conseiller * - String sVersion = Version du conseiller * - int iDefaultPort = Numéro de port par défaut utilisé par le conseiller * - int iInterval = Intervalle que doivent utiliser les serveurs * - String sDefaultName = Non utilisé. indiquer "". * - boolean replace = True - remplacement de la valeur de la charge * par la base du conseiller * False - ajout à la valeur de la charge calculée * par la base du conseiller * - Return * - Les constructeurs n'ont pas de valeurs de retour. * * la base de conseiller étant basée sur une arborescence, * le conseiller a de nombreuses autres méthodes * d'utilisation à sa disposition. Ces méthodes peuvent * être référencées en utilisant le paramètre CALLER dans * getLoad(). * * Ces méthodes sont les suivantes : * * - send - Envoie un paquet de données concernant la connexion * socket établie sur le port spécifié du serveur. * - Paramètres * - String sDataString - Les données à envoyer se présentent sous forme de chaîne * - Return * - int RC - Indique si les données ont été correctement envoyées ; * un zéro indique que les données ont été envoyées ; un * entier négatif indique une erreur. * * - receive - Reçoit des informations de la connexion socket. * - Paramètres * - StringBuffer sbDataBuffer - Données reçues pendant l'appel * - Return * - int RC - Indique si les données ont été correctement * reçues ; un zéro indique que les données ont été * envoyées ; un entier négatif indique une * erreur. * * Si la fonction fournie par la base du conseiller n'est pas * suffisante, vous pouvez créer la fonction appropriée dans le * conseiller et les méthodes fournies par la base du conseiller * seront alors ignorées. * * Il est essentiel de savoir si la charge renvoyée doit être * appliquée à la charge générée dans la base de l'assistant ou * remplacée ; les deux situations sont possibles. * * Cet exemple concerne principalement l'assistant HTTP de Load Balancer. Son fonctionnement * est très simple : une demande d'envoi (demande HEAD HTTP) est émise. Lorsque la réponse * est reçue, la méthode getLoad prend fin * en indiquant à la base de l'assistant d'arrêter de chronométrer la demande. La méthode se termine. Les * informations renvoyées ne sont pas * analysées ; la charge dépend du délai nécessaire * pour exécuter les opérations d'envoi et de réception. */ package CustomAdvisors; import com.ibm.internet.nd.advisors.*; public class ADV_sample extends ADV_Base implements ADV_MethodInterface { String COPYRIGHT = "(C) Copyright IBM Corporation 1997, Tous droits réservés.\n"; static final String ADV_NAME = "Type"; static final int ADV_DEF_ADV_ON_PORT = 80; static final int ADV_DEF_INTERVAL = 7; // Remarque : La plupart des protocoles de serveur // requièrent un retour chariot ("\r") et un passage à // la ligne ("\n") à la fin des messages. Si tel est le // cas, incluez-les dans la chaîne ci-dessous. static final String ADV_SEND_REQUEST = "HEAD / HTTP/1.0\r\nAccept: */*\r\nUser-Agent: " + "IBM_Load_Balancer_HTTP_Advisor\r\n\r\n"; /** * Constructeur. * * Paramètres : Aucun, mais le constructeur de ADV_Base * comporte plusieurs paramètres qui doivent lui être transmis. * */ public ADV_type() { super( ADV_NAME, "2.0.0.0-03.27.98", ADV_DEF_ADV_ON_PORT, ADV_DEF_INTERVAL, "", // not used false); super.setAdvisor( this ); } /** * ADV_AdvisorInitialize * * Toute initialisation d'assistant qui doit être exécutée après * le démarrage de la base de l'assistant. Cette méthode n'est appelée qu'une seule fois et n'est généralement * pas utilisée. */ public void ADV_AdvisorInitialize() { return; } /** * getLoad() * * Cette méthode est appelée par la base du conseiller pour terminer * l'opération du conseillée, basée sur des détails propres au protocole. * Dans cet exemple de conseiller, une seule opération d'envoi * et de réception est nécessaire ; si une logique plus * complexe est nécessaire, il est possible d'émettre des envois * et réceptions multiples. Par exemple, une réponse peut être * reçue et sa syntaxe peut être analysée. Sur la base * des informations obtenues, un autre ordre d'envoi et de * réception peut alors être émis. * * Paramètres : * * - iConnectTime - la charge actuelle car elle fait référence au temps * nécessaire à l'établissement d'une connexion * avec le serveur sur le port spécifié. * * * - caller - Une référence à la classe de la base du conseiller * dans laquelle les méthodes fournies par Load * Balancer doivent répondre à de simples demandes * TCP, principalement des demandes d'envoi et de * réception. * * Résultats : * * - La charge - Valeur exprimée en millisecondes, pouvant être * ajoutée à la charge existante, ou la remplacer, suivant la * valeur de l'indicateur "replace" du constructeur. * * Plus la charge est importante, plus le serveur met de temps * à répondre et donc plus la charge de Load Balancer diminue. * * Si la valeur est négative, il s'agit d'une erreur. Une erreur * du conseiller indique que le serveur auquel le conseiller tente * d'accéder n'est pas accessible et qu'il est arrêté. Load Balancer * ne tente pas d'équilibrer la charge d'un serveur arrêté. Load Balancer * équilibre de nouveau la charge du serveur lorsqu'une valeur positive est reçue. * */ public int getLoad(int iConnectTime, ADV_Thread caller) { int iRc; int iLoad = ADV_HOST_INACCESSIBLE; // -1 // Send tcp request iRc = caller.send(ADV_SEND_REQUEST); if (iRc >= 0) { // Réception StringBuffer sbReceiveData = new StringBuffer(""); iRc = caller.receive(sbReceiveData); /** * En mode conseiller normal (l'indicateur "replace" a la valeur false), * la valeur renvoyée est 0 ou 1 selon que le serveur est actif ou inactif. * En cas de bonne réception, une charge de zéro est renvoyée pour * indiquer que la charge élaborée dans la base du conseiller n'est pas utilisée. * * Sinon (l'indicateur "replace" a la valeur true), renvoie la valeur de charge souhaitée. */ if (iRc >= 0) { iLoad = 0; } } return iLoad; } } // End - ADV_type