Files | |
file | objectmanager-server.cc |
Codice di attivazione di un ObjectManager (oggetto CORBA di tipo fbfs::ObjectManager_i). | |
file | ObjectManager_i.cc |
Implementazione dei metodi della classe fbfs::ObjectManager_i. | |
file | ObjectManager_i.h |
Definizione della classe fbfs::ObjectManager_i. | |
file | Properties.h |
Definizione della classe fbfs::Properties. | |
Composti | |
class | fbfs::ObjectManager_i |
class | fbfs::Properties |
Funzioni | |
void | validate () |
Eseguito in single user mode prima dell'avvio del servizio si occupa di leggere lo stato degli Storage che gestisce, di portarli in uno stato consistente e di inizializzare la struttura Repository, che contiene una lista degli oggetti gestiti. Continua... |
|
Eseguito in single user mode prima dell'avvio del servizio si occupa di leggere lo stato degli Storage che gestisce, di portarli in uno stato consistente e di inizializzare la struttura Repository, che contiene una lista degli oggetti gestiti.
Definizione alla linea 44 del file Validate.cc. 00044 { 00045 TempRepository tr; 00046 00047 // PRIMA FASE: Query a tutti gli Storage registrati (nella struttura servers) del 00048 // loro contenuto. 00049 // Creazione della struttura TempRepository, mappa che associa ad ogni Id di oggetto 00050 // l'elenco delle terne <ServerOspitante, Obj_prop, Obj_ts> che rapprenentano ogni 00051 // copia dell'oggetto negli Storage. 00052 for(Servers::iterator it = servers.begin(); it != servers.end(); it++) { 00053 // Per ogni Storage faccio quanto segue: 00054 // - Lo contatto; se non riesco a raggiungerlo lo elimino dalla lista. 00055 // - Eseguo una get_dir e metto aggiorno la struttura tr. 00056 try { 00057 URI uri((*it).c_str()); 00058 CORBA::Object_var obj = utils::NameServer::get_object(orb, uri); 00059 fbfs::Storage_var server = fbfs::Storage::_narrow(obj); 00060 if(CORBA::is_nil(server)) 00061 throw NotFound(); 00062 00063 Obj_infoList *list = server->list(cert); 00064 for(int i=0; i<list->length(); i++) { 00065 Obj_info &info = (*list)[i]; 00066 string name(info.id.name); 00067 InstanceInfo instance; 00068 instance.server = (*it); 00069 instance.prop = info.prop; 00070 instance.ts = info.ts; 00071 tr[name].push_front(instance); 00072 }; 00073 } catch (...) { 00074 // In caso di errore --qualunque esso sia-- elimino il server dall'elenco. 00075 servers.erase(it); 00076 }; 00077 }; 00078 // Qui la struttura TempRepository è completa. 00079 00080 // SECONDA FASE: Validazione della struttura TempRepository (con eventuali operazioni 00081 // sugli storage per riportare la consistenza) e creazione della struttura Repository. 00082 // Procedo come segue: 00083 // - Per ogni oggetto nel TempRepository, invoco una procedura che lo convalidi, occupandosi 00084 // di rendere consistenti le istanze. 00085 // - Aggiungo ogni oggetto valido nella struttura Repository rep, con l'elenco dei server 00086 // che lo forniscono. 00087 00088 rep = Repository(); 00089 for( TempRepository::iterator i = tr.begin(); i != tr.end(); i++ ) { 00090 Servers s = validate( (*i).first, (*i).second ); 00091 if(s.size() != 0) 00092 rep[(*i).first] = s; 00093 }; 00094 } |