2011-12-20 7 views
6

estoy usando FindAndModify en MongoDB en varios procesos concurrentes. El tamaño de la colección es de aproximadamente 3 millones de entradas y todo funciona como una explosión, siempre que no pase una opción de clasificación (por un campo indexado). Una vez que trato de hacerlo, la siguiente advertencia se genera a los registros:MongoDB FindAndModify Clasificación

warning: ClientCursor::yield can't unlock b/c of recursive lock ns: test_db.wengine_queue top: 
{ 
opid: 424210, 
active: true, 
lockType: "write", 
waitingForLock: false, 
secs_running: 0, 
op: "query", 
ns: "test_db", 
query: { 
    findAndModify: "wengine_queue", 
    query: { 
      locked: { $ne: 1 }, 
      rule_completed: { $in: [ "", "0", null ] }, 
      execute_at: { $lt: 1324381363 }, 
      company_id: 23, 
      debug: 0, 
      system_id: "AK/AK1201" 
     }, 
    update: { 
      $set: { locked: 1 } 
     }, 
    sort: { 
      execute_at: -1 
     } 
}, 
client: "127.0.0.1:60873", 
desc: "conn", 
threadId: "0x1541bb000", 
connectionId: 1147, 
numYields: 0 
} 

tengo todas las claves de la consulta indexada, aquí están:

PRIMARY> db.wengine_queue.getIndexes() 
[ 
{ 
    "v" : 1, 
    "key" : { 
     "_id" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "_id_" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "system_id" : 1, 
     "company_id" : 1, 
     "locked" : 1, 
     "rule_completed" : 1, 
     "execute_at" : -1, 
     "debug" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "system_id_1_company_id_1_locked_1_rule_completed_1_execute_at_-1_debug_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "debug" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "debug_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "system_id" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "system_id_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "company_id" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "company_id_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "locked" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "locked_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "rule_completed" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "rule_completed_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "execute_at" : -1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "execute_at_-1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "thread_id" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "thread_id_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "rule_id" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "rule_id_1" 
} 
] 

¿Hay alguna forma de evitar ¿esta?

+0

Es solo una advertencia que dice que la actualización no puede ceder. ¿Hay algo que realmente deje de funcionar o simplemente te preocupa la advertencia? MongoDB/10gen tiene una opinión algo diferente de lo que debe y no debe ser una advertencia conectado por lo que terminan con un buen número de cosas que se registran como una advertencia de que probablemente no debería –

+0

No, todo funciona bien. Sin embargo, me preocupa la advertencia y las implicaciones que puede tener cuando mi configuración se lleva a producción (alrededor de 50 millones de documentos) – clops

+0

Es relativamente inocente. Voy a publicar una respuesta –

Respuesta

4

Para los interesados ​​- tuve que crear un índice separado que termina con la llave que el conjunto ha de ser ordenados por.

+1

La documentación de MongoDB dice ["la columna de clasificación debe ser la última columna utilizada en el índice"] (http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-1.Thesortcolumnmustbethelastcolumnusedintheindex.) –

+0

@AlexanderAzarov ya no parece decir esto. – bmargulies

+1

De hecho. Ahora dice ["Para consultas que incluyen una clasificación que usa un índice compuesto, asegúrese de que todos los campos antes del primer campo ordenado sean equivalentes a igualdad"] (http://docs.mongodb.org/manual/applications/indexes/#use -indexes-a-ordenar-consultar-resultados) –

1

Esa advertencia se produce cuando una operación que quiere dar (como las actualizaciones de largo, elimina, etc.) no pueden hacerlo porque no puede liberar el bloqueo se sostiene por cualquier razón.

¿Tiene usted el campo que está indexada en la clasificación? Si no agrega un índice para eso probablemente eliminará las advertencias.

+0

sí, el campo está indexado como se puede ver en el resultado de "getIndexes()" por encima – clops

+0

Ah lo siento. En ese caso, tendrás que vivir con la advertencia, creo. De nuevo, es solo el resultado de una larga actualización que quiere ceder pero no puede. Por cierto, hay uno o dos índices inútiles allí. Tenga en cuenta que el índice {a: 1, b: 1, c: 1} y {a: 1} no son útiles ya que el primero incluye el último. –

+0

¿Entonces sugieres que solo guarde el índice compuesto? ¿Qué pasa con otras operaciones que pueden usar solo "C" o "B" y "C"? – clops

Cuestiones relacionadas