Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-10656

Cursor hangs on compound index query

    • Type: Icon: Bug Bug
    • Resolution: Cannot Reproduce
    • Priority: Icon: Blocker - P1 Blocker - P1
    • None
    • Affects Version/s: 2.4.5
    • Component/s: Querying
    • None
    • Environment:
      osx ssd 8gb
    • OS X
    • Hide

      Database with 8M items.

      Collection has this basic structure.
      { xys: [ { xy:

      { x: 11111, y: 11111 }

      } ] }

      Index looks like this
      {
      "v" : 1,
      "key" :

      { "xys.xy.x" : 1, "xys.xy.y" : 1 }

      ,
      "ns" : "db.foos",
      "name" : "xys.xy.x_1_xys.xy.y_1"
      }

      Query looks like this:

      BasicDBObject query = new BasicDBObject("xys",
      new BasicDBObject("$elemMatch",
      new BasicDBObject("xy.x",new BasicDBObject("$gt",boundingBox.minX).append("$lt", boundingBox.maxX))
      .append("xy.y",new BasicDBObject("$gt",boundingBox.minY).append("$lt", boundingBox.maxY))
      )
      );

      Then just iterate over the results using the latest java driver.

      All the expected results come back but then the cursor remains open for ages.

      I have also attached the log showing the excessive yields after the final results.

      Show
      Database with 8M items. Collection has this basic structure. { xys: [ { xy: { x: 11111, y: 11111 } } ] } Index looks like this { "v" : 1, "key" : { "xys.xy.x" : 1, "xys.xy.y" : 1 } , "ns" : "db.foos", "name" : "xys.xy.x_1_xys.xy.y_1" } Query looks like this: BasicDBObject query = new BasicDBObject("xys", new BasicDBObject("$elemMatch", new BasicDBObject("xy.x",new BasicDBObject("$gt",boundingBox.minX).append("$lt", boundingBox.maxX)) .append("xy.y",new BasicDBObject("$gt",boundingBox.minY).append("$lt", boundingBox.maxY)) ) ); Then just iterate over the results using the latest java driver. All the expected results come back but then the cursor remains open for ages. I have also attached the log showing the excessive yields after the final results.

      I am doing a range query that uses a compound index. It covers about 1.7M results. In java I run the query and iterate over all the results. After the last result is read the cursor.hasNext() function hangs for over 8 minutes.

      If I look at the log when it finally returns it has yielded over 843,000 times.

      There is no other load on the server or the machine.

      What's going on here?

        1. mongo.log
          45 kB
          Matthew Cross

            Assignee:
            Unassigned Unassigned
            Reporter:
            mattx Matthew Cross
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated:
              Resolved: