Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mongo Ruby Driver Cursor not found error

Tags:

ruby

mongodb

I find documents from mongodb using ruby driver, collect them to array and iterate on them to update the same document as in the code below:

crawlarray = @@mongoclient[:crawlarray].find({searchresults:[]},:timeout => false).limit(500)
crawlarray.each do |elm|
    finalsearchstring = elm['searchstring'] 
    if elm["searchresults"].blank?
        ap "SEARCHING: #{finalsearchstring}"
        results = searchG(finalsearchstring) 
        elm["searchresults"] = results
        @@mongoclient[:crawlarray].update_one({"_id" => elm['_id']}, elm)
    else
        ap "ALREADY SEARCHED: #{finalsearchstring}"
    end
end

There are 90K records but as you see I just get 500 to not to get the error.Everytime, after about 150 iterations I get this error;

D, [2016-08-02T22:32:08.853065 #10098] DEBUG -- : MONGODB | 127.0.0.1:27017 | posluga-dev.getMore | FAILED | Cursor not found, cursor id: 463388278686 (43) | 0.008009s
/Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/operation/result.rb:256:in `validate!': Cursor not found, cursor id: 463388278686 (43) (Mongo::Error::OperationFailure)
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/operation/executable.rb:36:in `block in execute'
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/server/connection_pool.rb:107:in `with_connection'
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/server/context.rb:63:in `with_connection'
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/operation/executable.rb:34:in `execute'
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/cursor.rb:163:in `block in get_more'
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/retryable.rb:51:in `call'
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/retryable.rb:51:in `read_with_retry'
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/cursor.rb:162:in `get_more'
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/cursor.rb:88:in `each'
    from /Users/apple/.rvm/gems/ruby-2.2.1/gems/mongo-2.2.7/lib/mongo/collection/view/iterable.rb:44:in `each'

Can anybody help me to sort it out?

like image 800
Caner Avatar asked Aug 02 '16 20:08

Caner


1 Answers

Use 'no_cursor_timeout' option along with the find query while using Mongo Ruby Driver.

This will disable all cursor timeouts. By default MongoDB tries to kill all cursors which have been inactive for more than 10 mins. For more information, check this post.

like image 138
Vinu Joseph Avatar answered Oct 16 '22 18:10

Vinu Joseph