es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo iniciar la fusión de LVM en segundo plano utilizando blockdev en C.

Estoy tratando de iniciar una fusión de una instantánea LVM utilizando la API blockdev en C, similar al comando del sistema “lvconvert –merge -b vg/lvsnap”.

El problema es que la fusión se inicia, pero no se ejecuta en segundo plano. El código espera a que se complete la fusión antes de poder continuar.

No estoy seguro de qué estoy haciendo mal, ¿o si hay otra manera de resolver esto?

    BDExtraArg          lv_arg = {"--background",""};
    const BDExtraArg    *extra_args[2] = {&lv_arg, NULL};
    g_autoptr(GError)   error = NULL;

    bd_switch_init_checks (FALSE, &error);
    bd_ensure_init (plugins, NULL, &error);
    bd_lvm_lvsnapshotmerge(vg_name, lv_snap, extra_args, &error);

¿Debo iniciarlo como un hilo en segundo plano en su lugar?

Atentamente,
Tomás

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema con la fusión de no ejecutarse en segundo plano se debe a que el código espera a que se complete la fusión antes de continuar. Una posible solución podría ser iniciar la fusión como un hilo en segundo plano, lo cual permitiría que el código siga ejecutándose mientras la fusión aún está en progreso.

    Una forma de lograr esto es usar la biblioteca pthread para crear un nuevo hilo que ejecute el comando de fusión en segundo plano. De esta manera, el hilo principal puede seguir ejecutándose mientras se realiza la fusión en segundo plano.

    Aquí tienes un ejemplo de fragmento de código que muestra cómo iniciar un nuevo hilo para ejecutar el comando de fusión:

    #include <pthread.h>
    
    void *merge_thread(void *arg) {
        BDExtraArg lv_arg = {"--background", ""};
        const BDExtraArg *extra_args[2] = {&lv_arg, NULL};
        g_autoptr(GError) error = NULL;
    
        bd_switch_init_checks(FALSE, &error);
        bd_ensure_init(plugins, NULL, &error);
        bd_lvm_lvsnapshotmerge(vg_name, lv_snap, extra_args, &error);
    
        return NULL;
    }
    
    int main() {
        // crear un nuevo hilo para ejecutar el comando de fusión
        pthread_t thread;
        pthread_create(&thread, NULL, merge_thread, NULL);
    
        // continuar ejecutando otro código mientras la fusión se está ejecutando en segundo plano
        // ...
    
        // esperar a que el hilo de fusión termine
        pthread_join(thread, NULL);
    
        return 0;
    }
    

    En este ejemplo, creamos un nuevo hilo utilizando pthread_create, pasando la función merge_thread como punto de entrada del hilo. La función merge_thread luego ejecuta el comando de fusión en segundo plano utilizando la API blockdev.

    Mientras tanto, el hilo principal continúa ejecutando otro código mientras la fusión se está ejecutando en segundo plano. Una vez que el hilo de fusión completa, esperamos a que termine usando pthread_join.

    Esto te permitirá iniciar la fusión en segundo plano y continuar ejecutando otro código mientras aún está en progreso.</pthread.h>

Comments are closed.