test_objmgr_data_mt.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:12k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_objmgr_data_mt.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:47:15  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_objmgr_data_mt.cpp,v 1000.1 2004/06/01 19:47:15 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Authors:  Andrei Gourianov
  35. *
  36. * File Description:
  37. *   Object Manager test: multiple threads working with annotations
  38. *
  39. * ---------------------------------------------------------------------------
  40. * $Log: test_objmgr_data_mt.cpp,v $
  41. * Revision 1000.1  2004/06/01 19:47:15  gouriano
  42. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  43. *
  44. * Revision 1.3  2004/05/21 21:42:56  gorelenk
  45. * Added PCH ncbi_pch.hpp
  46. *
  47. * Revision 1.2  2004/02/17 21:13:20  vasilche
  48. * Added flags to skip some tests.
  49. *
  50. * Revision 1.1  2003/12/16 17:51:18  kuznets
  51. * Code reorganization
  52. *
  53. * Revision 1.14  2003/11/26 17:56:04  vasilche
  54. * Implemented ID2 split in ID1 cache.
  55. * Fixed loading of splitted annotations.
  56. *
  57. * Revision 1.13  2003/11/03 21:21:41  vasilche
  58. * Limit amount of exceptions to catch while testing.
  59. *
  60. * Revision 1.12  2003/10/22 17:58:10  vasilche
  61. * Do not catch CLoaderException::eNoConnection.
  62. *
  63. * Revision 1.11  2003/09/30 16:22:05  vasilche
  64. * Updated internal object manager classes to be able to load ID2 data.
  65. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  66. * Scope caches results of requests for data to data loaders.
  67. * Optimized CSeq_id_Handle for gis.
  68. * Optimized bioseq lookup in scope.
  69. * Reduced object allocations in annotation iterators.
  70. * CScope is allowed to be destroyed before other objects using this scope are
  71. * deleted (feature iterators, bioseq handles etc).
  72. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  73. * Added 'adaptive' option to objmgr_demo application.
  74. *
  75. * Revision 1.10  2003/06/02 16:06:39  dicuccio
  76. * Rearranged src/objects/ subtree.  This includes the following shifts:
  77. *     - src/objects/asn2asn --> arc/app/asn2asn
  78. *     - src/objects/testmedline --> src/objects/ncbimime/test
  79. *     - src/objects/objmgr --> src/objmgr
  80. *     - src/objects/util --> src/objmgr/util
  81. *     - src/objects/alnmgr --> src/objtools/alnmgr
  82. *     - src/objects/flat --> src/objtools/flat
  83. *     - src/objects/validator --> src/objtools/validator
  84. *     - src/objects/cddalignview --> src/objtools/cddalignview
  85. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  86. * replaces the three libmmdb? libs.
  87. *
  88. * Revision 1.9  2003/05/20 20:35:09  vasilche
  89. * Reduced number of threads to make test time reasonably small.
  90. *
  91. * Revision 1.8  2003/05/20 15:44:39  vasilche
  92. * Fixed interaction of CDataSource and CDataLoader in multithreaded app.
  93. * Fixed some warnings on WorkShop.
  94. * Added workaround for memory leak on WorkShop.
  95. *
  96. * Revision 1.7  2003/04/24 16:12:39  vasilche
  97. * Object manager internal structures are splitted more straightforward.
  98. * Removed excessive header dependencies.
  99. *
  100. * Revision 1.6  2003/04/15 14:23:11  vasilche
  101. * Added missing includes.
  102. *
  103. * Revision 1.5  2003/03/18 21:48:33  grichenk
  104. * Removed obsolete class CAnnot_CI
  105. *
  106. * Revision 1.4  2002/12/06 15:36:03  grichenk
  107. * Added overlap type for annot-iterators
  108. *
  109. * Revision 1.3  2002/07/22 22:49:05  kimelman
  110. * test fixes for confidential data retrieval
  111. *
  112. * Revision 1.2  2002/05/06 03:28:53  vakatov
  113. * OM/OM1 renaming
  114. *
  115. * Revision 1.1  2002/04/30 19:04:05  gouriano
  116. * multi-threaded data retrieval test
  117. *
  118. *
  119. * ===========================================================================
  120. */
  121. #include <ncbi_pch.hpp>
  122. #include <corelib/ncbithr.hpp>
  123. #include <corelib/test_mt.hpp>
  124. #include <connect/ncbi_util.h>
  125. #include <objects/seqloc/Seq_id.hpp>
  126. #include <objects/seqloc/Seq_loc.hpp>
  127. #include <objmgr/object_manager.hpp>
  128. #include <objmgr/objmgr_exception.hpp>
  129. #include <objmgr/scope.hpp>
  130. #include <objmgr/seq_vector.hpp>
  131. #include <objmgr/seqdesc_ci.hpp>
  132. #include <objmgr/feat_ci.hpp>
  133. #include <objmgr/align_ci.hpp>
  134. #include <objtools/data_loaders/genbank/gbloader.hpp>
  135. #include <connect/ncbi_core_cxx.hpp>
  136. #include <connect/ncbi_util.h>
  137. #include <test/test_assert.h>  /* This header must go last */
  138. BEGIN_NCBI_SCOPE
  139. using namespace objects;
  140. DEFINE_STATIC_FAST_MUTEX(s_GlobalLock);
  141. // GIs to process
  142. #if 0
  143.     const int g_gi_from = 156894;
  144.     const int g_gi_to   = 156896;
  145. #elif 0
  146.     const int g_gi_from = 156201;
  147.     const int g_gi_to   = 156203;
  148. #else
  149.     const int g_gi_from = 156000;
  150.     const int g_gi_to   = 157000;
  151. #endif
  152. /////////////////////////////////////////////////////////////////////////////
  153. //
  154. //  Test application
  155. //
  156. class CTestOM : public CThreadedApp
  157. {
  158. protected:
  159.     virtual bool Thread_Run(int idx);
  160.     virtual bool TestApp_Args( CArgDescriptions& args);
  161.     virtual bool TestApp_Init(void);
  162.     virtual bool TestApp_Exit(void);
  163.     typedef map<int, int> TValueMap;
  164.     CRef<CScope> m_Scope;
  165.     CRef<CObjectManager> m_ObjMgr;
  166.     TValueMap m_mapGiToDesc, m_mapGiToFeat0, m_mapGiToFeat1;
  167.     void SetValue(TValueMap& vm, int gi, int value);
  168.     int m_gi_from;
  169.     int m_gi_to;
  170.     bool m_load_only;
  171.     bool m_no_snp;
  172.     bool failed;
  173. };
  174. /////////////////////////////////////////////////////////////////////////////
  175. void CTestOM::SetValue(TValueMap& vm, int gi, int value)
  176. {
  177.     int old_value;
  178.     {{
  179.         CFastMutexGuard guard(s_GlobalLock);
  180.         old_value = vm.insert(TValueMap::value_type(gi, value)).first->second;
  181.     }}
  182.     if ( old_value != value ) {
  183.         string name;
  184.         if ( &vm == &m_mapGiToDesc ) name = "desc";
  185.         if ( &vm == &m_mapGiToFeat0 ) name = "feat0";
  186.         if ( &vm == &m_mapGiToFeat1 ) name = "feat1";
  187.         ERR_POST("Inconsistent "<<name<<" on gi "<<gi<<
  188.                  " was "<<old_value<<" now "<<value);
  189.     }
  190.     _ASSERT(old_value == value);
  191. }
  192. bool CTestOM::Thread_Run(int idx)
  193. {
  194. // initialize scope
  195.     CScope scope(*m_ObjMgr);
  196.     scope.AddDefaults();
  197.     int from, to, delta;
  198.     // make them go in opposite directions
  199.     if (idx % 2 == 0) {
  200.         from = m_gi_from;
  201.         to = m_gi_to;
  202.     } else {
  203.         from = m_gi_to;
  204.         to = m_gi_from;
  205.     }
  206.     delta = (to > from) ? 1 : -1;
  207.     bool ok = true;
  208.     const int kMaxErrorCount = 3;
  209.     static int error_count = 0;
  210.     for (int i = from;
  211.          ((delta > 0) && (i <= to)) || ((delta < 0) && (i >= to)); i += delta) {
  212.         try {
  213. // load sequence
  214.             CSeq_id sid;
  215.             sid.SetGi(i);
  216.             CBioseq_Handle handle = scope.GetBioseqHandle(sid);
  217.             if (!handle) {
  218.                 LOG_POST("T" << idx << ": gi = " << i << ": INVALID HANDLE");
  219.                 SetValue(m_mapGiToDesc, i, -1);
  220.                 continue;
  221.             }
  222.             if ( m_load_only ) {
  223.                 int count = 0;
  224. // enumerate descriptions
  225.                 // Seqdesc iterator
  226.                 for (CSeqdesc_CI desc_it(handle); desc_it;  ++desc_it) {
  227.                     count++;
  228.                 }
  229. // verify result
  230.                 SetValue(m_mapGiToDesc, i, count);
  231. // enumerate features
  232.                 CSeq_loc loc;
  233.                 loc.SetWhole(sid);
  234.                 SAnnotSelector sel(CSeqFeatData::e_not_set);
  235.                 if ( idx%2 == 0 ) {
  236.                     sel.SetOverlapType(sel.eOverlap_Intervals);
  237.                     sel.SetResolveMethod(sel.eResolve_All);
  238.                 }
  239.                 if ( m_no_snp ) {
  240.                     sel.ExcludedAnnotName("SNP");
  241.                 }
  242.                 count = 0;
  243.                 if ( idx%2 == 0 ) {
  244.                     for (CFeat_CI feat_it(scope, loc, sel); feat_it;  ++feat_it) {
  245.                         count++;
  246.                     }
  247. // verify resultila
  248.                     SetValue(m_mapGiToFeat0, i, count);
  249.                 }
  250.                 else {
  251.                     for (CFeat_CI feat_it(handle, 0, 0, sel); feat_it;  ++feat_it) {
  252.                         count++;
  253.                     }
  254. // verify result
  255.                     SetValue(m_mapGiToFeat1, i, count);
  256.                 }
  257.             }
  258.         }
  259.         catch (CLoaderException& e) {
  260.             LOG_POST("T" << idx << ": gi = " << i 
  261.                      << ": EXCEPTION = " << e.what());
  262.             ok = false;
  263.             if ( e.GetErrCode() == CLoaderException::eNoConnection ) {
  264.                 break;
  265.             }
  266.             if ( ++error_count > kMaxErrorCount ) {
  267.                 break;
  268.             }
  269.         }
  270.         catch (exception& e) {
  271.             LOG_POST("T" << idx << ": gi = " << i 
  272.                      << ": EXCEPTION = " << e.what());
  273.             ok = false;
  274.             if ( ++error_count > kMaxErrorCount ) {
  275.                 break;
  276.             }
  277.         }
  278.         scope.ResetHistory();
  279.     }
  280.     if ( !ok ) {
  281.         failed = true;
  282.     }
  283.     return ok;
  284. }
  285. bool CTestOM::TestApp_Args( CArgDescriptions& args)
  286. {
  287.     args.AddDefaultKey
  288.         ("fromgi", "FromGi",
  289.          "Process sequences in the interval FROM this Gi",
  290.          CArgDescriptions::eInteger, NStr::IntToString(g_gi_from));
  291.     args.AddDefaultKey
  292.         ("togi", "ToGi",
  293.          "Process sequences in the interval TO this Gi",
  294.          CArgDescriptions::eInteger, NStr::IntToString(g_gi_to));
  295.     args.AddFlag("load_only", "Do not work with sequences - only load them");
  296.     args.AddFlag("no_snp", "Exclude SNP features from processing");
  297.     return true;
  298. }
  299. bool CTestOM::TestApp_Init(void)
  300. {
  301.     failed = false;
  302.     CORE_SetLOCK(MT_LOCK_cxx2c());
  303.     CORE_SetLOG(LOG_cxx2c());
  304.     const CArgs& args = GetArgs();
  305.     m_gi_from = args["fromgi"].AsInteger();
  306.     m_gi_to   = args["togi"].AsInteger();
  307.     m_load_only = args["load_only"];
  308.     m_no_snp = args["no_snp"];
  309.     NcbiCout << "Testing ObjectManager (" << s_NumThreads
  310.         << " threads, gi from "
  311.         << m_gi_from << " to " << m_gi_to << ")..." << NcbiEndl;
  312.     m_ObjMgr = new CObjectManager;
  313.     m_ObjMgr->RegisterDataLoader(*new CGBDataLoader("ID"),CObjectManager::eDefault);
  314.     // Scope shared by all threads
  315. /*
  316.     m_Scope = new CScope(*m_ObjMgr);
  317.     m_Scope->AddDefaults();
  318. */
  319.     return true;
  320. }
  321. bool CTestOM::TestApp_Exit(void)
  322. {
  323.     if ( failed ) {
  324.         NcbiCout << " Failed" << NcbiEndl << NcbiEndl;
  325.     }
  326.     else {
  327.         NcbiCout << " Passed" << NcbiEndl << NcbiEndl;
  328.     }
  329. /*
  330.     map<int, int>::iterator it;
  331.     for (it = m_mapGiToDesc.begin(); it != m_mapGiToDesc.end(); ++it) {
  332.         LOG_POST(
  333.             "gi = "         << it->first
  334.             << ": desc = "  << it->second
  335.             << ", feat0 = " << m_mapGiToFeat0[it->first]
  336.             << ", feat1 = " << m_mapGiToFeat1[it->first]
  337.             );
  338.     }
  339. */
  340.     return true;
  341. }
  342. END_NCBI_SCOPE
  343. /////////////////////////////////////////////////////////////////////////////
  344. //  MAIN
  345. USING_NCBI_SCOPE;
  346. int main(int argc, const char* argv[])
  347. {
  348.     s_NumThreads = 12;
  349.     return CTestOM().AppMain(argc, argv, 0, eDS_Default, 0);
  350. }