main.cpp File Reference

#include <extern.h>
#include <iostream>
#include <string.h>
#include <signal.h>
#include <execinfo.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <getopt.h>
#include <vsisemaphore.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/syscall.h>
#include "../interface/RioError.h"
#include "../interface/RioTypes.h"
#include "token.h"

Go to the source code of this file.

Data Structures

struct  StorageServerConfig

Functions

void usage (char *progname)
void show_stackframe ()
 Handles the SEGFAULT.
void segfaultHandler (int sig)
void signalHandler (int sig)
void PrintConfiguration (StorageServerConfig *Config)
int CheckConfiguration (StorageServerConfig *Config)
int ReadConfiguration (char *ConfigsDirectory, StorageServerConfig *Config)
int main (int argc, char *argv[])

Variables

static char Usage []
static char Usage2 []
const char *const CONFIGSSUBDIR = "etc/RIO/"
const char *const LOGSSUBDIR = "var/log/RIO/"
const char *const CONFIGNAME = "RIOstorage.cfg"
CvsiSemaphore Finish (0)

Function Documentation

int CheckConfiguration ( StorageServerConfig Config  ) 

Definition at line 194 of file storage/main.cpp.

00195 {
00196 
00197     if( Config->Buffers <= 0 )
00198     {
00199        // Number of buffers =
00200        //                   (number of buffers to each client (max 20???) + 1)
00201        //                    * max number of clients (100???) + extra
00202        Config->Buffers = ( ( 20 + 1 ) * 100 + 10 ) * 1;
00203     }
00204 
00205     if( ( strcasecmp( Config->CollectMeasures, "on" ) != 0 ) &&
00206        ( strcasecmp( Config->CollectMeasures, "off" ) != 0 ))
00207     {
00208         RioErr << "ERROR: CheckConfiguration "
00209                << "CollectMeasures: " << Config->CollectMeasures
00210                << " invalid (must be 'on' or 'off')" << endl;
00211         return ( 1 );
00212     }
00213 
00214     if( ( Config->EstimatedParameter < 0 ) || 
00215         ( Config->EstimatedParameter > 1 ) )
00216     {
00217         RioErr << "ERROR: CheckConfiguration Invalid EstimatedParameter: " 
00218                << Config->EstimatedParameter << endl;
00219         return ( 1 );
00220     }
00221 
00222     if( ( Config->SendFlag != 1 ) && (  Config->SendFlag != 0 ) )
00223     {
00224         Config->SendFlag = 1;
00225     }
00226 
00227     if( Config->MaxClientsCredits <= 0 )
00228     {
00229         RioErr << "ERROR: CheckConfiguration Invalid number of client credits: " 
00230                << Config->MaxClientsCredits << endl;
00231         return ( 1 );
00232     }
00233 
00234     if( Config->MaxNetworkCredits <= 0 )
00235     {
00236         RioErr << "ERROR: CheckConfiguration Invalid number of network "
00237                << "credits: " << Config->MaxNetworkCredits << endl;
00238         return ( 1 );
00239     }
00240 
00241     if( ( Config->RouterPort <= 0) || ( Config->RouterPort > 0xffff ) )
00242     {
00243         RioErr << "ERROR: CheckConfiguration Invalid port number: " 
00244                << Config->RouterPort << endl;
00245         return( 1 );
00246     }
00247 
00248     if( Config->NetworkRate <= 0 )
00249     {
00250         RioErr << "ERROR: CheckConfiguration Invalid number of network "
00251                << "rate: " << Config->NetworkRate << endl;
00252         return ( 1 );
00253     }
00254 
00255     if( Config->DiskThreads <= 0 )
00256     {
00257         RioErr << "ERROR: CheckConfiguration Invalid number of disk threads: " 
00258                << Config->DiskThreads << endl;
00259         return ( 1 );
00260     }
00261 
00262     // Novas opcoes usadas pelo gerenciamento dos logs para limitar o tamanho
00263     // do arquivo de log nao compactado e o tamanho total combinado de todos
00264     // os logs (compactados ou nao).
00265     
00266     if( Config->MaxLogFileSize <= 0 )
00267     {
00268         RioErr << "ERROR: CheckConfiguration Invalid maximum uncompacted log "
00269                << "size: " << Config->MaxLogFileSize << endl;
00270         return ( 1 );
00271     }
00272 
00273     if( Config->MaxCombinedLogFilesSize <= 0 )
00274     {
00275         RioErr << "ERROR: CheckConfiguration Invalid total maximum combined "
00276                << "logs sizes: " << Config->MaxCombinedLogFilesSize << endl;
00277         return ( 1 );
00278     }
00279 
00280     // Nova opcao para definir se os logs devem ou nao ser salvos, ou seja, se 
00281     // devemos ou nao somente executar buscas nestes logs.
00282     if( ( Config->SaveLogs != NULL ) && 
00283         ( strcasecmp( Config->SaveLogs, "on" ) != 0 ) &&
00284         ( strcasecmp( Config->SaveLogs, "off" ) != 0 ) )
00285     {
00286         RioErr << "ERROR: CheckConfiguration LogRotation value" 
00287                << Config->SaveLogs << " invalid (must be 'on' or 'off')" 
00288                << endl;
00289         return ( 1 );
00290     }
00291 
00292     // Nova opcao usada para definir o tempo maximo de inatividade das conexoes
00293     // TCP de cada cliente com o servidor de armazenamento.
00294     if( Config->ClientsTimeOut <= 0 )
00295     {
00296         RioErr << "ERROR: CheckConfiguration Invalid connection timeout: "
00297                << Config->ClientsTimeOut << endl;
00298         return ( 1 );
00299     }
00300 
00301     // Imprime as configuracoes
00302     PrintConfiguration( Config );
00303     
00304     return 0;
00305 }

