Blogia
Blog de Ibercivis

¿Quién está incrementado el min_quorum?

Un usuario (gracias Fernando) nos indica que tiene ciertos problemas con workunits de materiales64 que tienen min_quorum= 2. ¿Cómo es esto posible si al crear las workunits de materiales64 decimos que explícitamente tengan min_quorum=1?.

Miro la base de datos, y...efectivamente, hay workunits de materiales64 con min_quorum=2.

Para entender bien este problema, es importante saber de la existencia de estas dos tablas en la base de datos:

  • app: Guarda la información de cada una de las aplicaciones de ibercivis, en el caso de materiales64 el campo target_nresults=2.
  • workunit: Guarda la información de cada una de las workuntits creadas, en el caso de materiales64, las workuntis se crean con target_nresults=1 y min_quorum=1.

Bueno, la solución está aquí, en este trozo de sched_send.cpp:

....

if (wu.target_nresults == 1 && app->target_nresults > 1) {
        if (g_wreq->trust) {
            if (config.debug_send) {
                log_messages.printf(MSG_NORMAL,
                    "[send] [WU#%d] sending to trusted host, not replicatingn", wu.id
                );
            }
        } else {
            DB_WORKUNIT dbwu;
            char buf[256];
            sprintf(buf,
                "target_nresults=%d, min_quorum=%d, transition_time=%ld",
                app->target_nresults, app->target_nresults, time(0)
            );
            dbwu.id = wu.id;
            if (config.debug_send) {
                log_messages.printf(MSG_NORMAL,
                    "[send] [WU#%d] sending to untrusted host, replicatingn", wu.id
                );
            }
            retval = dbwu.update_field(buf);
            if (retval) {
                log_messages.printf(MSG_CRITICAL,
                    "WU update failed: %d", retval
                );
            }
        }
    }

.....

es decir, si la workunit tiene target_nresults=1 y app tiene target_nresults>1 (el caso de materiales64), si el host no es trust (ha alcanzado cierta tasa de errores), al mandar el scheduler el result correspondiente a la workunit se hace un update en la tabla workunit, poniendo a target_nresults y a min_quorum el valor de target_nresults de la tabla app, misterio resuelto.

 

 

 

0 comentarios