5.3 Der Broker

Der Broker stellt die zentrale Verwaltungsinstanz des Speichersystems dar. Er verteilt die von den Schnittstellenkomponenten eingehenden Aufträge an die Speicher, er beobachtet alle Netzverbindungen und steuert das ganze Speichersystem.

Die Konfiguration des Brokers wird aus einer Konfigurationsdatei gelesen. Die möglichen Parameter sind in Tabelle 5.3 zusammengestellt.





Parameter Argumente Bedeutung



RECEIVE_PORT <port> Portnummer für eingehende Aufträge
von den Schnittstellenkomponenten



CONTROL_PORT <port> Portnummer zum Verbinden eines
Monitor-/Steuerungswerkzeuges



CONNECT_PORT <port> Portnummer zum Verbinden der Speicher



MAX_ORDERS <maxorders> Maximale Anzahl der offenen Aufträge



LOGFILE <logfilename> Dateiname der LOG-Datei




Tabelle 5.3: Parameter des Brokers

Die Parameter RECEIVE_PORT, CONTROL_PORT und CONNECT_PORT können mehr als einmal in der Konfigurationsdatei angegeben werden. Der Broker wartet dann an allen Ports auf einen Verbindungsaufbau durch die jeweiligen Komponenten. Zur Verteilung der Aufträge auf die Speicher wurde ein einfaches Verfahren angewandt. Der Broker unterhält eine Liste aller angemeldeten Speicher. Soll ein Auftrag vermittelt werden, ermittelt der Broker den ersten Speicher in der Speicherliste, der im Zustand active idle ist und leitet den Auftrag an diesen weiter (s. Kapitel 3.4.3).

Verbindet sich ein Monitor-/Steuerungswerkzeug an den Broker, so kann die aktuelle Konfiguration des Brokers durch Senden eines CMD_CONFGET Kommandos erfragt werden. Diese beinhaltet Informationen über

Allen Speichern und dem Broker selbst wird ein innerhalb des Speichersystems eindeutiger Name zugeordnet, der zusammen mit der Konfigurationsinformationen an das Steuerungswerkzeug übertragen wird. Über das Kommando CMD_CHGST <Elementname> <Zustand> kann der Zustand dieser Elemente verändert werden. Der Parameter <Zustand> kann die Werte activ, passiv oder terminated annehmen, um Komponenten zu aktivieren, passivieren oder zu beenden.

Um den Broker anzuhalten oder fortzusetzen, stehen die zwei Kommandos CMD_PAUSE und CMD_CONT zur Verfügung. Zum Wechseln zwischen automatischer Verteilung der Aufträge durch den Broker und manueller Verteilung durch das Monitor-/Steuerungswerkzeug existieren die Kommandos CMD_AUTO und CMD_MAN.

Übermittelt das Monitor-/Steuerungswerkzeug ein Kommando der Form

CMD_MAPJOB <brokerinterne Auftrags-ID> <Speichername>,

während der Broker im Modus für manuelle Verteilung ist, so übermittelt der Broker den Auftrag zur Ausführung an den Speicher und vermerkt dies in seiner Auftragsverwaltung.

Weiterhin besteht die Möglichkeit die Speicher und den Broker durch Senden eines CMD_EXIT oder CMD_QUIT Kommandos auf einmal zu beenden. Im Unterschied zum CMD_QUIT Kommando wartet das CMD_EXIT Kommando bis alle in Bearbeitung befindlichen Aufträge abgearbeitet wurden, um die Speicher und den Broker zu beenden. Das CMD_QUIT Kommando trennt die Speicher und beendet den Broker sofort. Um einen Speicher zu beenden, sendet der Broker ein CMD_EXIT an ihn.

5.3.1 Verwaltung der Aufträge

Der Broker ist für die Auftragsverwaltung zuständig. Die aktiven Verbindungen zu den Schnittstellenkomponenten müssen auf die Verbindungen zu den Speichern abgebildet werden. Zu diesem Zweck wurde eine Klasse (c_joblist) implementiert, die zu jedem Auftrag folgende Informationen speichert:
  1. Auftragsnummer
  2. Socketdeskriptor der Verbindung zur Schnittstellenkomponente, die den Auftrag erteilt hat.
  3. interne Nummer des Speichers
  4. Socketdeskriptor der Verbindung zum Speicher, der den Auftrag erhalten hat.

Die Klasse c_joblist stellt Methoden bereit, um neue Aufträge der Liste hinzuzufügen (addjob), zu löschen (remjob) oder zu modifizieren, sowie Methoden, die unter Angabe eines Socketdeskriptors, die korrespondierende Verbindung ermitteln (get_job_by_iffd, get_job_by_repfd). Abbildung 5.2 zeigt die Klassendefinition der Klasse. Diese Klasse ermöglicht die Identifikation von Auftraggebern und den jeweiligen Speichern, ohne den Auftrag oder das Ergebnis zu lesen oder zu modifizieren. Die Zuordnung erfolgt alleine über die Netzverbindung.


class c_joblist:
   def __init__(self,maxjobs=20):
   def addjob(self,if_fd,ifstate,repnr,rep_fd=-1,repstate=""):
   def remjob(self,jobnr):
   def get_job_by_iffd(self,if_fd):
   def get_job_by_repfd(self,rep_fd):
   def set_ifstate(self,jobnr,newstate):
   def set_repstate(self,jobnr,newstate):


Abbildung 5.2: Die Klassendefinition der Klasse c_joblist