![]() |
|
|
Bdb packages | Design docs | Source docs | Guidelines | Recent releases |
|
Main Page Modules Namespace List Class Hierarchy Alphabetical List Compound List File List Compound Members File Members /BdbClusteringServer/BdbClustHintConsole.cc
Go to the documentation of this file.00001 //------------------------------------------------------------------------------ 00002 // File and Version Information: 00003 // $Id: BdbClustHintConsole.cc,v 1.12 2002/08/30 01:13:31 ryd Exp $ 00004 // 00005 // Description: 00006 // "Console" to the clustering server. 00007 // 00008 // Environment: 00009 // Software developed for the BaBar Detector at the SLAC B-Factory. 00010 // 00011 // Author List: 00012 // Jacek Becla 00013 // 00014 // Copyright Information: 00015 // Copyright (C) 2000 Stanford Linear Accelerator Center 00016 // 00017 //------------------------------------------------------------------------------ 00018 #include "BaBar/BaBar.hh" 00019 00020 // Workaround for CXX6.3 00021 #include <string.h> 00022 00023 #include "BdbUtil/Bdb.hh" 00024 #include "BdbUtil/BdbTestPersObj_16K.hh" 00025 #include "BdbApplication/BdbApplication.hh" 00026 #include "BdbApplication/BdbDebug.hh" 00027 #include "BdbApplication/BdbDomain.hh" 00028 #include "BdbClusteringServer/BdbClusteringServerC.h" 00029 #include "BdbClusteringServer/BdbClSrvCRef.hh" 00030 #include "BdbEventStore/BdbEventStore.hh" 00031 00032 #include <set> 00033 using std::set; 00034 00035 class Console 00036 { 00037 BdbClustSrvModule::ClientDescr _client; 00038 BdbClustSrvModule::BdbClusteringServer_var _theRef; 00039 d_Boolean _orbIsInit; 00040 00041 public: 00042 00043 Console(); 00044 BdbStatus initORB(int argc, char** argv); 00045 void waitUntilItIsReady(CORBA::Boolean wait4Precr); 00046 BdbStatus ping(); 00047 BdbStatus shutdown(CORBA::Boolean try2ReleaseConts, 00048 CORBA::Boolean force); 00049 BdbStatus recoverNow(); 00050 BdbStatus resynchronize(); 00051 void automaticPrecr(CORBA::Boolean enable); 00052 BdbStatus dumpAllGroups(CORBA::Boolean allGroups); 00053 BdbStatus listGroups(CORBA::Boolean all, CORBA::Boolean withDbs); 00054 BdbStatus listDbs(CORBA::Boolean all); 00055 BdbStatus printConts(CORBA::Boolean allGroups, 00056 CORBA::Short whichConts); 00057 BdbStatus initGroup(const BdbClustSrvModule::GroupDescr& descr, 00058 CORBA::Short no2Precr); 00059 BdbStatus shutdownGroup(const BdbClustSrvModule::GroupDescr& descr, 00060 CORBA::Boolean try2Recover); 00061 BdbStatus deleteGroup(const BdbClustSrvModule::GroupDescr& descr); 00062 BdbStatus precreateDbs(const BdbClustSrvModule::GroupDescr& descr, 00063 int nr2Precreate); 00064 BdbStatus closeActiveDbs(const BdbClustSrvModule::GroupDescr& descr, 00065 CORBA::Boolean force, 00066 CORBA::ULong onlyThisDbId); 00067 BdbStatus closeAllActiveDbs(); 00068 BdbStatus getOneContainer(const BdbClustSrvModule::GroupDescr& descr, 00069 BdbClustSrvModule::OID& oid); 00070 BdbStatus returnContainers(set<BdbClSrvCRef*,babar::Collection::PtrLess>& s, int setNPage); 00071 BdbStatus returnAllContainers(const char* hostName=0, int pid=0); 00072 BdbStatus loadSrv(const BdbClustSrvModule::GroupDescr& descr, 00073 CORBA::Boolean randomize); 00074 BdbStatus storeObjects(int nrObjects, BdbClustSrvModule::OID oid, int& nPage); 00075 BdbStatus storeObjects(int nrObjects, BdbClustSrvModule::OID oid); 00076 void test1(int nr); 00077 void test2(int nr); 00078 }; 00079 00080 00081 00082 Console::Console() 00083 { 00084 char hN[64]; 00085 memset(hN, 0, 64); 00086 gethostname(hN, 64); // this does not contain domain name 00087 struct hostent* hent1 = gethostbyname(hN); 00088 if ( 0 != hent1 ) { 00089 strcpy(hN, "console: "); 00090 strcat(hN, hent1->h_name); 00091 } 00092 00093 _client.hostName = CORBA::string_dup(hN); 00094 _client.pid = getpid(); 00095 _orbIsInit = d_False; 00096 } 00097 00098 00099 00100 00101 BdbStatus 00102 Console::initORB(int argc, char** argv) 00103 { 00104 CORBA::Environment theEnv; 00105 CORBA::ORB_ptr theOrb; 00106 00107 theOrb = CORBA::ORB_init(argc, argv, "hello", theEnv); 00108 if( theEnv.exception() != 0 ) { 00109 cerr << "CLIENT: theEnv = " << theEnv.exception() << endl; 00110 return BdbcError; 00111 } 00112 00113 char theStr[1024]; 00114 ifstream theIORFile(argv[1]); 00115 theIORFile >> theStr; 00116 theIORFile.close(); 00117 00118 CORBA::Object_var theObject; 00119 theObject = theOrb->string_to_object(theStr); 00120 if( CORBA::is_nil(theObject) ) { 00121 cerr << "CLIENT: Failed to translate specified IOR into object reference." << endl; 00122 return BdbcError; 00123 } 00124 00125 // Narrow obtained object reference into an object reference 00126 // of a specific class. 00127 _theRef = BdbClustSrvModule::BdbClusteringServer::_narrow(theObject); 00128 if( CORBA::is_nil(_theRef.in()) ) { 00129 cerr << "CLIENT: Failed to narrow the object reference into BdbClusteringServer." << endl; 00130 return BdbcError; 00131 } 00132 00133 _orbIsInit = d_True; 00134 return BdbcSuccess; 00135 } 00136 00137 00138 void 00139 Console::waitUntilItIsReady(CORBA::Boolean checkPrecr) 00140 { 00141 while ( ! _theRef->isReady(checkPrecr, _client) ) { 00142 sleep(5); 00143 COUT1 << "not ready" << endl; 00144 } 00145 } 00146 00147 00148 BdbStatus 00149 Console::ping() 00150 { 00151 BdbApplicationOrDomain* app = BdbApplicationOrDomain::activeInstance(); 00152 d_Boolean inTrans = ( BdbcNoOpen != app->mode() ); 00153 if ( ! inTrans ) { 00154 if ( BdbcSuccess != app->startRead("getfdid") ) { 00155 return BdbcError; 00156 } 00157 } 00158 int my_fdid = app->fd().number(); 00159 if ( ! inTrans ) { 00160 app->commit("getfdid"); 00161 } 00162 int server_fdid = 0; 00163 00164 if ( ! _theRef->ping(server_fdid, _client)) { 00165 cerr << "Server not responding" << endl; 00166 return BdbcError; 00167 } 00168 if ( server_fdid == my_fdid ) { 00169 cout << "Server is running" << endl; 00170 } else { 00171 cout << "Server is running. \n" 00172 << "Warning: OO_FD_BOOT does not correspond to fd " 00173 << "served by the server: OO_FD_BOOT's fdid = " << my_fdid 00174 << ", server's fdid = " << server_fdid << endl; 00175 return BdbcError; 00176 } 00177 00178 return BdbcSuccess; 00179 } 00180 00181 00182 00183 BdbStatus 00184 Console::shutdown(CORBA::Boolean try2ReleaseConts, 00185 CORBA::Boolean force) 00186 { 00187 BdbClustSrvModule::RetStatus* ret; 00188 ret = _theRef->shutdown(try2ReleaseConts, force, _client); 00189 if ( 0 == ret ) { 00190 cerr << "Returned RetStatus object = 0" << endl; 00191 return BdbcError; 00192 } 00193 if ( ret->level != BdbClustSrvModule::Success ) { 00194 if ( ret->level == BdbClustSrvModule::Warning ) { 00195 cout << "Warning: " << ret->msg << endl; 00196 } else { 00197 cout << "Error: " << ret->msg << endl; 00198 return BdbcError; 00199 } 00200 } 00201 delete ret; 00202 00203 return BdbcSuccess; 00204 } 00205 00206 00207 BdbStatus 00208 Console::recoverNow() 00209 { 00210 BdbClustSrvModule::RetStatus* ret; 00211 ret = _theRef->recoverNow(_client); 00212 if ( 0 == ret ) { 00213 cerr << "Returned RetStatus object = 0" << endl; 00214 return BdbcError; 00215 } 00216 if ( ret->level != BdbClustSrvModule::Success ) { 00217 if ( ret->level == BdbClustSrvModule::Warning ) { 00218 cout << "Warning: " << ret->msg << endl; 00219 } else { 00220 cout << "Error: " << ret->msg << endl; 00221 return BdbcError; 00222 } 00223 } 00224 delete ret; 00225 00226 return BdbcSuccess; 00227 } 00228 00229 00230 00231 BdbStatus 00232 Console::resynchronize() 00233 { 00234 BdbClustSrvModule::RetStatus* ret; 00235 ret = _theRef->resynchronize(_client); 00236 if ( 0 == ret ) { 00237 cerr << "Returned RetStatus object = 0" << endl; 00238 return BdbcError; 00239 } 00240 if ( ret->level != BdbClustSrvModule::Success ) { 00241 if ( ret->level == BdbClustSrvModule::Warning ) { 00242 cout << "Warning: " << ret->msg << endl; 00243 } else { 00244 cout << "Error: " << ret->msg << endl; 00245 return BdbcError; 00246 } 00247 } 00248 delete ret; 00249 00250 return BdbcSuccess; 00251 } 00252 00253 00254 void 00255 Console::automaticPrecr(CORBA::Boolean enable) 00256 { 00257 if ( enable ) { 00258 _theRef->enableAutomaticPrecr(_client); 00259 } else { 00260 _theRef->disableAutomaticPrecr(_client); 00261 } 00262 } 00263 00264 00265 BdbStatus 00266 Console::dumpAllGroups(CORBA::Boolean allGroups) 00267 { 00268 if ( ! _orbIsInit ) { 00269 return BdbcError; 00270 } 00271 00272 char* output = 0; 00273 _theRef->print("send", allGroups, _client, output); 00274 if ( 0 != output ) { 00275 cout << output << endl; 00276 delete [] output; 00277 } 00278 return BdbcSuccess; 00279 } 00280 00281 00282 BdbStatus 00283 Console::listGroups(CORBA::Boolean all, 00284 CORBA::Boolean withDbs) 00285 { 00286 if ( ! _orbIsInit ) { 00287 return BdbcError; 00288 } 00289 00290 char* output = 0; 00291 BdbClustSrvModule::RetStatus* ret; 00292 ret = _theRef->listGroups("send", all, withDbs, _client, output); 00293 if ( 0 == ret ) { 00294 cerr << "Returned RetStatus object = 0" << endl; 00295 return BdbcError; 00296 } 00297 if ( ret->level != BdbClustSrvModule::Success ) { 00298 if ( ret->level == BdbClustSrvModule::Warning ) { 00299 cout << "Warning: " << ret->msg << endl; 00300 } else { 00301 cout << "Error: " << ret->msg << endl; 00302 return BdbcError; 00303 } 00304 } 00305 delete ret; 00306 00307 if ( 0 != output ) { 00308 cout << output << endl; 00309 delete [] output; 00310 } 00311 return BdbcSuccess; 00312 } 00313 00314 00315 00316 BdbStatus 00317 Console::listDbs(CORBA::Boolean all) 00318 { 00319 if ( ! _orbIsInit ) { 00320 return BdbcError; 00321 } 00322 00323 char* output = 0; 00324 BdbClustSrvModule::RetStatus* ret; 00325 ret = _theRef->listDbs("send", all, _client, output); 00326 if ( 0 == ret ) { 00327 cerr << "Returned RetStatus object = 0" << endl; 00328 return BdbcError; 00329 } 00330 if ( ret->level != BdbClustSrvModule::Success ) { 00331 if ( ret->level == BdbClustSrvModule::Warning ) { 00332 cout << "Warning: " << ret->msg << endl; 00333 } else { 00334 cout << "Error: " << ret->msg << endl; 00335 return BdbcError; 00336 } 00337 } 00338 delete ret; 00339 if ( 0 != output ) { 00340 cout << output << endl; 00341 delete [] output; 00342 } 00343 return BdbcSuccess; 00344 } 00345 00346 00347 void 00348 Console::test1(int nr) 00349 { 00350 if ( _orbIsInit ) { 00351 for ( int i=0 ; i<nr ; i++ ) { 00352 _theRef->test1(123); 00353 } 00354 } 00355 } 00356 00357 00358 void 00359 Console::test2(int nr) 00360 { 00361 if ( _orbIsInit ) { 00362 for ( int i=0 ; i<nr ; i++ ) { 00363 _theRef->test2(_client); 00364 } 00365 } 00366 } 00367 00368 00369 00370 00371 00372 00373 BdbStatus 00374 Console::printConts(CORBA::Boolean allGroups, 00375 CORBA::Short whichConts) 00376 { 00377 if ( ! _orbIsInit ) { 00378 return BdbcError; 00379 } 00380 00381 char* output = 0; 00382 BdbClustSrvModule::RetStatus* ret; 00383 ret = _theRef->printConts("send", allGroups, whichConts, _client, output); 00384 if ( 0 == ret ) { 00385 cerr << "Returned RetStatus object = 0" << endl; 00386 return BdbcError; 00387 } 00388 if ( ret->level != BdbClustSrvModule::Success ) { 00389 if ( ret->level == BdbClustSrvModule::Warning ) { 00390 cout << "Warning: " << ret->msg << endl; 00391 } else { 00392 cout << "Error: " << ret->msg << endl; 00393 return BdbcError; 00394 } 00395 } 00396 delete ret; 00397 if ( 0 != output ) { 00398 cout << output << endl; 00399 delete [] output; 00400 } 00401 return BdbcSuccess; 00402 } 00403 00404 00405 00406 BdbStatus 00407 Console::initGroup(const BdbClustSrvModule::GroupDescr& descr, 00408 CORBA::Short no2Precr) 00409 { 00410 if ( ! _orbIsInit ) { 00411 return BdbcError; 00412 } 00413 00414 BdbClustSrvModule::RetStatus* ret; 00415 ret = _theRef->initializeGroup(descr, no2Precr, _client); 00416 if ( 0 == ret ) { 00417 cerr << "Returned RetStatus object = 0" << endl; 00418 return BdbcError; 00419 } 00420 if ( ret->level != BdbClustSrvModule::Success ) { 00421 if ( ret->level == BdbClustSrvModule::Warning ) { 00422 cout << "Warning: " << ret->msg << endl; 00423 } else { 00424 cout << "Error: " << ret->msg << endl; 00425 return BdbcError; 00426 } 00427 } 00428 delete ret; 00429 00430 return BdbcSuccess; 00431 } 00432 00433 00434 00435 BdbStatus 00436 Console::shutdownGroup(const BdbClustSrvModule::GroupDescr& descr, 00437 CORBA::Boolean try2Recover) 00438 { 00439 if ( ! _orbIsInit ) { 00440 return BdbcError; 00441 } 00442 00443 BdbClustSrvModule::RetStatus* ret; 00444 ret = _theRef->shutdownGroup(descr, try2Recover, _client); 00445 if ( 0 == ret ) { 00446 cerr << "Returned RetStatus object = 0" << endl; 00447 return BdbcError; 00448 } 00449 if ( ret->level != BdbClustSrvModule::Success ) { 00450 if ( ret->level == BdbClustSrvModule::Warning ) { 00451 cout << "Warning: " << ret->msg << endl; 00452 } else { 00453 cout << "Error: " << ret->msg << endl; 00454 return BdbcError; 00455 } 00456 } 00457 delete ret; 00458 00459 return BdbcSuccess; 00460 } 00461 00462 00463 00464 BdbStatus 00465 Console::deleteGroup(const BdbClustSrvModule::GroupDescr& descr) 00466 { 00467 if ( ! _orbIsInit ) { 00468 return BdbcError; 00469 } 00470 00471 BdbClustSrvModule::RetStatus* ret; 00472 ret = _theRef->deleteGroup(descr, _client); 00473 if ( 0 == ret ) { 00474 cerr << "Returned RetStatus object = 0" << endl; 00475 return BdbcError; 00476 } 00477 if ( ret->level != BdbClustSrvModule::Success ) { 00478 if ( ret->level == BdbClustSrvModule::Warning ) { 00479 cout << "Warning: " << ret->msg << endl; 00480 } else { 00481 cout << "Error: " << ret->msg << endl; 00482 return BdbcError; 00483 } 00484 } 00485 delete ret; 00486 00487 return BdbcSuccess; 00488 } 00489 00490 00491 00492 00493 BdbStatus 00494 Console::precreateDbs(const BdbClustSrvModule::GroupDescr& descr, 00495 int nr2Precreate) 00496 { 00497 if ( ! _orbIsInit ) { 00498 return BdbcError; 00499 } 00500 00501 BdbClustSrvModule::RetStatus* ret; 00502 ret = _theRef->precreateDbs(descr, nr2Precreate, _client); 00503 if ( 0 == ret ) { 00504 cerr << "Returned RetStatus object = 0" << endl; 00505 return BdbcError; 00506 } 00507 if ( ret->level != BdbClustSrvModule::Success ) { 00508 if ( ret->level == BdbClustSrvModule::Warning ) { 00509 cout << "Warning: " << ret->msg << endl; 00510 } else { 00511 cout << "Error: " << ret->msg << endl; 00512 return BdbcError; 00513 } 00514 } 00515 delete ret; 00516 ret = 0; 00517 return BdbcSuccess; 00518 } 00519 00520 00521 00522 BdbStatus 00523 Console::closeActiveDbs(const BdbClustSrvModule::GroupDescr& descr, 00524 CORBA::Boolean force, 00525 CORBA::ULong onlyThisDbId) 00526 { 00527 if ( ! _orbIsInit ) { 00528 return BdbcError; 00529 } 00530 00531 BdbClustSrvModule::RetStatus* ret; 00532 ret = _theRef->closeActiveDbs(descr, force, onlyThisDbId, _client); 00533 if ( 0 == ret ) { 00534 cerr << "Returned RetStatus object = 0" << endl; 00535 return BdbcError; 00536 } 00537 if ( ret->level != BdbClustSrvModule::Success ) { 00538 if ( ret->level == BdbClustSrvModule::Warning ) { 00539 cout << "Warning: " << ret->msg << endl; 00540 } else { 00541 cout << "Error: " << ret->msg << endl; 00542 return BdbcError; 00543 } 00544 } 00545 delete ret; 00546 ret = 0; 00547 return BdbcSuccess; 00548 } 00549 00550 00551 00552 BdbStatus 00553 Console::closeAllActiveDbs() 00554 { 00555 if ( ! _orbIsInit ) { 00556 return BdbcError; 00557 } 00558 00559 BdbClustSrvModule::RetStatus* ret; 00560 ret = _theRef->closeAllActiveDbs(_client); 00561 if ( 0 == ret ) { 00562 cerr << "Returned RetStatus object = 0" << endl; 00563 return BdbcError; 00564 } 00565 if ( ret->level != BdbClustSrvModule::Success ) { 00566 if ( ret->level == BdbClustSrvModule::Warning ) { 00567 cout << "Warning: " << ret->msg << endl; 00568 } else { 00569 cout << "Error: " << ret->msg << endl; 00570 return BdbcError; 00571 } 00572 } 00573 delete ret; 00574 ret = 0; 00575 return BdbcSuccess; 00576 } 00577 00578 00579 00580 BdbStatus 00581 Console::getOneContainer(const BdbClustSrvModule::GroupDescr& descr, 00582 BdbClustSrvModule::OID& oid) 00583 { 00584 if ( ! _orbIsInit ) { 00585 return BdbcError; 00586 } 00587 00588 BdbClustSrvModule::RetStatus* ret; 00589 ret = _theRef->getOneContainer(descr, _client, oid); 00590 if ( 0 == ret ) { 00591 cerr << "Returned RetStatus object = 0" << endl; 00592 return BdbcError; 00593 } 00594 if ( ret->level != BdbClustSrvModule::Success ) { 00595 if ( ret->level == BdbClustSrvModule::Warning ) { 00596 cout << "Warning: " << ret->msg << endl; 00597 if ( ! strcmp(ret->msg, "wait") ) { 00598 cout << "Waiting " << oid.sl << " sec for precreation to finish" 00599 << ", precreation started " << oid.pg << " sec ago" << endl; 00600 sleep(oid.sl); 00601 00602 cout << "Attempting to get container again" << endl; 00603 delete ret; 00604 return getOneContainer(descr, oid); 00605 } 00606 } else { 00607 cout << "Error: " << ret->msg << endl; 00608 return BdbcError; 00609 } 00610 } 00611 delete ret; 00612 ret = 0; 00613 COUT1 << "Got: [" << oid.db << "-" << oid.oc << "-" << oid.pg << "-" << oid.sl << "]" << endl; 00614 return BdbcSuccess; 00615 } 00616 00617 00618 BdbStatus 00619 Console::returnAllContainers(const char* host, int pid) 00620 { 00621 if ( ! _orbIsInit ) { 00622 return BdbcError; 00623 } 00624 00625 BdbClustSrvModule::RetStatus* ret = 0; 00626 00627 if ( 0 == host ) { 00628 ret = _theRef->returnAllContainers(_client); 00629 } else { 00630 BdbClustSrvModule::ClientDescr client; 00631 client.hostName = CORBA::string_dup(host); 00632 client.pid = pid; 00633 ret = _theRef->returnAllContainers(client); 00634 } 00635 00636 if ( 0 == ret ) { 00637 cerr << "Returned RetStatus object = 0" << endl; 00638 return BdbcError; 00639 } 00640 if ( ret->level != BdbClustSrvModule::Success ) { 00641 if ( ret->level == BdbClustSrvModule::Warning ) { 00642 cout << "Warning: " << ret->msg << endl; 00643 } else { 00644 cout << "Error: " << ret->msg << endl; 00645 return BdbcError; 00646 } 00647 } 00648 delete ret; 00649 ret = 0; 00650 return BdbcSuccess; 00651 } 00652 00653 00654 00655 00656 BdbStatus 00657 Console::returnContainers(set<BdbClSrvCRef*,babar::Collection::PtrLess>& s, int setNPage) 00658 { 00659 if ( ! _orbIsInit ) { 00660 return BdbcError; 00661 } 00662 00663 BdbClSrvCRef* cr; 00664 int i = 0, len = s.size(); 00665 BdbClustSrvModule::OIDArray array(len); 00666 array.length(len); 00667 set<BdbClSrvCRef*,babar::Collection::PtrLess>::iterator iter=s.begin(); 00668 00669 if ( setNPage ) { 00670 BdbApplicationOrDomain::activeInstance()->startRead("a"); 00671 } 00672 00673 while ( iter!=s.end() ) { 00674 cr=*iter; 00675 ooRef(ooContObj) r = cr->getContRef(); 00676 BdbClustSrvModule::OID oid; 00677 oid.db = r.get_DB(); 00678 oid.oc = r.get_OC(); 00679 oid.pg = r.get_page(); 00680 oid.sl = r.get_slot(); 00681 if ( setNPage ) { 00682 oid.noPg = r.nPage(); 00683 r.unlock(); 00684 } else { 00685 oid.noPg = 0; 00686 } 00687 array[i++] = oid; 00688 iter++; 00689 } 00690 00691 if ( setNPage ) { 00692 BdbApplicationOrDomain::activeInstance()->commit("a"); 00693 } 00694 00695 BdbClustSrvModule::RetStatus* ret = _theRef->returnContainers(array, _client); 00696 00697 if ( 0 == ret ) { 00698 cerr << "Returned RetStatus object = 0" << endl; 00699 return BdbcError; 00700 } 00701 if ( ret->level != BdbClustSrvModule::Success ) { 00702 if ( ret->level == BdbClustSrvModule::Warning ) { 00703 cout << "Warning: " << ret->msg << endl; 00704 } else { 00705 cout << "Error: " << ret->msg << endl; 00706 return BdbcError; 00707 } 00708 } 00709 delete ret; 00710 ret = 0; 00711 return BdbcSuccess; 00712 } 00713 00714 00715 00716 00717 00718 BdbStatus 00719 Console::loadSrv(const BdbClustSrvModule::GroupDescr& descr, d_Boolean randomize) 00720 { 00721 if ( ! _orbIsInit ) { 00722 return BdbcError; 00723 } 00724 00725 long startTime = time(0); 00726 long number = 0; 00727 00728 while ( 1 ) { 00729 number++; 00730 // get container 00731 BdbClustSrvModule::OID oid; 00732 COUT1 << "--> Asking for container" << endl; 00733 if ( BdbcSuccess != getOneContainer(descr, oid) ) { 00734 cerr << "getOneContainer failed" << endl; 00735 return BdbcError; 00736 } 00737 00738 int nr = 0; 00739 if ( randomize ) { 00740 // write some objects (0-8) 00741 srand(time(0)); 00742 nr = rand() % 9; 00743 } 00744 COUT1 << "--> Writing " << nr << " objects" << endl; 00745 storeObjects(nr, oid); 00746 00747 // return containers 00748 COUT1 << "--> Returning containers" << endl; 00749 if ( BdbcSuccess != returnAllContainers() ) { 00750 cout << "returning containers failed" << endl; 00751 return BdbcError; 00752 } 00753 00754 if ( randomize ) { 00755 // sleep some time (0-10 sec) 00756 nr = rand() % 10; COUT1 << "Sleeping " << nr << " sec" << endl; sleep(nr); 00757 } 00758 00759 // maybe stop all the process 00760 if ( 0 == access("/u/sf/becla/temp/stopCSLoad", F_OK) ) { 00761 break; 00762 } 00763 } 00764 00765 long diff = time(0) - startTime; 00766 if ( diff > 0 ) { 00767 double speed = ((double) number) / ((double) diff); 00768 cout << "total time = " << diff << ", number = " << number << " [" << speed << " Hz]" << endl; 00769 } 00770 00771 return BdbcSuccess; 00772 } 00773 00774 00775 00776 BdbStatus 00777 Console::storeObjects(int nrObjects, BdbClustSrvModule::OID oid) 00778 { 00779 int nPage = 0; 00780 return storeObjects(nrObjects, oid, nPage); 00781 } 00782 00783 00784 00785 BdbStatus 00786 Console::storeObjects(int nrObjects, BdbClustSrvModule::OID oid, int& nPage) 00787 { 00788 if ( nrObjects <= 0 ) { 00789 return BdbcSuccess; 00790 } 00791 00792 const char* fdName = getenv("OO_FD_BOOT"); 00793 if ( 0 == fdName ) { 00794 cerr << "OO_FD_BOOT not set" << endl; 00795 return BdbcError; 00796 } 00797 00798 ooTrans trans; 00799 trans.start(); 00800 ooHandle(ooFDObj) fdH; 00801 if ( oocSuccess != fdH.open(fdName, oocUpdate) ) { 00802 cerr << "Unable to open fd" << endl; 00803 return BdbcError; 00804 } 00805 ooRef(ooContObj) r; 00806 r.set_DB(oid.db); 00807 r.set_OC(oid.oc); 00808 r.set_page(oid.pg); 00809 r.set_slot(oid.sl); 00810 ooHandle(ooContObj) h = r; 00811 if ( oocSuccess != h.open(oocUpdate) ) { 00812 cerr << "Unable to open container" << endl; 00813 return BdbcError; 00814 } 00815 00816 //cout << "nPage before creating " << nrObjects << " objects = " << h.nPage() << endl; 00817 00818 ooHandle(BdbTestPersObj_16K) obj; 00819 for ( int i=0 ; i<nrObjects ; i++) { 00820 obj = new (h) BdbTestPersObj_16K(); 00821 if ( h.nPage() > oid.noPg ) { 00822 cout << "container full, " << i << " objects stored" << endl; 00823 break; 00824 00825 } 00826 } 00827 00828 //cout << "nPage after creating objects = " << h.nPage() << endl; 00829 00830 nPage = h.nPage(); 00831 00832 trans.commit(); 00833 return BdbcSuccess; 00834 } 00835 00836 00837 // ======================================================== 00838 // ======================================================== 00839 // ======================================================== 00840 00841 int runCommand(int argc, char** argv); 00842 void help(); 00843 00844 Console cc; 00845 00846 int main(int argc, char** argv) 00847 { 00848 if ( argc < 3 ) { 00849 help(); 00850 return 1; 00851 } 00852 00853 // Start a domain (any domain) 00854 BdbEventStore::instance()->activate(); 00855 00856 if ( BdbcSuccess != cc.initORB(argc, argv) ) { 00857 return 1; 00858 } 00859 00860 return runCommand(argc, argv); 00861 } 00862 00863 00864 00865 // ======================================================== 00866 // ======================================================== 00867 // ======================================================== 00868 00869 00870 int runCommand(int argc, char** argv) 00871 { 00872 if ( 3 > argc ) { 00873 cout << "incorrect number of arguments" << endl; 00874 return 1; 00875 } 00876 if ( 0 == strcmp(argv[2], "-ping") ) { 00877 if ( BdbcSuccess == cc.ping() ) { 00878 return 0; 00879 } 00880 return 1; 00881 } 00882 if ( 0 == strcmp(argv[2], "-print") ) { 00883 if ( 4 != argc ) { 00884 cout << "-print: expected more arguments" << endl; 00885 return 2; 00886 } 00887 CORBA::Boolean allGroups = 0; 00888 if ( argv[3][0] == '1' ) { 00889 allGroups = 1; 00890 } 00891 return BdbcSuccess != cc.dumpAllGroups(allGroups); 00892 } else if ( 0 == strcmp(argv[2], "-listGroups") ) { 00893 if ( 5 != argc ) { 00894 cout << "-listGroups: expected more arguments" << endl; 00895 return 2; 00896 } 00897 CORBA::Boolean all = 0; 00898 if ( argv[3][0] == '1' ) { 00899 all = 1; 00900 } 00901 CORBA::Boolean withDbs = 0; 00902 if ( argv[4][0] == '1' ) { 00903 withDbs = 1; 00904 } 00905 return BdbcSuccess != cc.listGroups(all, withDbs); 00906 } else if ( 0 == strcmp(argv[2], "-listDbs") ) { 00907 if ( 4 != argc ) { 00908 cout << "-listDbs: expected more arguments" << endl; 00909 return 2; 00910 } 00911 CORBA::Boolean all = 0; 00912 if ( argv[3][0] == '1' ) { 00913 all = 1; 00914 } 00915 return BdbcSuccess != cc.listDbs(all); 00916 } else if ( 0 == strcmp(argv[2], "-printConts") ) { 00917 if ( 5 != argc ) { 00918 cout << "-printConts: expected more arguments" << endl; 00919 return 2; 00920 } 00921 CORBA::Boolean all = 0; 00922 if ( argv[3][0] == '1' ) { 00923 all = 1; 00924 } 00925 CORBA::Short whichConts = (CORBA::Short) atoi(argv[4]); 00926 return BdbcSuccess != cc.printConts(all, whichConts); 00927 } else if ( 0 == strcmp(argv[2], "-shutdown") ) { 00928 if ( 5 != argc ) { 00929 cout << "-shutdown: expected more arguments" << endl; 00930 return 2; 00931 } 00932 CORBA::Boolean try2ReleaseConts = 0; 00933 if ( argv[3][0] == '1' ) { 00934 try2ReleaseConts = 1; 00935 } 00936 CORBA::Boolean force = 0; 00937 if ( argv[4][0] == '1' ) { 00938 force = 1; 00939 } 00940 return BdbcSuccess != cc.shutdown(try2ReleaseConts, force); 00941 } else if ( 0 == strcmp(argv[2], "-recoverNow") ) { 00942 return BdbcSuccess != cc.recoverNow(); 00943 } else if ( 0 == strcmp(argv[2], "-resynchronize") ) { 00944 return BdbcSuccess != cc.resynchronize(); 00945 } else if ( 0 == strcmp(argv[2], "-automaticPrecr") ) { 00946 if ( 4 != argc ) { 00947 cout << "-automaticPrecr: expected more arguments" << endl; 00948 return 2; 00949 } 00950 CORBA::Boolean enable = 0; 00951 if ( argv[3][0] == '1' ) { 00952 enable = 1; 00953 } 00954 cc.automaticPrecr(enable); 00955 return 0; 00956 } else if ( 0 == strcmp(argv[2], "-initGroup") ) { 00957 if ( 9 != argc ) { 00958 cout << "-initGroup: incorrect number of arguments" << endl; 00959 help(); 00960 return 2; 00961 } 00962 BdbClustSrvModule::GroupDescr descr; 00963 descr.clusterName = CORBA::string_dup(argv[3]); 00964 descr.sdName = CORBA::string_dup("evs"); 00965 descr.authLevel = argv[4][0]; 00966 descr.authName = CORBA::string_dup(argv[5]); 00967 descr.compName = CORBA::string_dup(argv[6]); 00968 descr.streamName = CORBA::string_dup(argv[7]); 00969 CORBA::Short no2Precr = atoi(argv[8]); 00970 if ( no2Precr == -1 ) { 00971 cout << "Incorrent arg: no dbs to precreate" << endl; 00972 return BdbcError; 00973 } 00974 return BdbcSuccess != cc.initGroup(descr, no2Precr); 00975 } else if ( 0 == strcmp(argv[2], "-shutdownGroup") ) { 00976 if ( 9 != argc ) { 00977 cout << "-shutdownGroup: incorrect number of arguments" << endl; 00978 help(); 00979 return 2; 00980 } 00981 BdbClustSrvModule::GroupDescr descr; 00982 descr.clusterName = CORBA::string_dup(argv[3]); 00983 descr.sdName = CORBA::string_dup("evs"); 00984 descr.authLevel = argv[4][0]; 00985 descr.authName = CORBA::string_dup(argv[5]); 00986 descr.compName = CORBA::string_dup(argv[6]); 00987 descr.streamName = CORBA::string_dup(argv[7]); 00988 CORBA::Boolean try2Recover = 0; 00989 if ( argv[8][0] == '1' ) { 00990 try2Recover = 1; 00991 } 00992 return BdbcSuccess != cc.shutdownGroup(descr, try2Recover); 00993 } else if ( 0 == strcmp(argv[2], "-deleteGroup") ) { 00994 if ( 8 != argc ) { 00995 cout << "-deleteGroup: incorrect number of arguments" << endl; 00996 return 2; 00997 } 00998 BdbClustSrvModule::GroupDescr descr; 00999 descr.clusterName = CORBA::string_dup(argv[3]); 01000 descr.sdName = CORBA::string_dup("evs"); 01001 descr.authLevel = argv[4][0]; 01002 descr.authName = CORBA::string_dup(argv[5]); 01003 descr.compName = CORBA::string_dup(argv[6]); 01004 descr.streamName = CORBA::string_dup(argv[7]); 01005 return BdbcSuccess != cc.deleteGroup(descr); 01006 } else if ( 0 == strcmp(argv[2], "-precrDbs") ) { 01007 if ( 9 != argc ) { 01008 cout << "-precrDbs: incorrect number of arguments" << endl; 01009 return 2; 01010 } 01011 BdbClustSrvModule::GroupDescr descr; 01012 descr.clusterName = CORBA::string_dup(argv[3]); 01013 descr.sdName = CORBA::string_dup("evs"); 01014 descr.authLevel = argv[4][0]; 01015 descr.authName = CORBA::string_dup(argv[5]); 01016 descr.compName = CORBA::string_dup(argv[6]); 01017 descr.streamName = CORBA::string_dup(argv[7]); 01018 int nr2Precr = atoi(argv[8]); 01019 if ( nr2Precr < 1 ) { 01020 cerr << "nr2Precr = " << nr2Precr << endl; 01021 return 1; 01022 } 01023 return BdbcSuccess != cc.precreateDbs(descr, nr2Precr); 01024 } else if ( 0 == strcmp(argv[2], "-closeActiveDbs") ) { 01025 if ( 10 != argc ) { 01026 cout << "-closeActiveDbs: incorrect number of arguments" << endl; 01027 return 2; 01028 } 01029 BdbClustSrvModule::GroupDescr descr; 01030 descr.clusterName = CORBA::string_dup(argv[3]); 01031 descr.sdName = CORBA::string_dup("evs"); 01032 descr.authLevel = argv[4][0]; 01033 descr.authName = CORBA::string_dup(argv[5]); 01034 descr.compName = CORBA::string_dup(argv[6]); 01035 descr.streamName = CORBA::string_dup(argv[7]); 01036 CORBA::Boolean force = 0; 01037 if ( '1' == argv[8][0] ) { 01038 force = 1; 01039 } 01040 CORBA::ULong onlyThisDbId = atoi(argv[9]); 01041 return BdbcSuccess != cc.closeActiveDbs(descr, force, onlyThisDbId); 01042 } else if ( 0 == strcmp(argv[2], "-closeAllActiveDbs") ) { 01043 return BdbcSuccess != cc.closeAllActiveDbs(); 01044 } else if ( 0 == strcmp(argv[2], "-getConts") ) { 01045 if ( 13 != argc ) { 01046 cout << "-getConts: incorrect number of arguments" << endl; 01047 return 2; 01048 } 01049 BdbClustSrvModule::GroupDescr descr; 01050 descr.clusterName = CORBA::string_dup(argv[3]); 01051 descr.sdName = CORBA::string_dup("evs"); 01052 descr.authLevel = argv[4][0]; 01053 descr.authName = CORBA::string_dup(argv[5]); 01054 descr.compName = CORBA::string_dup(argv[6]); 01055 descr.streamName = CORBA::string_dup(argv[7]); 01056 int nrConts = atoi(argv[8]); 01057 if ( 0 >= nrConts ) { 01058 cerr << "error: nrConts = " << nrConts << endl; 01059 return 1; 01060 } 01061 int sleepBetween = atoi(argv[9]); 01062 if ( sleepBetween < 0 || sleepBetween > 1000 ) { 01063 cerr << "error: sleepBetween = " << sleepBetween << endl; 01064 return 1; 01065 } 01066 int nrObjects = atoi(argv[10]); 01067 01068 CORBA::Boolean returnConts = 0; 01069 if ( argv[11][0] == '1' ) { 01070 returnConts = 1; 01071 } 01072 CORBA::Boolean setNPage = 0; 01073 if ( argv[12][0] == '1' ) { 01074 setNPage = 1; 01075 } 01076 01077 set<BdbClSrvCRef*,babar::Collection::PtrLess> s; // of BdbClSrvCRef 01078 for(int i=0 ; i<nrConts ; i++) { 01079 BdbClustSrvModule::OID oid; 01080 if ( BdbcSuccess != cc.getOneContainer(descr, oid) ) { 01081 cerr << "getOneContainer failed, i=" << i << endl; 01082 return 2; 01083 } 01084 cout << "Got: [" << oid.db << "-" << oid.oc << "-" 01085 << oid.pg << "-" << oid.sl << "], noPg=" << oid.noPg << endl; 01086 01087 BdbRef(ooObj) r; 01088 r.set_DB(oid.db); 01089 r.set_OC(oid.oc); 01090 r.set_page(oid.pg); 01091 r.set_slot(oid.sl); 01092 s.insert(new BdbClSrvCRef(r)); 01093 01094 if ( nrObjects > 0 ) { 01095 if ( BdbcSuccess != cc.storeObjects(nrObjects, oid) ) { 01096 cerr << "storeObjects failed" << endl; 01097 } 01098 } 01099 if ( sleepBetween > 0 ) { 01100 sleep(sleepBetween); 01101 } 01102 } 01103 if ( returnConts ) { 01104 if ( BdbcSuccess != cc.returnContainers(s, setNPage) ) { 01105 cerr << "returnAllContainers failed" << endl; 01106 return 3; 01107 } 01108 } 01109 BdbClSrvCRef* cr; 01110 set<BdbClSrvCRef*,babar::Collection::PtrLess>::iterator iter=s.begin(); 01111 while ( iter!=s.end() ) { 01112 delete *iter; 01113 iter++; 01114 } 01115 return 0; 01116 } else if ( 0 == strcmp(argv[2], "-write") ) { 01117 if ( 10 != argc ) { 01118 cout << "-write: incorrect number of arguments" << endl; 01119 help(); 01120 return 2; 01121 } 01122 BdbClustSrvModule::GroupDescr descr; 01123 descr.clusterName = CORBA::string_dup(argv[3]); 01124 descr.sdName = CORBA::string_dup("evs"); 01125 descr.authLevel = argv[4][0]; 01126 descr.authName = CORBA::string_dup(argv[5]); 01127 descr.compName = CORBA::string_dup(argv[6]); 01128 descr.streamName = CORBA::string_dup(argv[7]); 01129 int nrObjects = atoi(argv[8]); 01130 if ( 0 >= nrObjects ) { 01131 cerr << "error: nrObjects = " << nrObjects << endl; 01132 return 1; 01133 } 01134 int checkEvery = atoi(argv[9]); 01135 if ( 0 >= checkEvery ) { 01136 cerr << "checkEvery invalid" << endl; 01137 return 2; 01138 } 01139 int sleepBetween = atoi(argv[9]); 01140 if ( sleepBetween < 0 || sleepBetween > 1000 ) { 01141 cerr << "error: sleepBetween = " << sleepBetween << endl; 01142 return 1; 01143 } 01144 01145 BdbClustSrvModule::OID oid; 01146 if ( BdbcSuccess != cc.getOneContainer(descr, oid) ) { 01147 cerr << "getOneContainer failed" << endl; 01148 return 2; 01149 } 01150 cout << "Got: [" << oid.db << "-" << oid.oc << "-" 01151 << oid.pg << "-" << oid.sl << "], noPg=" << oid.noPg << endl; 01152 01153 01154 int doNow = 1, done = 0; 01155 while ( 0 < (doNow=(checkEvery<nrObjects?checkEvery:nrObjects)) ) { 01156 int nPage = 0; 01157 if ( BdbcSuccess != cc.storeObjects(doNow, oid, nPage) ) { 01158 cerr << "storeObjects failed" << endl; 01159 } 01160 nrObjects -= doNow; 01161 done += doNow; 01162 cout << "Wrote " << doNow << " objects, total done = " << done 01163 << ", nPage = " << nPage << endl; 01164 if ( nPage >= oid.noPg ) { 01165 cout << "Container is full, asking for a new container" << endl; 01166 if ( BdbcSuccess != cc.getOneContainer(descr, oid) ) { 01167 cerr << "getOneContainer failed" << endl; 01168 return 2; 01169 } 01170 cout << "Got: [" << oid.db << "-" << oid.oc << "-" 01171 << oid.pg << "-" << oid.sl << "], noPg=" << oid.noPg << endl; 01172 } 01173 } 01174 01175 if ( BdbcSuccess != cc.returnAllContainers() ) { 01176 cerr << "returnAllContainers failed" << endl; 01177 return 3; 01178 } 01179 return 0; 01180 } else if ( 0 == strcmp(argv[2], "-returnConts") ) { 01181 if ( 8 != argc && 10 != argc ) { 01182 cout << "-returnConts: incorrect number of arguments" << endl; 01183 help(); 01184 return 2; 01185 } 01186 BdbClustSrvModule::GroupDescr descr; 01187 descr.clusterName = CORBA::string_dup(argv[3]); 01188 descr.sdName = CORBA::string_dup("evs"); 01189 descr.authLevel = argv[4][0]; 01190 descr.authName = CORBA::string_dup(argv[5]); 01191 descr.compName = CORBA::string_dup(argv[6]); 01192 descr.streamName = CORBA::string_dup(argv[7]); 01193 char* hostName = 0; 01194 int pid = 0; 01195 if ( 10 == argc ) { 01196 hostName = new char[strlen(argv[8])+1]; 01197 strcpy(hostName, argv[8]); 01198 pid = atoi(argv[9]); 01199 if ( 0 > pid ) { 01200 cerr << "Pid negative" << endl; 01201 return 3; 01202 } 01203 } 01204 if ( BdbcSuccess != cc.returnAllContainers(hostName, pid) ) { 01205 cerr << "return containers failed" << endl; 01206 return 4; 01207 } 01208 return 0; 01209 } else if ( 0 == strcmp(argv[2], "-loadSrv") ) { 01210 if ( 9 != argc ) { 01211 help(); 01212 return 2; 01213 } 01214 BdbClustSrvModule::GroupDescr descr; 01215 descr.clusterName = CORBA::string_dup(argv[3]); 01216 descr.sdName = CORBA::string_dup("evs"); 01217 descr.authLevel = argv[4][0]; 01218 descr.authName = CORBA::string_dup(argv[5]); 01219 descr.compName = CORBA::string_dup(argv[6]); 01220 descr.streamName = CORBA::string_dup(argv[7]); 01221 CORBA::Boolean randomize = 1; 01222 if ( argv[8][0] == '1' ) { 01223 randomize = 1; 01224 } 01225 01226 return BdbcSuccess != cc.loadSrv(descr, randomize); 01227 } else if ( 0 == strcmp(argv[2], "-test1") ) { 01228 if ( 4 != argc ) { 01229 cerr << "Expected more args" << endl; 01230 return 2; 01231 } 01232 int nr = atoi(argv[3]); 01233 if ( nr < 1 ) { 01234 cerr << "nr < 1 " << endl; 01235 return 3; 01236 } 01237 cc.test1(nr); 01238 return 0; 01239 } else if ( 0 == strcmp(argv[2], "-test2") ) { 01240 int nr = atoi(argv[3]); 01241 if ( nr < 1 ) { 01242 cerr << "nr < 1 " << endl; 01243 return 3; 01244 } 01245 cc.test2(nr); 01246 return 0; 01247 } else if ( 0 == strcmp(argv[2], "-waitUntilItIsReady") ) { 01248 CORBA::Boolean w = 0; 01249 if ( 4 != argc ) { 01250 cerr << "Expected more args" << endl; 01251 return 2; 01252 } 01253 if ( argv[3][0] == '1' ) { 01254 w = 1; 01255 } 01256 cc.waitUntilItIsReady(w); 01257 return 0; 01258 } 01259 01260 cout << "Unsupported: \"" << argv[2] << "\"" << endl; 01261 help(); 01262 return 2; 01263 } 01264 01265 01266 01267 void help() 01268 { 01269 cout << "Expected arguments:\n" 01270 << " <IOR> -automaticPrecr 1/0 [enable/disable]\n" 01271 << " <IOR> -closeActiveDbs <GRD> 1/0 [force] <dbid or 0 (all dbs)>\n" 01272 << " <IOR> -closeAllActiveDbs \n" 01273 << " <IOR> -deleteGroup <GRD>\n" 01274 << " <IOR> -getConts <GRD> nrConts sleepBetween[in sec] nrObjs [storedInCont]\n" 01275 " 1/0 [returnConts/no] 1/0 [set nPage/no]\n" 01276 << " <IOR> -initGroup <GRD> nr [dbs2Precr]\n" 01277 << " <IOR> -listDbs 1/0 [all/inUseNow]\n" 01278 << " <IOR> -listGroups 1/0 [all/inUseNow] 1/0 [withDbs/without]\n" 01279 << " <IOR> -ping\n" 01280 << " <IOR> -print 1/0 [allGroups/inUseNow]\n" 01281 << " <IOR> -printConts 1/0 [allGroups/inUseNow] whichConts\n" 01282 << " <IOR> -precrDbs <GRD> nr\n" 01283 << " <IOR> -recoverNow\n" 01284 << " <IOR> -resynchronize\n" 01285 << " <IOR> -returnConts <GRD> [hostName pid]\n" 01286 << " <IOR> -shutdown 1/0 [try2ReleaseConts/no] 1/0 [force/no]\n" 01287 << " <IOR> -shutdownGroup <GRD> 1/0 [try2Recover/no] 1/0 [force/no]\n" 01288 << " <IOR> -waitUntilItIsReady 1/0 [checkPrecr]\n" 01289 // << " <IOR> -loadSrv <GRD> 1/0 [=randomize/no]\n" 01290 // << " <IOR> -test1 #repetitions\n" 01291 // << " <IOR> -test2 #repetitions\n" 01292 // << " <IOR> -write <GRD> nrObjs checkeSizeEvery\n" 01293 << "\n" 01294 << " where: <IOR> - location of the IOR file\n" 01295 << " <GRD> - clusterName s/g/u authName compName streamName\n" 01296 << " force in closeActiveDbs - ignore fact that dbs are in use\n" 01297 << " whichCont:\n" 01298 << " 0x01 bit - turns on printing 'in use' containers\n" 01299 << " 0x02 bit - turns on printing 'locked' containers\n" 01300 << " 0x04 bit - turns on printing 'full' containers\n" 01301 << " 0x08 bit - turns on printing 'empty' containers\n" 01302 << " 0x10 bit - turns on printing 'partly filled' containers\n" 01303 << " example: 11 - will print in use, locked and empty, will not show full\n" 01304 << " 5 - will show in use and full\n" 01305 // << " loadSrv - in the loop:\n" 01306 // << " randomize: \n" 01307 // << " 1) ask for one cont\n" 01308 // << " 2) writes objects (between 0 and 8)\n" 01309 // << " 3) returns container\n" 01310 // << " 4) sleeps (between 0 and 3 sec)\n" 01311 // << " 5) stops when file /u/sf/becla/temp/stopCSLoad is touched\n" 01312 // << " do not randomize: \n" 01313 // << " 1) ask for one cont\n" 01314 // << " 2) writes one object\n" 01315 // << " 3) return container\n" 01316 // << " 4) stops when file /u/sf/becla/temp/stopCSLoad is touched\n" 01317 << endl; 01318 } 01319 01320 01321 01322
BaBar Public Site | SLAC | News | Links | Who's Who | Contact Us
Page Owner: Jacek Becla
Last Update: October 04, 2002