Subversion E000037: 'db/txn-current-lock' 파일에 대한 배타적 잠금을 얻을 수 없습니다. 사용 가능한 잠금이 없습니다.

Subversion E000037: 'db/txn-current-lock' 파일에 대한 배타적 잠금을 얻을 수 없습니다. 사용 가능한 잠금이 없습니다.

Subversion 저장소에 변경 사항을 커밋하려고 하면 다음 형식의 오류 메시지가 나타납니다.

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'

이유는 무엇입니까?

답변1

Subversion 코드의 끝잠금을 획득해 보세요txn-current-lock이 파일을 호출하면apr_file_lock(). 다음 테스트를 통해 오류를 재현할 수 있습니다.

#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;
}

apr-develRPM 패키지, Debian 패키지 또는 이에 상응하는 패키지가 설치되어 있는지 확인한 libapr1-dev후 다음 명령을 사용하여 테스트를 빌드하고 실행하세요.

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

...Subversion 서버를 사용하는 경우 웹 서버 사용자로 실행하는 것이 가장 좋습니다.


잠금을 얻을 수 없는 놀라운 이유는 리포지토리가 NFS를 사용하여 마운트된 파일 시스템에 있고 NFS 클라이언트가 쓸 수 없는 경우입니다 /var/lib/nfs(아마도 /var파티션이 가득 차서).

관련 정보