#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) |
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 | ) |
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] |
"[-h] " "[-n disks] " "[-p prefix directory] " "[-v]" "<devices> \n"
Definition at line 49 of file storage/main.cpp.
char Usage2[] [static] |
" -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.