Changeset 335

Show
Ignore:
Timestamp:
03/15/08 03:04:12 (8 months ago)
Author:
jake
Message:

Another big issue related to not closing the readers explicitly. the sorting struct was being cached

Location:
trunk
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • trunk/thrudex/src/CLuceneIndex.cpp

    r327 r335  
    3535}; 
    3636 
     37//Used to clean up 
     38struct reader_deleter 
     39{ 
     40    void operator()(void const *o) const { 
     41        IndexReader *r = (IndexReader *)o; 
     42 
     43        r->close(); 
     44        delete r; 
     45    } 
     46}; 
     47 
    3748CLuceneIndex::CLuceneIndex(const string &index_root, const string &index_name, shared_ptr<Analyzer> analyzer) 
    3849    : index_root(index_root), index_name(index_name), analyzer(analyzer), filter_space(10000000), last_synched(0), syncing(false) 
     
    7586        //build up bloom filter 
    7687        disk_bloom    = shared_ptr<bloom_filter>(new bloom_filter(filter_space,1.0/(1.0 * filter_space), random_seed)); 
    77         disk_reader   = shared_ptr<IndexReader>(IndexReader::open(idx_path.c_str())); 
     88        disk_reader   = shared_ptr<IndexReader>(IndexReader::open(idx_path.c_str()), reader_deleter() ); 
    7889        disk_filter   = shared_ptr<UpdateFilter>(new UpdateFilter(disk_reader)); 
    7990 
     
    211222    shared_ptr<set<string> >  l_disk_deletes = disk_deletes; 
    212223    shared_ptr<UpdateFilter>  l_disk_filter  = disk_filter; 
     224    shared_ptr<IndexReader>   l_disk_reader  = disk_reader; 
    213225 
    214226    wstring wkey = build_wstring(key); 
     
    249261    shared_ptr<set<string> >  l_disk_deletes = disk_deletes; 
    250262    shared_ptr<UpdateFilter>  l_disk_filter  = disk_filter; 
     263    shared_ptr<IndexReader>   l_disk_reader  = disk_reader; 
    251264 
    252265    wstring wkey = build_wstring(key); 
     
    255268    //We'll simply track the docs to remove on next merge 
    256269    if( l_disk_bloom->contains( key )){ 
    257         LOG4CXX_DEBUG(logger, "Removed "+key); 
     270        LOG4CXX_DEBUG(logger, "Removed disk"+key); 
    258271        l_disk_deletes->insert( key ); 
    259272 
     
    267280    if(l_ram_bloom->contains( key )){ 
    268281 
     282        LOG4CXX_DEBUG(logger, "Removed ram"+key); 
     283 
    269284        Term      *t = new Term(DOC_KEY, wkey.c_str() ); 
    270285 
     
    276291        delete t; 
    277292    } 
     293 
    278294} 
    279295 
     
    298314    shared_ptr<IndexSearcher>       l_disk_searcher; 
    299315    shared_ptr<UpdateFilter>        l_disk_filter; 
     316    shared_ptr<IndexReader>         l_disk_reader; 
    300317    shared_ptr<MultiSearcher>       l_searcher; 
    301318    //RWGuard g(mutex); 
     
    315332 
    316333        l_disk_filter = disk_filter; 
     334        l_disk_reader = disk_reader; 
    317335 
    318336    } 
     
    464482        //RWGuard g(mutex); 
    465483        Guard g(mutex); 
    466         if(last_modified <= last_synched) 
     484        if(last_modified <= last_synched && disk_deletes->empty()) 
    467485            return; 
    468486    } 
     
    510528    LOG4CXX_DEBUG(logger,"Created Handles"); 
    511529 
    512     //Now we start by deleting any updated docs from disk 
    513  
    514     shared_ptr<IndexReader> disk_reader(IndexReader::open(idx_path.c_str())); 
    515  
    516     set<string>::iterator it; 
    517     for( it=l_disk_deletes->begin(); it!=l_disk_deletes->end(); ++it){ 
    518  
    519         wstring wkey = build_wstring(*it); 
    520         Term      *t = new Term(DOC_KEY, wkey.c_str() ); 
    521  
    522         disk_reader->deleteDocuments(t); 
    523  
    524         LOG4CXX_DEBUG(logger,"Deleted"+(*it)); 
    525  
    526         delete t; 
    527     } 
    528  
    529     disk_reader->close(); 
    530  
    531     LOG4CXX_DEBUG(logger,"Deleted old ids"); 
     530    { 
     531        //Now we start by deleting any updated docs from disk 
     532        shared_ptr<IndexReader> tmp_disk_reader(IndexReader::open(idx_path.c_str())); 
     533 
     534        int i=0; 
     535        set<string>::iterator it; 
     536        for( it=l_disk_deletes->begin(); it!=l_disk_deletes->end(); ++it){ 
     537 
     538            wstring wkey = build_wstring(*it); 
     539            Term      *t = new Term(DOC_KEY, wkey.c_str() ); 
     540 
     541            tmp_disk_reader->deleteDocuments(t); 
     542 
     543            LOG4CXX_DEBUG(logger,"Deleted"+(*it)); 
     544 
     545            delete t; 
     546            i++; 
     547        } 
     548 
     549        tmp_disk_reader->close(); 
     550 
     551        LOG4CXX_DEBUG(logger,"Deleted old ids"); 
     552    } 
     553 
    532554 
    533555    { 
     
    552574 
    553575    //Search new index (big perf hit so get it over now) 
    554     shared_ptr<IndexReader>   l_disk_reader(IndexReader::open(idx_path.c_str())); 
    555     shared_ptr<IndexSearcher> l_disk_searcher(new IndexSearcher(l_disk_reader.get())); 
    556     shared_ptr<UpdateFilter>  l_disk_filter(new UpdateFilter(l_disk_reader)); 
     576    shared_ptr<IndexReader>   l_disk_reader( IndexReader::open(idx_path.c_str()), reader_deleter() ); 
     577    shared_ptr<IndexSearcher> l_disk_searcher( new IndexSearcher(l_disk_reader.get()) ); 
    557578 
    558579 
     
    560581 
    561582    Query *query = QueryParser::parse( q.c_str(),DOC_KEY,analyzer.get()); 
    562     Hits *h = l_disk_searcher->search(query); 
     583    Hits  *h    = l_disk_searcher->search(query); 
    563584    _CLDELETE(h); 
    564585    _CLDELETE(query); 
     
    571592        Guard g(mutex); 
    572593 
     594        //the order of these things really matters 
     595        disk_searcher = l_disk_searcher; 
     596        disk_reader   = l_disk_reader; 
     597        disk_filter.reset( new UpdateFilter(disk_reader) ); 
     598 
     599 
    573600        //Add any new deletes to the filter 
    574601        set<string>::iterator it; 
    575602        for( it=disk_deletes->begin(); it!=disk_deletes->end(); ++it){ 
    576603            wstring wkey = build_wstring(*it); 
    577             l_disk_filter->skip(wkey); 
     604 
     605            LOG4CXX_DEBUG(logger,"Skipping sync:"+*it); 
     606            disk_filter->skip(wkey); 
    578607        } 
    579608 
    580         disk_reader   = l_disk_reader; 
    581         disk_filter   = l_disk_filter; 
    582         disk_searcher = l_disk_searcher; 
    583  
    584609 
    585610        last_synched = Util::currentTime(); 
    586611 
    587612        syncing = false; //this flag alters the search code to include prev searcher 
    588     } 
    589  
    590  
     613 
     614    } 
    591615 
    592616    LOG4CXX_DEBUG(logger,"Set new search"); 
    593  
    594 } 
     617} 
  • trunk/thrudex/src/CLuceneIndex.h

    r327 r335  
    7474 
    7575    boost::shared_ptr<lucene::index::IndexModifier>  modifier; 
    76     int64_t                                          last_modified; 
     76    volatile int64_t                                 last_modified; 
    7777 
    7878    boost::shared_ptr<lucene::search::MultiSearcher> searcher; 
     
    8080 
    8181    int64_t                                          last_synched; 
    82     bool                                             syncing; 
     82    volatile bool                                    syncing; 
    8383 
    8484    boost::shared_ptr<lucene::index::IndexReader>    disk_reader; 
  • trunk/thrudex/src/UpdateFilter.cpp

    r299 r335  
    4242void UpdateFilter::skip( wstring key ) 
    4343{ 
    44     Term              *t = new Term(DOC_KEY, key.c_str() ); 
    45     TermEnum *enumerator = reader->terms(t); 
     44 
     45    TermEnum *enumerator; 
     46    Term              *t; 
     47    try{ 
     48    t = new Term(DOC_KEY, key.c_str() ); 
     49    enumerator = reader->terms(t); 
    4650    if (enumerator->term(false) == NULL){ 
    4751        _CLDELETE(enumerator); 
    4852        delete t; 
    4953        return; 
     54    } 
     55    }catch(CLuceneError e){ 
     56        cerr<<"!!!Caught Fatal CLucene Exception: "<<e.what()<<endl; 
    5057    } 
    5158 
  • trunk/tutorial/perl/BookmarkExample.pl

    r271 r335  
    9999 
    100100       $transport->open(); 
     101 
     102        $self->{thrudoc}->admin("create_bucket", THRUDOC_BUCKET()); 
    101103    }; if($@) { 
    102104        die $@->{message} if UNIVERSAL::isa($@,"Thrift::TException"); 
     
    242244    #chunks of 100 
    243245    my $limit  = 100; 
     246    my $i = 0; 
    244247    my $r; 
    245248    my $seed; 
     
    267270        $seed = $r->{seed}; 
    268271 
     272        $i += @{$r->elements}; 
     273 
    269274    }while(@{$r->elements} == $limit); 
    270275 
     
    272277    my $t1 = gettimeofday(); 
    273278 
    274     print "\n*Index cleared in: ".($t1-$t0)."*\n"; 
     279    print "\n*Index cleared($i) in: ".($t1-$t0)."*\n"; 
    275280 
    276281} 
     
    322327            }else{ 
    323328 
    324                 warn($r->ex->what); 
     329                warn($r->{ex}->{what}); 
    325330            } 
    326331 
     
    375380 
    376381my ($t0,$t1); 
     382 
     383 
    377384eval{ 
    378385 
     
    386393 
    387394};if($@){ 
     395 
     396    warn(Dumper($@)); 
    388397    die $@->{message} if UNIVERSAL::isa($@,"Thrift::TException"); 
    389398    die $@; 
    390399} 
     400