00001 /* 00002 * Copyright (C) 2009, Edmundo Albuquerque de Souza e Silva. 00003 * 00004 * This file may be distributed under the terms of the Q Public License 00005 * as defined by Trolltech AS of Norway and appearing in the file 00006 * LICENSE.QPL included in the packaging of this file. 00007 * 00008 * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING 00009 * THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00010 * PURPOSE. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, 00011 * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING 00012 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, 00013 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 00014 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 00015 * 00016 * Thanks: Jose Renato Santos 00017 * 00018 */ 00019 00020 /////////////////////////////////////////////////////////////////// 00021 // SystemManager.h: Declaration of the CSystemManager 00022 ////////////////////////////////////////////////////////////////////// 00023 00024 #ifndef __SYSTEMMANAGER_H_ 00025 #define __SYSTEMMANAGER_H_ 00026 00027 #include <stdio.h> 00028 00029 #include "MonitorTable.h" 00030 #include "token.h" 00031 00032 class CObjectManager; 00033 class CRouter; 00034 class CStreamManager; 00035 class CSessionManager; 00036 class CConnectionManager; 00037 class CUserManager; 00038 class DiskMgr; 00039 00040 class CSystemManager 00041 { 00042 private: 00043 // RIO system configuration values 00044 int m_BlockSize; 00045 int m_MaxDisks; 00046 int m_MaxReplications; 00047 int m_UseReplications; 00048 int m_MaxDataRequests; 00049 int m_MaxPendingRequests; 00050 char *m_FileRoot; 00051 char *m_MetaRoot; 00052 char *m_UserRoot; 00053 int m_MaxSessions; 00054 int m_MaxStreams; 00055 int m_MaxOpenObjects; 00056 double m_MaxRate; 00057 double m_NRTReservedRate; 00058 00059 int m_NumberOfBuffersForEachClient; 00060 int m_BurstSizeOfEachClient; 00061 int m_MaxNumberAtDiskQueueToEachClient; 00062 char *m_CollectMeasures; 00063 char *m_UseServerSideBuffers; 00064 char *m_UseNewCAC; 00065 double m_NetworkRate; 00066 double m_EstimatedTimeParameter; 00067 double m_MaxIntervalEmpty; 00068 int m_NumberOfEmptyTimes; 00069 // -------------------------------------------------------------------- 00070 00071 /* Enables/Disables log generation */ 00072 int m_GenerateLogs; 00073 00074 // RIO object pointers 00075 DiskMgr *m_DiskMgr; 00076 CObjectManager *m_objectManager; 00077 CRouter *m_Router; 00078 CStreamManager *m_StreamManager; 00079 CSessionManager *m_SessionManager; 00080 CConnectionManager *m_ConnectionManager; 00081 CUserManager *m_UserManager; 00082 00083 bool m_initialized; 00084 bool m_started; 00085 00086 // Nova variavel que contera o diretorio onde os arquivos de 00087 // configuracao do servidor (RIOsystem.cfg e RIOdisk.cfg) e o arquivo 00088 // de senhas (RIOpasswd) estao armazenados. 00089 char *m_ConfigsDirectory; 00090 // Nova variavel que contera o diretorio onde os logs do servidor 00091 // (gerados pelas diversas classes que o compoe) serao gerados. 00092 char *m_LogsDirectory; 00093 // Novos campos usados para fazermos mais de uma tentativa ao 00094 // conectarmos com os servidores de armazenamento definidos em 00095 // RIOdisk.cfg. 00096 int m_MaxAttempts; 00097 int m_TimeBetweenAttempts; 00098 // Novo parametro usado para indicar o tempo maximo que o servidor 00099 // espera por uma requisicao de um cliente antes de fechar a conexao com 00100 // a suposicao de que ela caiu. 00101 int m_ClientsTimeOut; 00102 // Novo parametro que armazena o tamanho que o arquivo de log deve 00103 // atingir antes de o log ser compactado. 00104 unsigned int m_MaxLogFileSize; 00105 // Tamanho maximo ocupado por todos os logs (apos este tamanho, os logs 00106 // compactados mais antigos serao removidos ate que o tamanho deixe de 00107 // passar do maximo). 00108 unsigned long long int m_MaxCombinedLogFilesSize; 00109 // Nova variavel usada para indicar se o salvamento dos logs esta ou 00110 // nao habilitado 00111 char *m_SaveLogs; 00112 00113 // SystemManager internal functions 00114 int Format(); 00115 int ReadConfiguration(); 00116 int CheckConfiguration(); 00117 int CheckString(const char *name, const char *x); 00118 void printSystemConfiguration(); 00119 int Start(); 00120 00121 int StartDiskMgr(int formatflag); 00122 int StartObjectManager(); 00123 int StartRouter(); 00124 int StartStreamManager(); 00125 int StartSessionManager(); 00126 int StartConnectionManager(); 00127 int StartUserManager(); 00128 int FreeMembers(); 00129 00130 //Monitor Table 00131 MonitorTable m_MonitorTable; 00132 00133 static void *MonitorTableTrigger(void *); 00134 00135 public: 00136 CSystemManager(); 00137 ~CSystemManager(); 00138 00139 // Agora o metodo Run da classe CSystemManager possuira um novo 00140 // parametro, do tipo (char *), que contera o prefixo dos diretorios em 00141 // as configuracoes (RIOsystem.cfg, RIOdisk.cfg e RIOpasswd) devem ser 00142 // lidas (etc) e onde os logs devem ser salvos (var). Por default, esta 00143 // variavel sera NULL, e as configuracoes serao lidas do diretorio em 00144 // que o codigo do servidor esta e os logs serao salvos neste mesmo 00145 // diretorio. 00146 int Run( int DebugFlag, int FormatFlag, char *PrefixDirectory ); 00147 void PostITEvent( MonitorEvent *event ); 00148 int GetMonitorTable( vector<ClientData> &clientTable, 00149 vector<StorageData> &storageTable ); 00150 /** 00151 * Funcao para invalidar todos os mapeamentos dos clientes conectados 00152 * para um servidor de armazenamento identificado pela ID passada como 00153 * parametro. 00154 * @param StorageId Identificador do servidor de armazenamento. 00155 */ 00156 void InvalidateStorageNatMappings( int StorageId ); 00157 /** 00158 * Funcao para alterar o valor do numero de discos do servidor. Ela foi 00159 * necessaria porque, quando os servidores de armazenamento inicializam 00160 * apos o servidor. 00161 * @param NumberOfDisks novo numero de discos. 00162 */ 00163 void SetNumberOfDisks( unsigned int NumberOfDisks ); 00164 /** 00165 * Funcao que para todos os modulos do servidor RIO. Agora a funcao e 00166 * publica porque precisamos parar estes modulos quando recebermos o 00167 * sinal SIGTERM. 00168 */ 00169 int Stop(); 00170 00171 }; 00172 00173 #endif //__SYSTEMMANAGER_H_