Запрос MongoDB MapReduce случайно завершается неудачей - PullRequest
0 голосов
/ 10 февраля 2012

У меня есть приложение Rails 3.1, работающее на Ruby 1.9.2, Mongo 2.0.2, использующее Mongoid в качестве ODM, однако это должно быть в обход большей части Mongoid и просто использовать драйвер Ruby 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').):

Если это имеет какое-либо значение, это происходит в Mac OS X Lion с Mongo, установленным через homebrew.

$ 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

Итак, мой вопрос: что я могу сделать, чтобы отследить это? Я не замечаю каких-либо дополнительных проблем с нашим использованием Mongo. Я не уверен, как копаться в этом и выяснить, что происходит.

1 Ответ

0 голосов
/ 13 февраля 2012

Таким образом, похоже, что проблема была в том, что JavaScript был сохранен в самой базе данных. db.system.js.find() перечислил запись без value. Согласно сообщению в списке рассылки mongodb, удаление этой ошибки, похоже, исправило ошибку. Надеюсь, если кто-то еще столкнется с этим, они научатся проверять system.js.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...