2012-02-10 4 views
0

Ruby 1.9.2, Mongo 2.0.2에서 실행되는 Mongoid를 ODM으로 사용하는 Rails 3.1 앱이 있는데, 대부분 Mongoid를 우회하고 MongoDB Ruby 드라이버 만 사용해야합니다. 한 페이지로드에서 MapReduce 쿼리를 몇 번 실행하고 있습니다. 이 의지 쿼리 한 후, 반나절 같은 말 개발에 잠시 동안 수행 성능 페이지 새로 고침에서 [MongoDB MapReduce 쿼리가 무작위로 실패합니다.

(assertion: 'value has to be set'; 
assertionCode: '10210'; 
errmsg: 'db assertion failure'; 
ok: '0.0') 

실패합니다, 모든 몇 시간 동안 멋지고 계속 작동합니다. 실행에서 로그 (일부는 밖으로 손질과) ...

(R) MONGODB development['$cmd'].find({"mapreduce"=>"values", "map"=><BSON::Code:70098680478720 @data="function() { 
    var value = { a: 0, b: 0 }; 
    var count = { a: 0, b: 0 }; 
    var min = { a: 100, b: 100 }; 
    var max = { a: -100, b: -100 }; 

    if (this.c == "a" || this.c == "b") { 
    value[this.c] = parseInt(this.value); 
    count[this.c]++; 
    min[this.c] = parseInt(this.value); 
    max[this.c] = parseInt(this.value); 

    emit(this.item_id, 
     { 
     count: count, 
     values: value, 
     min: min, 
     max: max, 
     avg: { a: null, b: null } 
     } 
    ); 
    } 
}" @scope="{}">, "reduce"=><BSON::Code:70098680478680 @data="function(key, data) { 
    var newDatum = data.pop(); 

    data.forEach(function(item) { 
    newDatum.values.a += item.values.a; 
    newDatum.count.a += item.count.a; 
    if (item.min.a < newDatum.min.a) 
     newDatum.min.a = item.min.a; 
    if (item.max.a > newDatum.max.a) 
     newDatum.max.a = item.max.a; 
    // same for b 
    }); 

    newDatum.avg.a = newDatum.values.actual/newDatum.count.a; 
    newDatum.avg.b = newDatum.values.ideal/newDatum.count.b; 

    return newDatum; 
}" @scope="{}">, :out=>{:inline=>1}, :query=>{:about_id=>BSON::ObjectId('4f1d84de69c238941d000012'), :by_id=>{"$ne"=>BSON::ObjectId('4f1d84de69c238941d000012')}, :comp_id=>{"$in"=>[BSON::ObjectId('4f1d84de69c238941d000016'), BSON::ObjectId('4f1d84de69c238941d000019')]}}}).limit(-1) 

지금 같은 요청에 실패 하나 ...에 대한 쿼리 부분 (다시하지만이 훨씬 더 자주 실패합니다보다)

}" @scope="{}">, :out=>{:inline=>1}, :query=>{:about_id=>BSON::ObjectId('4f1d84de69c238941d000012'), :by_id=>BSON::ObjectId('4f1d84de69c238941d000012'), :comp_id=>BSON::ObjectId('4f1d84de69c238941d000019')}}).limit(-1) 
Completed 500 Internal Server Error in 516ms 

Mongo::OperationFailure (Database command 'mapreduce' failed: (assertion: 'value has to be set'; assertionCode: '10210'; errmsg: 'db assertion failure'; ok: '0.0').): 

아무 가치가있는 경우 Mongo가 homebrew를 통해 설치된 Mac OS X Lion에서 발생합니다.

$ mongod --version 
db version v2.0.2, pdfile version 4.5 
Wed Feb 8 16:33:11 git version: 514b122d308928517f5841888ceaa4246a7f18e3 

그리고이 이벤트 중 로그 파일에서 볼 수있는 내용은 다음과 같습니다. 미스터 씨에 관한 한 줄은 사건과 일치하는 것 같습니다.

Wed Feb 8 15:08:36 [clientcursormon] mem (MB) res:15 virt:2630 mapped:80 
Wed Feb 8 15:11:37 [clientcursormon] mem (MB) res:17 virt:2630 mapped:80 
Wed Feb 8 15:16:37 [clientcursormon] mem (MB) res:17 virt:2630 mapped:80 
Wed Feb 8 15:21:37 [clientcursormon] mem (MB) res:17 virt:2630 mapped:80 
Wed Feb 8 15:26:37 [clientcursormon] mem (MB) res:17 virt:2630 mapped:80 
Wed Feb 8 15:31:37 [clientcursormon] mem (MB) res:17 virt:2630 mapped:80 
Wed Feb 8 15:32:55 [conn3] mr failed, removing collection :: caused 
by :: 10210 value has to be set 
Wed Feb 8 15:36:37 [clientcursormon] mem (MB) res:18 virt:2630 mapped:80 
Wed Feb 8 15:39:26 [initandlisten] connection accepted from 127.0.0.1:57001 #4 

내 질문은 무엇이 문제를 추적하는 데 도움이 될까요? 나는 우리가 몽고를 사용함에있어서 어떤 추가적인 이슈도 발견하지 못했다. 나는 이것을 파헤 치고 어떻게되는지 알아낼 방법이 없다.

답변

0

그래서 JavaScript 자체가 db에 저장되어있는 것으로 보입니다. db.system.js.find()value없이 항목을 나열했습니다. mongodb 메일 목록의 게시물에서 js를 제거하면 오류를 수정하는 것처럼 보였습니다. 바라건대 다른 사람이이 문제에 빠지면 system.js을 확인하는 법을 배우게됩니다.

관련 문제