int main ( int  argc,
char *  argv[] 
)

Definition at line 460 of file storage/main.cpp.

00461 {
00462     unsigned int i;
00463     struct in_addr storageip;
00464     int port;
00465     char c;
00466     int stat;
00467     StorageServerConfig StorageConfig;
00468     int ind = -1;
00469     // A opcao -l, que definia o diretorio dos logs, foi removida (junto com 
00470     // as outras opcoes que estao agora no arquivo de configuracao), e foi
00471     // substituida pela opcao -p, que define agora o prefixo onde os logs 
00472     // serao salvos (em prefixo/var/log/RIO) e de onde leremos o arquivo de
00473     // configuracao (de prefixo/etc/RIO).
00474     static char opts_short[] = "hn:p:v";
00475     static struct option opts_int[] =
00476     {
00477        {"help"             ,0,0,'h'},
00478        {"logsdirectory"    ,1,0,'l'},
00479        {"ndisks"           ,1,0,'n'},
00480        // Nova opcao para permitir que o arquivo de configuracao e os logs 
00481        // estejam em um diretorio diferente do que esta o servidor. Os arquivos 
00482        // de configuracao estarao em no subdiretorio etc/RIO e os arquivos de 
00483        // log no subdiretorio var/log/RIO.
00484        {"prefixdirectory"  ,1,0,'p'},
00485        {"version"          ,0,0,'v'},
00486        {0,0,0,0}
00487     };
00488     
00489     // default parameters
00490     int nDisks = 1;
00491     bool CollectMeasures = false;
00492     // Variavel usada para armazenar se devemos ou nao salvar os logs.
00493     bool SaveLogs = true;
00494     // Armazena o estado da execucao da NetInterface.
00495     RioResult RioStatus;
00496     
00497     // Parametros originais do servidor de armazenamento.
00498     StorageConfig.Buffers = 0;
00499     StorageConfig.RouterPort = 5101;
00500     StorageConfig.SendFlag = 1;
00501     StorageConfig.DiskThreads = 1;
00502     StorageConfig.EstimatedParameter = 0;
00503     StorageConfig.CollectMeasures = NULL;
00504     StorageConfig.ClientsTimeOut = 18000;
00505     // Por default, vamos supor que os logs devem ser salvos.
00506     StorageConfig.SaveLogs = NULL;
00507     // Prefixo do diretorio com o arquivo de configuracao e com os logs. O 
00508     // arquivo de configuracao sera lido de Prefixo/etc/RIO, e os logs serao
00509     // salvos em Prefixo/var/log/RIO. Default: NULL, indicando que os logs 
00510     // devem ser armazenados no diretorio onde esta o codigo do servidor de
00511     // armazenamento, e o arquivo de configuracao do servidor.
00512     char *PrefixDirectory = NULL;
00513     // Diretorio com o arquivo de configuracao do storage.
00514     char *ConfigsDirectory = NULL;
00515     // Diretorio onde os arquivos de logs serao salvos.
00516     char *LogsDirectory = NULL;
00517     // Taxa de transmissao de dados em Mbps [default = 100 -> 100Mbps].
00518     StorageConfig.NetworkRate = 100;
00519     // Numero maximo de creditos da rede (usado ao enviarmos os fragmentos)
00520     // [default = 1].
00521     StorageConfig.MaxNetworkCredits = 1; 
00522     // Numero maximo de creditos dos clientes (usado ao enviarmos os 
00523     // fragmentos) [default = 1].
00524     StorageConfig.MaxClientsCredits = 1; 
00525     // Tamanho maximo do arquivo de log nao compactado (log rotation)
00526     StorageConfig.MaxLogFileSize = MAXLOGFILESIZE;
00527     // Tamanho maximo combinado de todos os arquivos com os logs (log rotation)
00528     StorageConfig.MaxCombinedLogFilesSize = MAXCOMBINEDLOGSFILESIZE;
00529     // ------------------------------------------------------------------------
00530 
00531     RioErr << "MAINTHREADID " << syscall( SYS_gettid ) << endl;
00532 
00533     char *ProgName = argv[ 0 ];
00534 
00535     signal( SIGSEGV, segfaultHandler );
00536     signal( SIGTERM, signalHandler );
00537 
00538     while( (c = getopt_long( argc, argv, opts_short, opts_int, &ind )) != -1 )
00539     {
00540         switch( c )
00541         {
00542             case 'n':
00543                 nDisks = atoi(optarg);
00544                 break;
00545             case 'h':
00546                 usage(ProgName);
00547                 return (0);
00548             case 'v':
00549                 cout << "RIOStorage version: " << VERSION << endl;
00550                 exit( 0 );
00551             // Nova opcao para ler o diretorio onde os logs do storage server
00552             // serao armazenados
00553             case 'p':
00554                 PrefixDirectory = optarg;
00555                 break;
00556             // Nova opcao para ler o numero maximo de creditos ao enviarmos
00557             // fragmentos para os clientes.
00558             default:
00559                 usage( ProgName );
00560                 return( 1 );
00561         }
00562     }
00563 
00564     if( ( argc - optind ) < nDisks )
00565     {
00566         RioErr << "ERROR: Missing device names" << endl;
00567         usage( ProgName );
00568         return( 1 );
00569     }
00570     
00571     // Inicializa as variaveis com o diretorio onde os arquivos de
00572     // configuracao do servidor e os arquivos com as senhas, e com o 
00573     // diretorio onde os logs serao armazenados.
00574     if( PrefixDirectory == NULL )
00575     {
00576         // Se um prefixo nao foi passado, entao inicializamos os dois
00577         // diretorios com uma string vazia, para que os arquivos sejam
00578         // lidos e salvos no diretorio em que o codigo binario do servidor
00579         // esta armazenado.
00580         ConfigsDirectory = new char[ 1 ];
00581         if( ConfigsDirectory == NULL )
00582         {
00583             RioErr << "ERROR: Erro ao alocar a memoria" << endl;
00584             return ( 1 );
00585         }
00586         LogsDirectory = new char[ 1 ];
00587         if( LogsDirectory == NULL )
00588         {
00589             RioErr << "ERROR: Erro ao alocar a memoria" << endl;
00590             delete[] ConfigsDirectory;
00591             return ( 1 );
00592         }
00593         ConfigsDirectory[ 0 ] = 0;
00594         LogsDirectory[ 0 ] = 0;
00595     }
00596     else
00597     {
00598         // Devemos agora verificar se o prefixo do nome do diretorio passado
00599         // como parametro possui, no final, uma "/".
00600         unsigned int PrefixDirectorySize, ConfigsDirectorySize, 
00601                      LogsDirectorySize;
00602         PrefixDirectorySize = strlen( PrefixDirectory );
00603         ConfigsDirectorySize = PrefixDirectorySize + strlen( CONFIGSSUBDIR ) +
00604                                1;
00605         LogsDirectorySize = PrefixDirectorySize + strlen( LOGSSUBDIR ) + 1;
00606         // Verifica se o prefixo do diretorio termina ou nao com uma '/'.
00607         if( PrefixDirectory[ PrefixDirectorySize - 1 ] != '/' ) 
00608         {
00609             // Como nao temos uma "/" deveremos coloca-la e, com isso, o 
00610             // tamanho de ambos os nomes de diretorio aumentarao em uma
00611             // unidade.
00612             ConfigsDirectorySize++;
00613             LogsDirectorySize++;
00614         } 
00615         ConfigsDirectory = new char[ ConfigsDirectorySize ];
00616         if( ConfigsDirectory == NULL )
00617         {
00618             RioErr << "ERROR: Erro ao alocar a memoria" << endl;
00619             return ( 1 );
00620         }
00621         LogsDirectory = new char[ LogsDirectorySize ];
00622         if( LogsDirectory == NULL )
00623         {
00624             RioErr << "ERROR: Erro ao alocar a memoria" << endl;
00625             delete[] ConfigsDirectory;
00626             return ( 1 );
00627         }
00628         strcpy( ConfigsDirectory, PrefixDirectory );
00629         strcpy( LogsDirectory, PrefixDirectory );
00630         if( PrefixDirectory[ PrefixDirectorySize - 1 ] != '/' )
00631         {
00632             // Como nao temos uma '/' deveremos coloca-la em ambos os nomes
00633             // de diretorio.
00634             strcat( ConfigsDirectory, "/" );
00635             strcat( LogsDirectory, "/" );
00636         }
00637         strcat( ConfigsDirectory, CONFIGSSUBDIR );
00638         strcat( LogsDirectory, LOGSSUBDIR );
00639     }
00640     
00641     if( ( nDisks <= 0 ) || ( nDisks > MAXSTORAGEDISKSARRAY ) )
00642     {
00643         RioErr << "ERROR: Invalid number of disks: " << nDisks << endl;
00644         return(1);
00645     }
00646 
00647     // Le as configuracoes do arquivo de configuracao do storage.
00648     
00649     stat = ReadConfiguration( ConfigsDirectory, &StorageConfig );
00650 
00651     if( stat ) 
00652     {
00653         RioErr << "ERROR: ReadConfiguration failed" << endl;
00654         RioErr << "Storage not running. Check error messages!" << endl;
00655         delete ConfigsDirectory;
00656         delete LogsDirectory;
00657         if( StorageConfig.CollectMeasures != NULL )
00658             delete StorageConfig.CollectMeasures;
00659         return (1);
00660     } 
00661     
00662     // Inicializa o valor de CollectMeasures.
00663     if( StorageConfig.CollectMeasures != NULL )
00664         CollectMeasures = ( strcasecmp( StorageConfig.CollectMeasures, "on" ) 
00665                         == 0 );
00666 
00667     // Inicializa o valor de SaveLogs, usado para definir se devemos ou nao
00668     // salvar os logs.
00669     if( StorageConfig.SaveLogs != NULL )
00670         SaveLogs = ( strcasecmp( StorageConfig.SaveLogs, "on" ) == 0 );
00671 
00672     // Remove a string com o diretorio do arquivo de configuracao e a string
00673     // StorageConfig.CollectMeasures.
00674     // Obs: o que devemos fazer com as strings LogsDirectory e 
00675     // StorageConfig.InterfaceName? Elas nao podem ser removidas aqui porque
00676     // sao usadas pelas threads do servidor de armazanemento, e a thread 
00677     // principal parece acabar depois de que as outras threads iniciam com
00678     // sucesso.
00679     
00680     delete ConfigsDirectory;
00681     if( StorageConfig.CollectMeasures != NULL )
00682         delete StorageConfig.CollectMeasures;
00683     
00684     RioErr << "CollectMeasures: \t"    << CollectMeasures << endl;
00685     RioErr << "EstimatedParameter: \t" << StorageConfig.EstimatedParameter 
00686            << endl << endl;
00687     // ------------------------------------------------------------------------
00688 
00689     Config.nDisks     = (u32) nDisks;
00690     //Config.FragSize   = (u32) StorageConfig.BufferSize;
00691     Config.BufferSize = (u32) StorageConfig.Buffers;
00692     Config.MaxReqSize = 1;
00693     Config.MaxReq     = (u32) StorageConfig.Buffers;
00694     Config.RouterPort = (u16) StorageConfig.RouterPort;
00695     Config.Disk       = new DiskConfig[Config.nDisks];
00696 
00697     // Get Device names
00698     for(i=0; i < Config.nDisks; i++)
00699     {
00700         Config.Disk[i].Name = argv[i+optind];
00701     }
00702 
00703     Device = new CStorageDevice[Config.nDisks];
00704     if(Device == 0)
00705     {
00706         RioErr << "Error when creating device class: Not enough memory" << endl;
00707         return (1);
00708     }
00709 
00710     RioErr << "Number of devices: "<< Config.nDisks << " (array created). "
00711            << endl;
00712 
00713     // A porta foi fixada para STORAGESERVERUDPPORT para podermos dar suporte
00714     // aos clientes atras de NAT.
00715     // Mais tres parametros foram adicionados, para passar o numero maximo
00716     // de creditos dos clientes, o numero maximo de creditos da rede, e a taxa 
00717     // de transferencia dos fragmentos.
00718     #ifdef RIO_DEBUG_FILE
00719     // Compoe o nome do arquivo com o log gerado pela RioNeti.
00720     // Inicializa o nome com o diretorio com os logs.
00721     char tmpName[  MaxPathSize ];
00722     char tmpDomain[  MaxPathSize ];
00723     char LogFileName[  MaxPathSize ];
00724     strcpy( LogFileName, LogsDirectory );
00725     // Obtem o nome da maquina em que o servidor de armazenamento esta 
00726     // executando.
00727     gethostname( tmpName,  MaxPathSize - 1 ); 
00728     // Obtem o dominio da maquina em que o servidor de armazenamento esta 
00729     // executando.
00730     getdomainname( tmpDomain,  MaxPathSize - 1 );
00731     // Adiciona o nome que identifica o log da RioNeti com o log do servidor de
00732     // armazenamento.
00733     strcat( LogFileName, "RIOStorageEmul_" );
00734     strcat( LogFileName, tmpName );
00735     // Verifica se o dominio esta no nome da maquina e o adiciona ao log caso 
00736     // nao esteja.
00737     if( strstr( tmpName, tmpDomain ) == NULL ) 
00738     {
00739         strcat( LogFileName, "." );
00740         strcat( LogFileName, tmpDomain );
00741     }
00742     strcat( LogFileName, ".log" );
00743 
00744     // Inicializa a classe antiga de transferencia de dados.
00745     NetManager.Start( htons( STORAGESERVERUDPPORT ), 128 * 1024, FRAGMENTSIZE, 
00746                       LogFileName, StorageConfig.MaxClientsCredits, 
00747                       StorageConfig.MaxNetworkCredits, 
00748                       StorageConfig.NetworkRate );
00749           
00750     // Inicializa a nova classe de transferencia de dados (nao devemos verificar
00751     // se algum erro ocorreu? Ou seja, descartar o retorno da funcao Start acima
00752     // e o correto a ser feito?
00753     // 
00754     // Obs1: Verificar o que fazer com os timeouts do send e do receive (que
00755     // serao 0 porque usamos os valores default).
00756     // Obs2: Usei 18000 segundos = 5 horas para o timeout porque este e o 
00757     // timeout da conexao principal do TCP do cliente com o servidor de 
00758     // despacho. Precisamos definir vamos obter este valor e depois 
00759     // inicializa-lo, porque ele e definido no arquivo de configuracao do 
00760     // servidor de despacho. Vamos precisar criar uma nova funcao para poder 
00761     // alterar o valor do timeou (e talvez o do envio e o do recebimento) caso 
00762     // a informacao seja passa do servidor de despacho ao servidor de 
00763     // armazenamento durante a sua inicializacao.
00764     //     
00765     RioStatus = NetInterface.Start( htons( STORAGESERVERUDPPORT ), 
00766                                     StorageConfig.ClientsTimeOut, 
00767                                     NETTCPTIMEOUTSECONDS, NETTCPTIMEOUTSECONDS, 
00768                                     NULL, true, LogFileName ); 
00769     
00770     #else
00771     
00772     // Inicializa a classe antiga de transferencia de dados.
00773     NetManager.Start( htons( STORAGESERVERUDPPORT ), 128 * 1024, FRAGMENTSIZE, 
00774                       StorageConfig.MaxClientsCredits,
00775                       StorageConfig.MaxNetworkCredits, 
00776                       StorageConfig.NetworkRate );
00777 
00778     // Inicializa a nova classe de transferencia de dados (nao devemos verificar
00779     // se algum erro ocorreu? Ou seja, descartar o retorno da funcao Start acima
00780     // e o correto a ser feito?
00781     // 
00782     // Obs1: Verificar o que fazer com os timeouts do send e do receive (que
00783     // serao 0 porque usamos os valores default).
00784     // Obs2: Usei 18000 segundos = 5 horas para o timeout porque este e o 
00785     // timeout da conexao principal do TCP do cliente com o servidor de 
00786     // despacho. Precisamos definir vamos obter este valor e depois 
00787     // inicializa-lo, porque ele e definido no arquivo de configuracao do 
00788     // servidor de despacho. Vamos precisar criar uma nova funcao para poder 
00789     // alterar o valor do timeou (e talvez o do envio e o do recebimento) caso 
00790     // a informacao seja passa do servidor de despacho ao servidor de 
00791     // armazenamento durante a sua inicializacao.
00792     //    
00793     RioStatus = NetInterface.Start( htons( STORAGESERVERUDPPORT ), 
00794                                     StorageConfig.ClientsTimeOut,
00795                                     NETTCPTIMEOUTSECONDS, 
00796                                     NETTCPTIMEOUTSECONDS );  
00797     
00798     #endif
00799     
00800     // Verifica se ocorreu algum erro ao inicializar a NetInterface.
00801     if( FAILED( RioStatus ) )
00802     {
00803         #ifdef RIO_DEBUG2
00804         RioErr << "main: erro 0x" << hex << RioStatus << dec << " ("
00805                << GetErrorDescription( RioStatus ) << ") ao criar o objeto "
00806                << "da classe CNetIneface associado a nova conexao TCP." 
00807                << endl;
00808         #endif
00809 
00810         RioErr << "Error when initializing TCP" << endl;
00811         return (1);
00812     }       
00813 
00814     // Agora a nova classe de gerenciamento de rede e que definira o IP e a 
00815     // porta do servidor de armazenamento (estes valores deveriam ser os mesmos.
00816     // Se isso nao ocorrer entao existe algum erro de implementacao na nova
00817     // classe).
00818     //NetManager.getmyaddrport( (int*) &(storageip.s_addr), &port);
00819     NetInterface.getmyaddrport( (int*) &(storageip.s_addr), &port);
00820 
00821     // Cria a classe usada para armazenar os pacotes enviados pelo servidor de
00822     // armazenamento.
00823     // Define o nome para os prefixo dos logs.
00824     char LogFileNamePrefix[  MaxPathSize ];
00825     strcpy( LogFileNamePrefix, LogsDirectory );
00826     strcat( LogFileNamePrefix, "StorageLog_" );
00827     // Adiciona o IP do storage (a porta nao sera necessaria, pois dois storages
00828     // nao podem executar na mesma maquina).
00829     strcat( LogFileNamePrefix, inet_ntoa( storageip ) ); 
00830     if( SentPackagesLog.Initialize( LogFileNamePrefix, 
00831                                     StorageConfig.MaxLogFileSize, 
00832                                     StorageConfig.MaxCombinedLogFilesSize,
00833                                     SaveLogs ) != S_OK )
00834     {           
00835         // Devemos ou nao parar o servidor de armazenamento neste caso?
00836         RioErr << "main: erro ao inicializar a classe com os logs." << endl;
00837         return (1);
00838     }
00839 
00840     // Define a classe de gerenciamento dos logs de envio para a implementacao
00841     // antiga de rede.
00842     NetManager.setLogRotation( &SentPackagesLog );
00843     // Define a classe de gerenciamento dos logs de envio para a nova 
00844     // implementacao de rede.
00845     NetInterface.setLogRotation( &SentPackagesLog );
00846 
00847     // Initialize devices
00848     for(i=0; i<Config.nDisks; i++)
00849     {
00850         // A funcao initialize da CStorageDevice possui agora mais um parametro:
00851         // o nome do diretorio onde os logs devem ser salvos.
00852         stat = Device[i].Initialize(Config.Disk[i].Name,
00853                                     inet_ntoa( storageip ),
00854                                     StorageConfig.DiskThreads,
00855                                     StorageConfig.EstimatedParameter,
00856                                     CollectMeasures, LogsDirectory );
00857         // --------------------------------------------------------------------
00858         if(stat < 0)
00859         {
00860             RioErr << "Error when initializing Device " << Config.Disk[i].Name
00861                    << ": " << stat << endl;
00862             return (1);
00863         }
00864     }
00865 
00866     // Get Device parameters
00867     for(i=0; i< Config.nDisks; i++)
00868     {
00869         Config.Disk[i].Size = Device[i].Size();
00870         Config.Disk[i].SectorSize = Device[i].SectorSize();
00871     }
00872 
00873     stat = Client.Initialize( StorageConfig.SendFlag, 
00874                               StorageConfig.EstimatedParameter );
00875     if(stat < 0)
00876     {
00877         RioErr << "Error when initializing Client Interface: " << stat << endl;
00878         return (1);
00879     }
00880 
00881     stat = MsgManager.Initialize( Config.MaxReq + 10 );
00882     if(stat < 0)
00883     {
00884         RioErr << "Error when initializing Msg Manager: " << stat << endl;
00885         return (1);
00886     }
00887 
00888     RioErr << "Msg Manager started. Max number of msg : "<< Config.MaxReq + 10
00889            << " (array created). "<< endl;
00890 
00891     // O novo parametro, com o diretorio com os logs, e usado ao inicializarmos
00892     // a classe de busca nos logs.
00893     stat = Router.Initialize( htons( Config.RouterPort ), LogsDirectory );
00894     if(stat < 0)
00895     {
00896         RioErr << "Error when initializing Router Interface: " << stat << endl;
00897         return (1);
00898     }
00899 
00900 
00901     RioErr << "TCP/IP address (control messages): "
00902            << inet_ntoa( storageip ) << ":"<< StorageConfig.RouterPort << endl;
00903 
00904     if(!Finish.IsOpen())
00905     {
00906         RioErr << "ERROR: Semaphore could not be created" << endl;
00907         return (1);
00908     }
00909 
00910     // Wait until semaphore is signaled to end program
00911     Finish.P();
00912 
00913     return (0);
00914 }

