Subversion E000037: Não é possível obter o bloqueio exclusivo no arquivo 'db / txn-current-lock': Nenhum bloqueio disponível

0

Quando tento enviar uma alteração para um repositório do Subversion, e recebo mensagens de erro do formulário

svn: E000037: Commit failed (details follow):
svn: E000037: Can't get exclusive lock on file '/path/to/repo/db/txn-current-lock': No locks available
svn: E000037: Your commit message was left in a temporary file:
svn: E000037:    '/path/to/workdir/svn-commit.tmp'

Qual pode ser a causa?

    
por 200_success 20.04.2016 / 02:36

1 resposta

1

O código do Subversion termina tentando obter um bloqueio no arquivo txn-current-lock por meio de uma ligação para apr_file_lock() . Você deve conseguir reproduzir o erro com o seguinte teste:

#include <apr_general.h>
#include <apr_file_io.h>
#include <apr_pools.h>
#include <stdio.h>

int main(int argc, const char * const *argv, const char * const *env) {
    apr_file_t *f;
    apr_pool_t *pool;
    apr_status_t err;
    char errbuf[200];

    if (argc <= 1) {
        fprintf(stderr, "Error: Need to specify path to file to lock\n");
        return 1;
    }

    apr_app_initialize(&argc, &argv, &env);

    if (0 != (err = apr_pool_create(&pool, NULL))) {
        fprintf(stderr, "Failed to create APR pool\n");
        return 1;
    }

    if (0 != (err = apr_file_open(&f, argv[1], APR_FOPEN_CREATE | APR_FOPEN_WRITE, APR_UREAD | APR_UWRITE, pool))) {
        apr_strerror(err, errbuf, sizeof(errbuf));
        fprintf(stderr, "Open failed: %s\n", errbuf);
        return 1;
    }

    if (0 != (err = apr_file_lock(f, APR_FLOCK_EXCLUSIVE | APR_FLOCK_NONBLOCK))) {
        apr_strerror(err, errbuf, sizeof(errbuf));
        fprintf(stderr, "Lock failed: %s\n", errbuf);
        return 1;
    }

    if (0 != (err = apr_file_unlock(f))) {
        apr_strerror(err, errbuf, sizeof(errbuf));
        fprintf(stderr, "Unlock failed: %s\n", errbuf);
        return 1;
    }

    apr_pool_destroy(pool);
    apr_terminate();
    printf("OK\n");
    return 0;
}

Certifique-se de que o pacote apr-devel RPM ou libapr1-dev pacote Debian ou equivalente esteja instalado e, em seguida, crie e execute o teste usando

cc -o locktest locktest.c $(apr-1-config --includes --cflags --link-ld --libs)
./locktest /path/to/repo/db/txn-current-lock

... idealmente executando como o usuário do servidor web, se estiver usando um servidor Subversion.

Uma possível razão surpreendente para não obter um bloqueio é se o repositório reside em um sistema de arquivos montado usando o NFS, e o cliente NFS não pode gravar em /var/lib/nfs - talvez devido à partição /var estar cheia. / p>     

por 20.04.2016 / 02:36