16 using namespace
Gaudi;
41 m_catalog = serviceLocator()->service(m_catalogSvcName);
42 if( !m_catalog.isValid() ) {
44 <<
"Unable to localize interface IFileCatalog from service:"
45 << m_catalogSvcName <<
endmsg;
48 m_incSvc = serviceLocator()->service(
"IncidentSvc");
49 if( !m_incSvc.isValid() ) {
73 IODataManager::Connections IODataManager::connections(
const IInterface* owner)
const {
77 if ( 0 == owner || c->
owner() == owner )
84 StatusCode IODataManager::connectRead(
bool keep_open, Connection* con) {
85 if ( !establishConnection(con) ) {
86 return connectDataIO(
UNKNOWN,Connection::READ,con->name(),
"UNKNOWN",keep_open,con);
89 return error(
"Failed to connect to data:"+dsn,
false);
93 StatusCode IODataManager::connectWrite(Connection* con,IoType mode,
CSTR doctype) {
94 if ( !establishConnection(con) ) {
95 return connectDataIO(
UNKNOWN,mode,con->name(),doctype,
true,con);
98 return error(
"Failed to connect to data:"+dsn,
false);
102 StatusCode IODataManager::read(Connection* con,
void*
const data,
size_t len) {
103 return establishConnection(con).
isSuccess() ? con->read(data,len) :
S_ERROR;
107 StatusCode IODataManager::write(Connection* con,
const void* data,
int len) {
108 return establishConnection(con).
isSuccess() ? con->write(data,len) :
S_ERROR;
112 long long int IODataManager::seek(Connection* con,
long long int where,
int origin) {
113 return establishConnection(con).isSuccess() ? con->seek(where,origin) : -1;
121 if ( ::strncasecmp(dsn.c_str(),
"FID:",4)==0 )
122 dsn = dataset.substr(4);
123 else if ( ::strncasecmp(dsn.c_str(),
"LFN:",4)==0 )
124 dsn = dataset.substr(4);
125 else if ( ::strncasecmp(dsn.c_str(),
"PFN:",4)==0 )
126 dsn = dataset.substr(4);
129 if ( j != m_fidMap.end() ) {
134 if ( (j=m_fidMap.find(fid)) != m_fidMap.end() )
136 if ( (j=m_fidMap.find(gfal_name)) != m_fidMap.end() )
138 if ( i != m_connectionMap.end() ) {
142 if ( (j=m_fidMap.find(pfn)) != m_fidMap.end() )
147 log <<
MSG::INFO <<
"Disconnect from dataset " << dsn
148 <<
" [" << fid <<
"]" <<
endmsg;
151 m_connectionMap.erase(i);
164 case Connection::READ:
167 case Connection::UPDATE:
168 case Connection::CREATE:
169 case Connection::RECREATE:
182 if ( c->
age() > m_ageLimit ) {
187 if ( !to_retire.
empty() ) {
192 log <<
MSG::INFO <<
"Disconnect from dataset " << c->
pfn()
204 if ( j != m_fidMap.end() ) {
206 return (i != m_connectionMap.end()) ? (*i).second->connection : 0;
211 StatusCode IODataManager::establishConnection(Connection* con) {
213 if ( !con->isConnected() ) {
215 if ( i != m_connectionMap.end() ) {
216 Connection*
c = (*i).second->connection;
219 return error(
"Severe logic bug: Twice identical connection object for DSN:"+con->name(),
true);
221 if ( reconnect((*i).second).isSuccess() ) {
230 return error(
"Severe logic bug: No connection object avalible.",
true);
234 IODataManager::connectDataIO(
int typ, IoType rw,
CSTR dataset,
CSTR technology,
bool keep_open,Connection* connection) {
239 if ( ::strncasecmp(dsn.c_str(),
"FID:",4)==0 )
240 dsn = dataset.substr(4), typ = FID;
241 else if ( ::strncasecmp(dsn.c_str(),
"LFN:",4)==0 )
242 dsn = dataset.substr(4), typ = LFN;
243 else if ( ::strncasecmp(dsn.c_str(),
"PFN:",4)==0 )
244 dsn = dataset.substr(4), typ = PFN;
246 return connectDataIO(PFN, rw, dsn, technology, keep_open, connection);
250 return IDataConnection::BAD_DATA_CONNECTION;
254 if ( fi == m_connectionMap.end() ) {
256 m_catalog->getPFN(dsn,files);
257 if ( files.
size() == 0 ) {
259 if ( m_quarantine ) s_badFiles.
insert(dsn);
261 error(
"connectDataIO> failed to resolve FID:"+dsn,
false).ignore();
262 return IDataConnection::BAD_DATA_CONNECTION;
264 else if ( dsn.length() == 36 && dsn[8]==
'-' && dsn[13]==
'-' ) {
266 m_fidMap[dsn] = m_fidMap[dataset] = m_fidMap[gfal_name] = dsn;
267 sc = connectDataIO(PFN, rw, gfal_name, technology, keep_open, connection);
269 if ( m_quarantine ) s_badFiles.
insert(dsn);
271 if ( m_quarantine ) s_badFiles.
insert(dsn);
273 error(
"connectDataIO> Failed to resolve FID:"+dsn,
false).ignore();
274 return IDataConnection::BAD_DATA_CONNECTION;
277 m_fidMap[dsn] = m_fidMap[dataset] = m_fidMap[pfn] = dsn;
278 sc = connectDataIO(PFN, rw, pfn, technology, keep_open, connection);
280 if ( m_quarantine ) s_badFiles.
insert(pfn);
282 return IDataConnection::BAD_DATA_CONNECTION;
295 if ( j == m_fidMap.end() ) {
299 fid = m_catalog->lookupLFN(dsn);
302 log <<
MSG::ERROR <<
"Failed to resolve LFN:" << dsn
303 <<
" Cannot access this dataset." <<
endmsg;
304 return IDataConnection::BAD_DATA_CONNECTION;
308 fid = m_catalog->lookupPFN(dsn);
309 if ( !fid.empty() ) m_catalog->getPFN(fid, files);
310 if ( files.
empty() ) {
311 if ( rw == Connection::CREATE || rw == Connection::RECREATE ) {
312 if ( fid.empty() ) fid = m_catalog->createFID();
313 m_catalog->registerPFN(fid,dsn,technology);
314 log <<
MSG::INFO <<
"Referring to dataset " << dsn
315 <<
" by its file ID:" << fid <<
endmsg;
330 if ( fi == m_connectionMap.end() ) {
331 connection->setFID(fid);
332 connection->setPFN(dsn);
333 Entry* e =
new Entry(technology, keep_open, rw, connection);
335 if ( !reconnect(e).isSuccess() ) {
337 if ( m_quarantine ) s_badFiles.
insert(dsn);
339 error(
"connectDataIO> Cannot connect to database: PFN="+dsn+
" FID="+fid,
false).ignore();
340 return IDataConnection::BAD_DATA_CONNECTION;
342 fid = connection->fid();
343 m_fidMap[dataset] = m_fidMap[dsn] = m_fidMap[fid] = fid;
344 if ( !(rw==Connection::CREATE || rw==Connection::RECREATE) ) {
345 if ( strcasecmp(dsn.c_str(),fid.c_str()) == 0 ) {
346 log <<
MSG::ERROR <<
"Referring to existing dataset " << dsn
347 <<
" by its physical name." <<
endmsg;
348 log <<
"You may not be able to navigate back to the input file"
349 <<
" -- processing continues" <<
endmsg;
356 if ( !reconnect((*fi).second).isSuccess() ) {
357 if ( m_quarantine ) s_badFiles.
insert(dsn);
359 error(
"connectDataIO> Cannot connect to database: PFN="+dsn+
" FID="+fid,
false).ignore();
360 return IDataConnection::BAD_DATA_CONNECTION;
364 sc = connectDataIO(FID, rw, fid, technology, keep_open, connection);
368 else if ( typ == LFN ) {
369 m_fidMap[dataset] = fid;
374 error(
std::string(
"connectDataIO> Caught exception:")+e.
what(),
false).ignore();
377 error(
std::string(
"connectDataIO> Caught unknown exception"),
false).ignore();
380 error(
"connectDataIO> The dataset "+dsn+
" cannot be opened.",
false).ignore();
382 return IDataConnection::BAD_DATA_CONNECTION;