void PrintConfiguration ( StorageServerConfig Config  ) 

Definition at line 159 of file storage/main.cpp.

00160 {
00161     cout << "---------------------------------------------------" << endl;
00162     cout << "             RIO Storage Configuration             " << endl;
00163     cout << "---------------------------------------------------" << endl;
00164     cout << "Buffers\t\t\t" << Config->Buffers << endl; 
00165     cout << "CollectMeasures\t\t" << Config->CollectMeasures << endl;
00166     cout << "EstimatedTime\t\t" << Config->EstimatedParameter << endl;
00167     cout << "SendBlocksFlag\t\t" << Config->SendFlag << endl;
00168     cout << "MaxClientsCredits\t" << Config->MaxClientsCredits << endl;
00169     cout << "MaxNetworkCredits\t" << Config->MaxNetworkCredits << endl;
00170     cout << "RouterPort\t\t" << Config->RouterPort << endl;
00171     cout << "NetworkRate\t\t" << Config->NetworkRate << endl;
00172     cout << "DiskThreads\t\t" << Config->DiskThreads << endl;  
00173     // Novas opcoes usadas pelo gerenciamento dos logs para limitar o tamanho
00174     // do arquivo de log nao compactado e o tamanho total combinado de todos
00175     // os logs (compactados ou nao).
00176     cout << "MaxLogFileSize\t\t" << Config->MaxLogFileSize / 1024 << " Kbytes" 
00177          << endl;
00178     cout << "MaxCombinedLogFilesSize\t" << Config->MaxCombinedLogFilesSize / 1024
00179          << " Kbytes" << endl;
00180     // Nova opcao para definir se os logs devem ou nao ser salvos, ou seja, se 
00181     // devemos ou nao somente executar buscas nestes logs.
00182     if( Config->SaveLogs != NULL )
00183         cout << "LogRotation \t\t" << Config->SaveLogs << endl;
00184     else
00185         cout << "LogRotation \t\tOn" << endl;
00186     // Nova opcao usada para definir o tempo maximo de inatividade das conexoes
00187     // TCP de cada cliente com o servidor de armazenamento.
00188     cout << "ClientsTimeOut\t\t" << Config->ClientsTimeOut << " seconds." 
00189          << endl;
00190     cout << "---------------------------------------------------" << endl;
00191 }

