#include <ObjMapMgr.h>
Public Member Functions | |
~RioObject () | |
int | Close () |
int | GetSize (RioObjectSize *Size) |
int | GetType (short *Type) |
int | GetnBlocks (RioBlock *nBlocks) |
int | GetBlockMap (RioBlock first, RioBlock nBlocks, RioDiskBlock *blocks) |
int | SetSize (RioObjectSize Size, char *md5sum, unsigned long long int ExcludeStorages) |
int | MarkDelete () |
int | MapBlock (RioBlock Block, int RepBits, int *numreps, RioDiskBlock *reps) |
int | GetObjectName (char *ObjectName) |
Funcao GetObjectName: retorna o nome do arquivo associado ao objeto RioObject. | |
int | GetVideoRate (unsigned int *VideoRate) |
GetVideoRate retorna a taxa de transmissao (em Kbps) do video. | |
int | SetVideoRate (unsigned int VideoRate) |
SetVideoRate altera a taxa de transmissao (em Kbps) do video. | |
int | ReallocBlocks (RioBlock Block, unsigned long long int ExcludeStorages) |
Nova funcao usada para realocar os blocos associados ao ultimo bloco do arquivo associado ao objeto. | |
Private Member Functions | |
RioObject (ObjMapMgr *mgr) | |
RioObject (const RioObject &x) | |
RioObject & | operator= (const RioObject &x) |
int | SaveObject () |
void | PrintHdr () |
int | Extend (RioBlock nBlocks, unsigned long long int ExcludeStorages) |
int | Truncate (RioBlock nBlocks) |
Private Attributes | |
ObjMapMgr * | o_mgr |
char * | o_Name |
int | o_FileHandle |
bool | o_DeleteOnClose |
bool | o_MapChanged |
bool | o_MapValid |
RioBlock | o_nMapBlocks |
RioDiskBlock * | o_Map |
bool | o_Locked |
bool | o_HdrValid |
ObjectHeader | o_Hdr |
Friends | |
class | ObjMapMgr |
Definition at line 71 of file ObjMapMgr.h.
RioObject::RioObject | ( | ObjMapMgr * | mgr | ) | [private] |
Definition at line 373 of file ObjMapMgr.cpp.
00374 { 00375 // don't need to hold a mutex since no one can see this RioObject yet 00376 o_mgr = mgr; 00377 o_Name = NULL; 00378 o_FileHandle = -1; 00379 o_DeleteOnClose = false; 00380 o_MapChanged = false; 00381 o_MapValid = false; 00382 o_nMapBlocks = 0; 00383 o_Map = NULL; 00384 o_HdrValid = false; 00385 o_Locked = 1; // starts out locked 00386 memset( (char *)&o_Hdr, 0, sizeof( o_Hdr ) ); 00387 }
RioObject::RioObject | ( | const RioObject & | x | ) | [private] |
RioObject::~RioObject | ( | ) |
Definition at line 393 of file ObjMapMgr.cpp.
00394 { 00395 int rc; 00396 pthread_mutex_lock( &o_mgr->m_mutexfast ); 00397 if( o_FileHandle != -1 ) 00398 { 00399 close(o_FileHandle); 00400 } 00401 delete [] o_Map; 00402 o_mgr->m_used--; 00403 pthread_mutex_unlock( &o_mgr->m_mutexfast ); 00404 00405 // delete object if needed 00406 if( o_DeleteOnClose && ( o_Hdr.Size == 0 ) ) 00407 { 00408 rc = unlink( o_Name ); 00409 if( rc ) 00410 { 00411 (*o_mgr->m_log) << "~RioObject unlink for " << o_Name << ": " 00412 << strerror(errno) << endl; 00413 } 00414 } 00415 00416 delete [] o_Name; 00417 }
int RioObject::Close | ( | void | ) |
Definition at line 422 of file ObjMapMgr.cpp.
00423 { 00424 time_t t; 00425 00426 // If file was opened for write update time stamp for file last write 00427 // if( o_Access & RIO_WRITE_ACCESS ) 00428 // A variavel o_Access nao e setada em lugar nenhum 00429 // if( RIO_WRITE_ACCESS ) 00430 // { 00431 pthread_mutex_lock( &o_mgr->m_mutexmeta ); 00432 time( &t ); 00433 if( t == ( time_t ) - 1 ) 00434 { 00435 (*o_mgr->m_log) << "RioObject.Close: time failed " 00436 << strerror(errno) << endl; 00437 } 00438 else 00439 { 00440 o_Hdr.LastWrite = t; 00441 } 00442 00443 // ### need to write header out to update time... 00444 if( close( o_FileHandle ) ) 00445 { 00446 pthread_mutex_unlock( &o_mgr->m_mutexmeta ); 00447 (*o_mgr->m_log) << "ObjMapMgr.Close: close failed " 00448 << strerror(errno) << endl; 00449 return ERROR_OBJECTMANAGER + ERROR_UNEXPECTED; 00450 } 00451 pthread_mutex_unlock( &o_mgr->m_mutexmeta ); 00452 // } 00453 return S_OK; 00454 }
int RioObject::Extend | ( | RioBlock | nBlocks, | |
unsigned long long int | ExcludeStorages | |||
) | [private] |
Definition at line 740 of file ObjMapMgr.cpp.
00741 { 00742 RioDiskBlock *newmap, *newp; 00743 RioBlock n; 00744 int rc = 0; 00745 00746 pthread_mutex_lock( &o_mgr->m_mutexfast ); 00747 00748 // first adjust map size to hold additional blocks 00749 if( o_nMapBlocks >= nBlocks ) goto diskalloc; 00750 00751 newmap = new RioDiskBlock[ nBlocks * o_Hdr.nRep ]; 00752 if( newmap == 0 ) 00753 { 00754 pthread_mutex_unlock( &o_mgr->m_mutexfast ); 00755 return ERROR_MEMORY; 00756 } 00757 00758 memset(newmap, 0, nBlocks * o_Hdr.nRep * sizeof( RioDiskBlock )); 00759 memcpy(newmap, o_Map, o_Hdr.nBlocks * o_Hdr.nRep * sizeof( RioDiskBlock )); 00760 delete [] o_Map; 00761 o_Map = newmap; 00762 o_nMapBlocks = nBlocks; 00763 00764 diskalloc: 00765 00766 for( n = o_Hdr.nBlocks; n < nBlocks; n++ ) 00767 { 00768 newp = o_Map + ( n * o_Hdr.nRep ); 00769 rc = o_mgr->m_DiskMgr->AllocMult( o_Hdr.nRep, newp, ExcludeStorages ); 00770 if( rc ) 00771 goto quit; 00772 o_Hdr.nBlocks = n + 1; 00773 } 00774 00775 for( n = 0; n < o_Hdr.nBlocks; n++ ) 00776 { 00777 newp = o_Map + (n * o_Hdr.nRep); 00778 if( newp->disk == 0 ) 00779 { 00780 RioErr << "ObjMapMgr:Extend block " << n << " null" << endl; 00781 abort(); 00782 } 00783 } 00784 00785 quit: 00786 00787 o_MapChanged = 1; 00788 pthread_mutex_unlock( &o_mgr->m_mutexfast ); 00789 00790 SaveObject(); // update obj hdr & map 00791 // confirm disk allocations made (even if didn't finish) 00792 o_mgr->m_DiskMgr->Confirm(); 00793 00794 return rc; 00795 }
int RioObject::GetBlockMap | ( | RioBlock | first, | |
RioBlock | nBlocks, | |||
RioDiskBlock * | blocks | |||
) |
Definition at line 490 of file ObjMapMgr.cpp.
00492 { 00493 pthread_mutex_lock( &o_mgr->m_mutexfast ); 00494 if( o_Locked ) 00495 { 00496 pthread_mutex_unlock( &o_mgr->m_mutexfast ); 00497 return ERROR_OBJECTMANAGER + ERROR_OBJECT_OPEN_FAILED; 00498 } 00499 00500 if( ( first + nBlocks ) > o_Hdr.nBlocks ) 00501 { 00502 pthread_mutex_unlock( &o_mgr->m_mutexfast ); 00503 return ERROR_OBJECTMANAGER + ERROR_INVALID_LOGICAL_BLOCK; 00504 } 00505 00506 memcpy( blocks, o_Map + first, nBlocks * sizeof( RioDiskBlock )); 00507 00508 pthread_mutex_unlock( &o_mgr->m_mutexfast ); 00509 return S_OK; 00510 }
int RioObject::GetnBlocks | ( | RioBlock * | nBlocks | ) |
Definition at line 480 of file ObjMapMgr.cpp.
int RioObject::GetObjectName | ( | char * | ObjectName | ) |
Funcao GetObjectName: retorna o nome do arquivo associado ao objeto RioObject.
O nome retornado inclui o caminho relativo do arquivo no sistema de arquivos do sistema operacional em que o Servidor RIO esta executando, em relacao ao diretorio do servidor.(esta funcao e usada pela implementacao da cache).
ObjectName | Ponteiro para uma string que ira armazenar o nome do arquivo com o seu caminho. A funcao supoe que existe espaco suficiente na string para copiar o nome no endereco apontado por ObjectName (contando o terminador). |
Definition at line 849 of file ObjMapMgr.cpp.
int RioObject::GetSize | ( | RioObjectSize * | Size | ) |
Definition at line 468 of file ObjMapMgr.cpp.
int RioObject::GetType | ( | short * | Type | ) |
Definition at line 474 of file ObjMapMgr.cpp.
int RioObject::GetVideoRate | ( | unsigned int * | VideoRate | ) |
GetVideoRate retorna a taxa de transmissao (em Kbps) do video.
VideoRate | ponteiro para o inteiro nao sinalizado que armazenara a taxa de transmissao do video. |
Definition at line 864 of file ObjMapMgr.cpp.
00865 { 00866 // Obtem o mutex para o acesso ao metadado do objeto. 00867 pthread_mutex_lock(&o_mgr->m_mutexmeta); 00868 if ( o_Hdr.VideoRate == 0 ) // Usa a taxa de transmissao default, se o 00869 // metadados for antigo, e este campo estava 00870 // igual a 0 (pois fazia parte do campo pad). 00871 *VideoRate = DEFAULTVIDEORATE; // Retorna a taxa default do video. 00872 else 00873 *VideoRate = o_Hdr.VideoRate; 00874 // Libera o mutex para o acesso ao metadado do objeto. 00875 pthread_mutex_unlock(&o_mgr->m_mutexmeta); 00876 return S_OK; // A funcao nao gera erros. 00877 }
int RioObject::MapBlock | ( | RioBlock | Block, | |
int | RepBits, | |||
int * | numreps, | |||
RioDiskBlock * | reps | |||
) |
Definition at line 518 of file ObjMapMgr.cpp.
00520 { 00521 int rc = 0; 00522 int i, num; 00523 RioDiskBlock *p; 00524 00525 num = 0; 00526 pthread_mutex_lock( &( o_mgr->m_mutexfast ) ); 00527 00528 if( o_Locked || !o_MapValid ) 00529 { 00530 rc = ERROR_OBJECTMANAGER + ERROR_OBJECT_OPEN_FAILED; 00531 goto ret; 00532 } 00533 00534 if( Block >= o_Hdr.nBlocks ) 00535 { 00536 rc = ERROR_OBJECTMANAGER + ERROR_INVALID_LOGICAL_BLOCK; 00537 goto ret; 00538 } 00539 00540 p = &o_Map[ o_Hdr.nRep * Block ]; 00541 for( i = 0; i < o_Hdr.nRep; i++, p++, RepBits >>= 1 ) 00542 { 00543 if( RepBits & 1 ) 00544 continue; 00545 if( p->disk == 0 ) // skip null entries 00546 continue; 00547 memcpy( (char *) reps, (char *) p, sizeof( RioDiskBlock )); 00548 reps++; 00549 num++; 00550 } 00551 ret: 00552 pthread_mutex_unlock( &( o_mgr->m_mutexfast ) ); 00553 *numrep = num; 00554 if( num == 0 ) 00555 { 00556 // if mapped to no blocks make an error 00557 return ERROR_RIOOBJECT+ERROR_INVALID_PHYSICAL_BLOCK; 00558 } 00559 return rc; 00560 }
int RioObject::MarkDelete | ( | ) |
Definition at line 457 of file ObjMapMgr.cpp.
00458 { 00459 int rc; 00460 00461 rc = SetSize(0, NULL, 0); // release any blocks allocated 00462 if( rc ) 00463 return rc; 00464 o_DeleteOnClose = 1; 00465 return 0; 00466 }
void RioObject::PrintHdr | ( | ) | [private] |
int RioObject::ReallocBlocks | ( | RioBlock | Block, | |
unsigned long long int | ExcludeStorages | |||
) |
Nova funcao usada para realocar os blocos associados ao ultimo bloco do arquivo associado ao objeto.
Este funcao e usada pelo objeto da classe Router ao reenviarmos um evento de escrita de um bloco no disco
Block | numero do bloco a ser realocado. | |
ExcludeStorages | vetor de bits com os servidores de armazenamento que nao devem ser usados. Cada bit i esta associado ao servidor com a ID i e um valor 1 neste bit indica que este servidor nao pode ser usado. |
Definition at line 902 of file ObjMapMgr.cpp.
00904 { 00905 RioDiskBlock *PosLastBlock, *NewBlocks; 00906 int i, TotalBlocks, PosNewBlock, StorageId, rc = 0; 00907 unsigned long long int ExcludeStoragesNewBlocs; 00908 00909 if( Block >= o_nMapBlocks ) // Bloco invalido. 00910 return ERROR_DISKMGR + ERROR_INVALID_BLOCK; 00911 else 00912 { 00913 // Inicializa o vetor de bits com os servidores que podem ser usados 00914 // ao alocarmos os novos blocos. 00915 ExcludeStoragesNewBlocs = ExcludeStorages; 00916 // Aloca o vetor temporario que sera usado para realocar os blocos 00917 // problematicos, associados aos discos cujos servidores de 00918 // armazenamento nao podem ser usados. 00919 NewBlocks = new RioDiskBlock[ o_Hdr.nRep ]; 00920 if( NewBlocks == NULL ) 00921 return ERROR_DISKMGR + ERROR_MEMORY; 00922 // Obtem o mutex para o acesso ao metadado do objeto. 00923 pthread_mutex_lock( &o_mgr->m_mutexmeta ); 00924 // Obtem acesso exclusivo as estruturas do objeto. 00925 pthread_mutex_lock( &o_mgr->m_mutexfast ); 00926 // Obtem, no vetor com os enderecos dos blocos, a posicao dos blocos do 00927 // bloco logico Block do arquivo. 00928 PosLastBlock= o_Map + ( Block * o_Hdr.nRep ); 00929 // Descobre quais blocos sao problematicos, isto e, cujos discos estao 00930 // associados aos servidores de armazenamento que devem ser excluidos. 00931 TotalBlocks = 0; 00932 #ifdef RIO_DEBUG2 00933 RioErr << "RioObject::ReallocBlocks existem " << o_Hdr.nRep 00934 << " replicacoes para o bloco " << Block << endl; 00935 #endif 00936 for( i = 0; i < o_Hdr.nRep; i++ ) 00937 { 00938 if( PosLastBlock[ i ].disk > 0 ) 00939 { 00940 StorageId = ( PosLastBlock[ i ].disk - 1 ) / SNode::sn_maxdisks; 00941 #ifdef RIO_DEBUG2 00942 RioErr << "RioObject::ReallocBlocks verificando a replicacao " 00943 << i + 1 << " do disco " << PosLastBlock[ i ].disk 00944 << " e o bloco " << PosLastBlock[ i ].block 00945 << " do servidor de armazenamento com a ID " << StorageId 00946 << endl; 00947 #endif 00948 // Verifica se precisamos realocar o bloco fisico associado a 00949 // replicacao i + 1. 00950 if( ( ExcludeStorages & ( 1ull << StorageId ) ) != 0 ) 00951 { 00952 #ifdef RIO_DEBUG2 00953 RioErr << "RioObject::ReallocBlocks o bloco " 00954 << PosLastBlock[ i ].block << " associado ao disco " 00955 << PosLastBlock[ i ].disk << " precisa ser " 00956 << "realocado" << endl; 00957 #endif 00958 // Em caso afirmativo, devemos realocar este bloco. 00959 TotalBlocks++; 00960 // Libera o bloco e o invalida (faz o disco ser 0), para 00961 // sabermos, em seguida, quais blocos devem ser substituidos 00962 // para o ultimo bloco logico. 00963 rc = o_mgr->m_DiskMgr->Free( &PosLastBlock[ i ] ); 00964 if( rc ) 00965 { 00966 #ifdef RIO_DEBUG2 00967 RioErr << "RioObject::ReallocBlocks erro ao remover o " 00968 << "bloco " << PosLastBlock[ i ].block 00969 << " associado ao disco " 00970 << PosLastBlock[ i ].disk << ". Abortando o " 00971 << "processo de realocacao" << endl; 00972 #endif 00973 break; 00974 } 00975 // Invalida o disco para depois ser substituido por um novo 00976 // disco. 00977 PosLastBlock[ i ].disk = -1; 00978 } 00979 else 00980 { 00981 // Em caso contrario, devemos desconsiderar, ao alocar os 00982 // novos blocos, os discos deste servidor de armazenamento. 00983 #ifdef RIO_DEBUG2 00984 RioErr << "RioObject::ReallocBlocks o bloco " 00985 << PosLastBlock[ i ].block << " associado ao disco " 00986 << PosLastBlock[ i ].disk << " esta ok. Igonrando " 00987 << "os discos do storage com a ID " << StorageId 00988 << " ao escolher os novos blocos fisicos" << endl; 00989 #endif 00990 ExcludeStoragesNewBlocs = ExcludeStoragesNewBlocs | 00991 ( 1ull << StorageId ); 00992 } 00993 } 00994 #ifdef RIO_DEBUG2 00995 else 00996 RioErr << "RioObject::ReallocBlocks o disco da replicacao " 00997 << i + 1 << " do vetor de replicacoes possui a ID " 00998 << "invalida " << PosLastBlock[ i ].disk << endl; 00999 #endif 01000 } 01001 01002 if( ( !rc ) && ( TotalBlocks != 0 ) ) 01003 { 01004 // Se precisamos alocar novos blocos e nenhum erro ocorreu ao 01005 // desalocarmos os blocos problematicos. 01006 01007 rc = o_mgr->m_DiskMgr->AllocMult( TotalBlocks, NewBlocks, 01008 ExcludeStoragesNewBlocs ); 01009 01010 if( !rc ) 01011 { 01012 // Se erros nao ocorreram ao alocar os novos blocos, vamos 01013 // entao substituir os blocos antigos pelos novos. 01014 PosNewBlock = 0; 01015 for( i = 0; i < o_Hdr.nRep; i++ ) 01016 { 01017 if( PosLastBlock[ i ].disk == -1 ) 01018 { 01019 #ifdef RIO_DEBUG2 01020 RioErr << "RioObject::ReallocBlocks realocando o bloco " 01021 << " da replicacao " << i + 1 << endl; 01022 #endif 01023 // Neste caso devemos substituir este bloco por uma 01024 // das replicacoes. 01025 if( PosNewBlock >= TotalBlocks ) 01026 { 01027 // Isto e um erro, pois nao alocamos blocos 01028 // suficientes. 01029 #ifdef RIO_DEBUG2 01030 RioErr << "RioObject::ReallocBlocks numero " 01031 << "insuficiente de realocacoes (" 01032 << TotalBlocks << ")" << endl; 01033 #endif 01034 rc = ERROR_DISKMGR + ERROR_UNEXPECTED; 01035 break; 01036 } 01037 else 01038 { 01039 // Substitui um bloco problematico pelo novo 01040 // bloco. 01041 PosLastBlock[ i ].disk = NewBlocks[ PosNewBlock ]. 01042 disk; 01043 PosLastBlock[ i ].block = NewBlocks[ PosNewBlock ]. 01044 block; 01045 01046 #ifdef RIO_DEBUG2 01047 RioErr << "RioObject::ReallocBlocks novo bloco " 01048 << "associado a realocacao " << i + 1 01049 << ": disco = " << PosLastBlock[ i ].disk 01050 << ", bloco = " << PosLastBlock[ i ].block 01051 << endl; 01052 #endif 01053 // Atualiza o numero de replicacoes usadas. 01054 PosNewBlock++; 01055 } 01056 } 01057 #ifdef RIO_DEBUG2 01058 else if( PosLastBlock[ i ].disk == 0 ) 01059 RioErr << "RioObject::ReallocBlocks a replicacao " 01060 << i + 1 << " possui o disco com a ID " 01061 << "reservada 0" << endl; 01062 #endif 01063 } 01064 } 01065 #ifdef RIO_DEBUG2 01066 else 01067 { 01068 RioErr << "RioObject::ReallocBlocks erro 0x" << hex 01069 << ( unsigned int ) rc << dec << " ao executar a " 01070 << "funcao AllocMult" << endl; 01071 } 01072 #endif 01073 } 01074 else if( TotalBlocks == 0 ) 01075 { 01076 // Neste caso retornamos sem salvar os metadados, pois nao alteramos 01077 // o mapa de blocos do objeto. 01078 #ifdef RIO_DEBUG2 01079 RioErr << "RioObject::ReallocBlocks a funcao foi chamada mas nao " 01080 << "foi necessaria a realocacao dos blocos" << endl; 01081 #endif 01082 // Libera o acesso exclusivo as estruturas do objeto. 01083 pthread_mutex_unlock( &o_mgr->m_mutexfast ); 01084 // Libera o mutex para o acesso ao metadado do objeto. 01085 pthread_mutex_unlock( &o_mgr->m_mutexmeta ); 01086 // Remove o vetor temporario usado ao realocarmos os blocos. 01087 delete NewBlocks; 01088 01089 return ERROR_DISKMGR + ERROR_UNEXPECTED; 01090 } 01091 #ifdef RIO_DEBUG2 01092 else 01093 { 01094 RioErr << "RioObject::ReallocBlocks erro 0x" << hex 01095 << ( unsigned int ) rc << dec << " ao executar a funcao " 01096 << "Free" << endl; 01097 } 01098 #endif 01099 01100 // O laco a seguir e necessario para permitir a remocao do arquivo 01101 // caso ocorra algum erro. Em caso contrario, nao conseguiremos remover 01102 // o arquivo e a formatacao do RIO sera necessaria, pois alguns blocos 01103 // fisicos poderiam ter um disco com a ID -1. 01104 for( i = 0; i < o_Hdr.nRep; i++ ) 01105 if( PosLastBlock[ i ].disk == -1 ) 01106 { 01107 #ifdef RIO_DEBUG2 01108 RioErr << "RioObject::ReallocBlocks a replicacao " 01109 << i + 1 << " possui o disco com a ID invalida -1. " 01110 << "Mudando a ID para 0 para permitir a remocao do " 01111 << "objeto associado ao bloco logico " << Block << endl; 01112 #endif 01113 PosLastBlock[ i ].disk = 0; 01114 rc = ERROR_DISKMGR + ERROR_UNEXPECTED; 01115 } 01116 01117 // Define que o mapa foi alterado. 01118 o_MapChanged = 1; 01119 01120 // Libera o acesso exclusivo as estruturas do objeto. 01121 pthread_mutex_unlock( &o_mgr->m_mutexfast ); 01122 01123 SaveObject(); // update obj hdr & map 01124 01125 // Libera o mutex para o acesso ao metadado do objeto. 01126 pthread_mutex_unlock( &o_mgr->m_mutexmeta ); 01127 01128 // confirm disk allocations made (even if didn't finish) 01129 o_mgr->m_DiskMgr->Confirm(); 01130 01131 // Remove o vetor temporario usado ao realocarmos os blocos. 01132 delete NewBlocks; 01133 01134 return rc; 01135 } 01136 }
int RioObject::SaveObject | ( | ) | [private] |
Definition at line 677 of file ObjMapMgr.cpp.
00678 { 00679 int n, nbytes; 00680 int rc; 00681 00682 n = lseek( o_FileHandle, 0, SEEK_SET ); 00683 if( n != 0 ) 00684 { 00685 rc = 1; 00686 goto err; 00687 } 00688 00689 n = write( o_FileHandle, &o_Hdr, sizeof( o_Hdr )); 00690 if( n != sizeof( o_Hdr ) ) 00691 { 00692 rc = 2; 00693 goto err; 00694 } 00695 00696 if( o_MapChanged ) 00697 { 00698 nbytes = o_Hdr.nRep * o_Hdr.nBlocks * sizeof( RioDiskBlock ); 00699 n = write(o_FileHandle, o_Map, nbytes); 00700 if( n != nbytes ) 00701 { 00702 rc = 3; 00703 goto err; 00704 } 00705 // ### might have gotten smaller, always truncate to "new" size 00706 nbytes += sizeof( o_Hdr ); 00707 rc = ftruncate( o_FileHandle, nbytes ); 00708 if( rc ) 00709 { 00710 rc = 4; 00711 goto err; 00712 } 00713 } 00714 00715 o_MapChanged = 0; 00716 return S_OK; 00717 00718 err: 00719 RioErr << "RioObject.SaveHeader failed for " << o_Name 00720 << " code " << rc << " " << strerror(errno) << endl; 00721 return ERROR_OBJECTMANAGER + ERROR_OBJECT_METADATA_WRITE; 00722 }
int RioObject::SetSize | ( | RioObjectSize | Size, | |
char * | md5sum, | |||
unsigned long long int | ExcludeStorages | |||
) |
Definition at line 566 of file ObjMapMgr.cpp.
00568 { 00569 int result = S_OK; 00570 int result2; 00571 00572 RioBlock nBlocks; 00573 00574 // meta lock causes all metadata operations to be single thread 00575 // this also prevents multiple metadata operations on a single object 00576 // from happening at once... 00577 00578 pthread_mutex_lock(&o_mgr->m_mutexmeta); 00579 00580 // O if abaixo foi retirado, pois a variavel o_Access nao e setada em lugar 00581 // nenhum e o "RIO_SHARE_WRITE | RIO_SHARE_READ" sempre retorna erro, gerando 00582 // um arquivo de zero byte na copia 00583 // if( o_Access & (RIO_SHARE_WRITE | RIO_SHARE_READ ) ) 00584 // { 00585 // pthread_mutex_unlock( &o_mgr->m_mutexmeta ); 00586 // return ERROR_NOT_EXCLUSIVE_ACCESS; 00587 // } 00588 00589 nBlocks = ( Size + ( o_Hdr.BlockSize - 1 )) / o_Hdr.BlockSize; 00590 00591 // deal with set to the existing size first (nothing to do) 00592 if( nBlocks == o_Hdr.nBlocks ) 00593 { 00594 pthread_mutex_unlock( &o_mgr->m_mutexmeta ); 00595 return S_OK; 00596 } 00597 00598 if( nBlocks > o_Hdr.nBlocks ) 00599 { 00600 result = Extend( nBlocks, ExcludeStorages ); 00601 } 00602 else 00603 { 00604 result = Truncate( nBlocks ); 00605 } 00606 00607 // This was causing metadata inconsistency when the system was full 00608 // Changed as described next by Renato on July 03, 2000 00609 // If Extend() or Truncate() failed there was an error 00610 // when allocating or freeing blocks and object size should 00611 // be adjusted accordlingly. 00612 if( FAILED( result ) ) 00613 { 00614 (*o_mgr->m_log)<< "Set Size Failed." << endl; 00615 00616 // if number of blocks is greater than expected then Truncate() failed 00617 if( o_Hdr.nBlocks > nBlocks ) 00618 { 00619 // Set new size to minimum of original size and current number of blocks 00620 if( ( o_Hdr.nBlocks * o_Hdr.BlockSize ) < o_Hdr.Size ) 00621 { 00622 Size = o_Hdr.nBlocks * o_Hdr.BlockSize; 00623 } 00624 else 00625 { 00626 Size = o_Hdr.Size; 00627 } 00628 } 00629 // if number of blocks is less than expected then Extend() failed 00630 if( o_Hdr.nBlocks < nBlocks ) 00631 { 00632 // Set size to maximum possible with current allocated blocks 00633 Size = o_Hdr.nBlocks * o_Hdr.BlockSize; 00634 } 00635 } 00636 00637 // -- change meta for object to new 00638 o_Hdr.Size = Size; 00639 00640 // apply new md5sum 00641 if( md5sum == NULL ) 00642 o_Hdr.nullmd5 = true; 00643 else 00644 { 00645 o_Hdr.nullmd5 = false; 00646 unsigned char md5_16bytes[16]; 00647 for( int i = 0; i < 16; i++ ) 00648 { 00649 if( md5sum[2*i] <= '9' ) 00650 md5sum[2*i] -= '0'; 00651 else 00652 md5sum[2*i] -= ('a' - 10 ); 00653 00654 if( md5sum[2*i+1] <= '9' ) 00655 md5sum[2*i+1] -= '0'; 00656 else 00657 md5sum[2*i+1] -= ('a' - 10 ); 00658 00659 md5_16bytes[i] = ((md5sum[2*i] << 4 ) | md5sum[2*i+1]); 00660 } 00661 memcpy( o_Hdr.md5sum, md5_16bytes, 16 ); 00662 } 00663 00664 // already done by Extend or Truncate o_Hdr.nBlocks = nBlocks; 00665 result2 = SaveObject(); 00666 pthread_mutex_unlock(&o_mgr->m_mutexmeta); 00667 00668 if( FAILED( result ) ) 00669 return result; 00670 else 00671 return result2; 00672 }
int RioObject::SetVideoRate | ( | unsigned int | VideoRate | ) |
SetVideoRate altera a taxa de transmissao (em Kbps) do video.
VideoRate | nova taxa de transmissao do video. |
Definition at line 882 of file ObjMapMgr.cpp.
00883 { 00884 int result; 00885 // Obtem o mutex para o acesso ao metadado do objeto. 00886 pthread_mutex_lock(&o_mgr->m_mutexmeta); 00887 o_Hdr.VideoRate = VideoRate; 00888 result = SaveObject(); 00889 // Libera o mutex para o acesso ao metadado do objeto. 00890 pthread_mutex_unlock(&o_mgr->m_mutexmeta); 00891 return result; 00892 }
int RioObject::Truncate | ( | RioBlock | nBlocks | ) | [private] |
Definition at line 804 of file ObjMapMgr.cpp.
00805 { 00806 RioBlock n; 00807 RioDiskBlock *rep; 00808 int rc = 0; 00809 int i; 00810 00811 pthread_mutex_lock( &o_mgr->m_mutexfast ); 00812 00813 // deallocate blocks from end of object 00814 o_MapChanged = 1; 00815 00816 for( n = o_Hdr.nBlocks; n > nBlocks; n-- ) 00817 { 00818 rep = &o_Map[ ( n - 1 ) * o_Hdr.nRep ]; 00819 00820 // DiskMgr knows which are real disk addresses, 00821 // just call him for each slot... 00822 for( i = o_Hdr.nRep-1; i >= 0; i-- ) 00823 { 00824 rc = o_mgr->m_DiskMgr->Free( &rep[i] ); 00825 if( rc ) 00826 goto quit; 00827 } 00828 00829 // changed to fix bug 00830 // it was o_Hdr.nBlocks = n; 00831 o_Hdr.nBlocks = n - 1; 00832 // -------------------------------------------------------------------- 00833 } 00834 00835 quit: 00836 00837 pthread_mutex_unlock(&o_mgr->m_mutexfast); 00838 00839 SaveObject(); // update obj hdr & map 00840 // always confirm as some may have worked... 00841 o_mgr->m_DiskMgr->Confirm(); 00842 00843 return rc; 00844 }
friend class ObjMapMgr [friend] |
Definition at line 100 of file ObjMapMgr.h.
bool RioObject::o_DeleteOnClose [private] |
Definition at line 77 of file ObjMapMgr.h.
int RioObject::o_FileHandle [private] |
Definition at line 76 of file ObjMapMgr.h.
ObjectHeader RioObject::o_Hdr [private] |
Definition at line 85 of file ObjMapMgr.h.
bool RioObject::o_HdrValid [private] |
Definition at line 84 of file ObjMapMgr.h.
bool RioObject::o_Locked [private] |
Definition at line 83 of file ObjMapMgr.h.
RioDiskBlock* RioObject::o_Map [private] |
Definition at line 81 of file ObjMapMgr.h.
bool RioObject::o_MapChanged [private] |
Definition at line 78 of file ObjMapMgr.h.
bool RioObject::o_MapValid [private] |
Definition at line 79 of file ObjMapMgr.h.
ObjMapMgr* RioObject::o_mgr [private] |
Definition at line 74 of file ObjMapMgr.h.
char* RioObject::o_Name [private] |
Definition at line 75 of file ObjMapMgr.h.
RioBlock RioObject::o_nMapBlocks [private] |
Definition at line 80 of file ObjMapMgr.h.