RioObject Class Reference

#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)
RioObjectoperator= (const RioObject &x)
int SaveObject ()
void PrintHdr ()
int Extend (RioBlock nBlocks, unsigned long long int ExcludeStorages)
int Truncate (RioBlock nBlocks)

Private Attributes

ObjMapMgro_mgr
char * o_Name
int o_FileHandle
bool o_DeleteOnClose
bool o_MapChanged
bool o_MapValid
RioBlock o_nMapBlocks
RioDiskBlocko_Map
bool o_Locked
bool o_HdrValid
ObjectHeader o_Hdr

Friends

class ObjMapMgr

Detailed Description

Definition at line 71 of file ObjMapMgr.h.


Constructor & Destructor Documentation

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 }


Member Function Documentation

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.

00481 {
00482     *nBlocks = o_Hdr.nBlocks;
00483     return S_OK;
00484 }

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).

Parameters:
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).
Returns:
S_OK (a funcao nao gera erros).

Definition at line 849 of file ObjMapMgr.cpp.

00850 {
00851     // Copia o nome do arquivo, incluindo o seu caminho, dado pelo endere�o
00852     // apontado pelo campo o_Name, para o endere�o apontado por ObjectName.
00853     strcpy( ObjectName, o_Name );
00854     return S_OK;
00855 }

int RioObject::GetSize ( RioObjectSize Size  ) 

Definition at line 468 of file ObjMapMgr.cpp.

00469 {
00470     *Size = o_Hdr.Size;
00471     return S_OK;
00472 }

int RioObject::GetType ( short *  Type  ) 

Definition at line 474 of file ObjMapMgr.cpp.

00475 {
00476    *Type = o_Hdr.Type;
00477    return S_OK;
00478 }

int RioObject::GetVideoRate ( unsigned int *  VideoRate  ) 

GetVideoRate retorna a taxa de transmissao (em Kbps) do video.

Parameters:
VideoRate ponteiro para o inteiro nao sinalizado que armazenara a taxa de transmissao do video.
Returns:
S_OK.

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 }

RioObject& RioObject::operator= ( const RioObject x  )  [private]
void RioObject::PrintHdr (  )  [private]

Definition at line 725 of file ObjMapMgr.cpp.

00726 {
00727     RioErr << "o_Hdr nRep " << o_Hdr.nRep
00728            << " BlockSize " << o_Hdr.BlockSize
00729            << " nBlocks "   << o_Hdr.nBlocks
00730            << " Size "      << o_Hdr.Size 
00731            << " VideoRate " << o_Hdr.VideoRate
00732            << endl;
00733 }

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

Parameters:
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.
Returns:
S_OK se a realocacao dos blocos foi feita com sucesso e um valor diferente de S_OK se algum erro ocorreu.

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.

Parameters:
VideoRate nova taxa de transmissao do video.
Returns:
o valor retornado pela funcao SaveObject()

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 }


Friends And Related Function Documentation

friend class ObjMapMgr [friend]

Definition at line 100 of file ObjMapMgr.h.


Field Documentation

Definition at line 77 of file ObjMapMgr.h.

int RioObject::o_FileHandle [private]

Definition at line 76 of file ObjMapMgr.h.

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.

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.

Definition at line 74 of file ObjMapMgr.h.

char* RioObject::o_Name [private]

Definition at line 75 of file ObjMapMgr.h.

Definition at line 80 of file ObjMapMgr.h.


The documentation for this class was generated from the following files:
Generated on Wed Jul 4 16:03:36 2012 for RIO by  doxygen 1.6.3