int ReadConfiguration ( char *  ConfigsDirectory,
StorageServerConfig Config 
)

Definition at line 309 of file storage/main.cpp.

00310 {
00311     // Variavel usada para compor o nome do arquivo com a configuracao do
00312     // servidor RIO.
00313     char ConfigFileName[ MaxPathSize ];
00314 
00315     // Palavras-chave usadas pelo arquivo de configuracao do servidor de
00316     // armazenamento.
00317     enum keys
00318     {
00319         Buffers = 1, CollectMeasures, EstimatedTime, SendBlocksFlag, 
00320         MaxClientsCredits, MaxNetworkCredits, RouterPort,
00321         NetworkRate, DiskThreads, MaxLogFileSize, MaxCombinedLogFilesSize,
00322         LogRotation, ClientsTimeOut
00323     };
00324 
00325     static struct token_kw mykeys[] = {
00326         {"Buffers", Buffers}, 
00327         {"CollectMeasures", CollectMeasures},
00328         {"EstimatedTime", EstimatedTime},
00329         {"SendBlocksFlag", SendBlocksFlag},
00330         // Define o numero maximo de creditos usados para o envio dos fragmentos 
00331         // ao cliente.
00332         {"MaxClientsCredits", MaxClientsCredits},
00333         // Define o numero maximo de creditos usados para o envio dos fragmentos
00334         // pela rede (ou seja para todos os clientes).
00335         {"MaxNetworkCredits", MaxNetworkCredits},
00336         {"RouterPort", RouterPort},
00337         // Define a taxa maxima de transferencia dos dados.
00338         {"NetworkRate", NetworkRate},
00339         {"DiskThreads", DiskThreads},
00340         // Novas opcoes usadas pelo gerenciamento dos logs para limitar o 
00341         // tamanho do arquivo de log nao compactado e o tamanho total combinado 
00342         // de todos os logs (compactados ou nao).
00343         {"MaxLogFileSize", MaxLogFileSize},
00344         {"MaxCombinedLogFilesSize", MaxCombinedLogFilesSize}, 
00345         // Nova opcao para definir se os logs devem ou nao ser salvos, ou seja,
00346         // se devemos ou nao somente executar buscas nestes logs.
00347         {"LogRotation", LogRotation},
00348         // Nova opcao usada para definir o tempo maximo de inatividade das 
00349         // conexoes TCP de cada cliente com o servidor de armazenamento.
00350         {"ClientsTimeOut", ClientsTimeOut},
00351         {NULL, 0}
00352     };
00353 
00354     cout << endl;
00355     token tok;
00356     //tok.setcerr(&cout);
00357 
00358     // Alteracao para ler o arquivo de configuracao de um diretorio qualquer,
00359     // diferente de onde o servidor esta. Por default, o arquivo e lido do
00360     // diretorio em que esta o binario do servidor.
00361     // Compoe o nome do arquivo com a configuracao do servidor.
00362 
00363     strcpy( ConfigFileName, ConfigsDirectory );
00364     strcat( ConfigFileName, CONFIGNAME );
00365 
00366     if( tok.openfile( ConfigFileName ) )
00367         return 1;
00368 
00369     int word;
00370     int number;
00371 
00372     while( ( word = tok.parseline( mykeys )) != END_TOKEN )
00373     {
00374         switch( word )
00375         {
00376             case Buffers:
00377                 tok.getnumber( &Config->Buffers );
00378                 break;
00379 
00380             case CollectMeasures:
00381                 tok.getstrnew( &Config->CollectMeasures );
00382                 break;
00383 
00384             case EstimatedTime:
00385                 tok.getdouble( &Config->EstimatedParameter );
00386                 break;
00387 
00388             case SendBlocksFlag:
00389                 tok.getnumber( &Config->SendFlag );
00390                 break;
00391 
00392             case MaxClientsCredits:
00393                 tok.getnumber( &Config->MaxClientsCredits );
00394                 break;
00395 
00396             case MaxNetworkCredits:
00397                 tok.getnumber( &Config->MaxNetworkCredits );
00398                 break;
00399 
00400             case RouterPort:
00401                 tok.getnumber( &Config->RouterPort );
00402                 break;
00403 
00404             case NetworkRate:
00405                 tok.getnumber( &Config->NetworkRate );
00406                 break;
00407 
00408             case DiskThreads:
00409                 tok.getnumber( &Config->DiskThreads );
00410                 break;
00411 
00412             // Novas opcoes usadas pelo gerenciamento dos logs para limitar o 
00413             // tamanho do arquivo de log nao compactado e o tamanho total 
00414             // combinado de todos os logs (compactados ou nao).
00415             case MaxLogFileSize:
00416                 tok.getnumber( &number );
00417                 // Tamanho do log nao compactado e dado em KB.
00418                 Config->MaxLogFileSize = number * 1024;
00419                 break;
00420                 
00421             case MaxCombinedLogFilesSize:
00422                 tok.getnumber( &number );
00423                 // Tamanho combinado dos logs e dado em KB.
00424                 Config->MaxCombinedLogFilesSize = ( ( unsigned long long int ) 
00425                                                     number ) * 1024;
00426                 break;
00427             // Nova opcao para definir se os logs devem ou nao ser salvos, ou 
00428             // seja, se devemos ou nao somente executar buscas nestes logs.
00429             case LogRotation:
00430                 tok.getstrnew( &Config->SaveLogs );
00431                 break;
00432             // Nova opcao usada para definir o tempo maximo de inatividade das 
00433             // conexoes TCP de cada cliente com o servidor de armazenamento.
00434             case ClientsTimeOut:
00435                 tok.getnumber( &number );
00436                 Config->ClientsTimeOut = ( unsigned int ) number;
00437                 break;
00438 
00439             // Valor para uma opcao invalida.
00440             case ERROR_TOKEN:
00441                 char *Aux;
00442                 tok.getstrnew( &Aux );
00443                 RioErr << "warning: invalid keyword " << Aux << " ignored!"
00444                        << endl;
00445                 delete[] Aux;
00446                 break;
00447 
00448             // Chave invalida.
00449             default:
00450                 RioErr << "word " << word << endl;
00451                 tok.emsg("{default} invalid word");
00452                 continue;
00453         }
00454         tok.ckend();
00455     }
00456     tok.closefile();
00457     return CheckConfiguration( Config );
00458 }

void segfaultHandler ( int  sig  ) 

Definition at line 133 of file storage/main.cpp.

00134 {
00135     RioErr << "[Storage-main] SEGMENTATION FAULT!" << endl;
00136     show_stackframe();
00137 
00138     _exit( 1 );
00139 }

void show_stackframe (  ) 

Handles the SEGFAULT.

Definition at line 119 of file storage/main.cpp.

00120 {
00121     void *trace[16];
00122     char **messages = (char **)NULL;
00123     int i, trace_size = 0;
00124 
00125     trace_size = backtrace( trace, 16 );
00126     messages = backtrace_symbols( trace, trace_size );
00127     RioErr << "[bt] Execution path:" << endl;
00128     for( i = 0; i < trace_size; ++i )
00129         RioErr << "[bt(" << i << "/" << trace_size << ")] " << messages[i]
00130                << endl;
00131 }

void signalHandler ( int  sig  ) 

Definition at line 142 of file storage/main.cpp.

00143 {
00144     RioErr << "[Storage] CAUGHT SIGTERM SIGNAL!" << endl;
00145     // Desassocia a classe SentPackagesLog da classe RioNeti.
00146     NetManager.setLogRotation( NULL );
00147     // Desbloqueia a thread principal.
00148     Finish.V();
00149     // Nova funcao para tratar o sigterm (futuramente podemos finalizar as
00150     // estruturas aqui nesta funcao.
00151     exit( 2 );
00152 }

void usage ( char *  progname  ) 

Definition at line 107 of file storage/main.cpp.

00108 {
00109     RioErr << "Usage: " << endl;
00110     RioErr << "  " << progname << " " << Usage;
00111     RioErr << Usage2 << endl;
00112 }


Variable Documentation

const char* const CONFIGNAME = "RIOstorage.cfg"

Definition at line 105 of file storage/main.cpp.

const char* const CONFIGSSUBDIR = "etc/RIO/"

Definition at line 100 of file storage/main.cpp.

const char* const LOGSSUBDIR = "var/log/RIO/"

Definition at line 103 of file storage/main.cpp.

char Usage[] [static]
Initial value:
     "[-h] "
     "[-n disks] "
     "[-p prefix directory] "
     "[-v]"
     "<devices> \n"

Definition at line 49 of file storage/main.cpp.

char Usage2[] [static]
Initial value:
    "  -h|--help\n"
    "    Prints this message and exit\n"
    "  -n|--ndisks <number_of_disks>\n"
    "    Number of disks to use. Default: 1\n"
    "  -p|--prefixdirectory <prefix directory>\n"
    "    Set the prefix directory of config files and logs.\n"
    "  -v|--version\n"
    "    Show version number and exit\n"
    "  <disk_devices>\n"
    "    List of disk devices (or file) names\n"

Definition at line 56 of file storage/main.cpp.

Generated on Wed Jul 4 16:03:29 2012 for RIO by  doxygen 1.6.3