nGrinder 스크립트 메뉴 접속 시 SqlJetException: CANTOPEN 에러 해결
📌 서론
지난번 글에 이어서 새로운 부하 테스트를 진행하려고 nGrinder를 실행했다. 실행은 잘 되는데 스크립트 메뉴로 이동할 때 다음과 같은 에러가 뜨면서 스크립트 화면으로 이동을 못하는 이슈가 생겼다. 이 해결 과정을 같이 살펴보자
에러 발생 상황
이전에 nGrinder를 실행하는 명령어는 다음과 같다.
java -Djava.io.tmpdir=/Users/yijun/study/recipia/resource/ngrinder/lib -jar ngrinder-controller-3.5.8.war --port=8300
이 명령어로 nGrinder를 실행하면 페이지 접속까지 잘 된다. 근데 접속 화면에서 [스크립트] 메뉴를 클릭하면 다음과 같은 에러가 발생했다.
2024-02-15 13:50:21,426 INFO DefaultSVNDebugLogger.java:47 : FSFS: CANTOPEN org.tmatesoft.sqljet.core.SqlJetException: CANTOPEN at org.tmatesoft.sqljet.core.internal.fs.SqlJetFileSystem.open(SqlJetFileSystem.java:158) at org.tmatesoft.sqljet.core.internal.fs.SqlJetFileSystem.open(SqlJetFileSystem.java:185) at org.tmatesoft.sqljet.core.internal.pager.SqlJetPager.open(SqlJetPager.java:395) at org.tmatesoft.sqljet.core.internal.btree.SqlJetBtree.open(SqlJetBtree.java:325) at org.tmatesoft.sqljet.core.table.engine.SqlJetEngine.open(SqlJetEngine.java:195) at org.tmatesoft.sqljet.core.table.SqlJetDb.open(SqlJetDb.java:127) at org.tmatesoft.svn.core.internal.io.fs.repcache.FSRepresentationCacheManager.openRepresentationCache(FSRepresentationCacheManager.java:57) at org.tmatesoft.svn.core.internal.io.fs.repcache.FSRepresentationCacheManagerFactory.openRepresentationCache(FSRepresentationCacheManagerFactory.java:41) at org.tmatesoft.svn.core.internal.io.fs.FSRepresentationCacheUtil.open(FSRepresentationCacheUtil.java:69) at org.tmatesoft.svn.core.internal.io.fs.FSFS.openDB(FSFS.java:280) at org.tmatesoft.svn.core.internal.io.fs.FSFS.open(FSFS.java:202) at org.tmatesoft.svn.core.internal.io.fs.FSRepository.openRepositoryRoot(FSRepository.java:825) at org.tmatesoft.svn.core.internal.io.fs.FSRepository.openRepository(FSRepository.java:792) at org.tmatesoft.svn.core.internal.io.fs.FSRepository.getLatestRevision(FSRepository.java:121) at org.tmatesoft.svn.core.internal.wc2.ng.SvnNgRepositoryAccess.getRevisionNumber(SvnNgRepositoryAccess.java:118) at org.tmatesoft.svn.core.internal.wc2.SvnRepositoryAccess.getLocations(SvnRepositoryAccess.java:182) at org.tmatesoft.svn.core.internal.wc2.ng.SvnNgRepositoryAccess.createRepositoryFor(SvnNgRepositoryAccess.java:45) at org.tmatesoft.svn.core.internal.wc2.remote.SvnRemoteList.run(SvnRemoteList.java:32) at
에러 코드 분석
이 에러 메시지는 nGrinder에서 스크립트 메뉴를 클릭했을 때 SVN(Subversion) 저장소와 관련된 파일 시스템을 열려고 시도하면서 발생한 것으로 보인다. SqlJetException: CANTOPEN 예외는 SVN 내부에서 사용하는 SQLite 데이터베이스 파일을 열려고 할 때 해당 파일에 접근할 수 없거나, 파일을 열 수 없는 상태임을 나타낸다.
해결 시도 1 - 권한 조정
권한 확인
일단 SVN 저장소의 권한을 확인해보려고 했다. 그런데 이 SVN 저장소의 경로가 대체 어디있는지 몰랐다.
그래서 일단 tmpdir 경로인 lib 폴더의 권한을 확인해봤다.
다음 명령어는 해당 경로의 권한을 확인하는 명령어다
ls -l /Users/yijun/study/recipia/resource/ngrinder
ngrinder 디렉토리의 권한은 다음과 같다.
total 484808
drwxr-xr-x 5 yijun staff 160 2 15 14:00 lib
drwxr-xr-x@ 10 yijun staff 320 2 15 13:58 ngrinder-agent
-rw-r--r--@ 1 yijun staff 79728640 2 15 13:57 ngrinder-agent-3.5.8-127.0.0.1.tar
-rw-r--r--@ 1 yijun staff 153959996 2 15 13:53 ngrinder-controller-3.5.8.war
그리고 혹시 몰라 lib 폴더 내부의 권한은 다음과 같았다.
total 0
drwxr-xr-x 184 yijun staff 5888 2 15 13:56 ngrinder-controller-3.5.8.war-spring-boot-libs-7b29f720-2e44-430f-9c66-d50436d25abd
drwxr-xr-x 3 yijun staff 96 2 15 13:56 tomcat.16705667690695340230.8300
이것만 봐선 lib 디렉토리 내부의 현재 설정에서는 yijun 사용자만이 쓰기 권한을 가지고 있다.
이 권한을 모든 사용자가 쓰기 권한이 있도록 수정해 줬다.
권한 조정
lib 디렉토리에 모든 사용자가 쓰기 권한을 부여하려면, 터미널에서 chmod 명령어를 사용하여 디렉토리의 권한을 변경할 수 있다. 아래의 명령어는 lib 디렉토리와 그 안에 있는 모든 파일 및 하위 디렉토리에 대해 읽기, 쓰기, 실행 권한을 모든 사용자에게 부여한다.
chmod -R 777 /Users/yijun/study/recipia/resource/ngrinder/lib
🌟 중요
이 명령어를 사용할 때 주의해야 할 점은, 777 권한 설정은 보안상의 이유로 권장되지 않는다는 것이다. 모든 사용자가 파일을 수정하거나 삭제할 수 있게 되므로, 신중하게 사용해야 한다. 특히, 공유되거나 중요한 데이터를 다루는 시스템에서는 더욱 주의해야 한다.
이렇게 권한을 부여해 줘도 스크립트 메뉴로 이동하면 에러가 발생했다.
해결 시도 2 - 폴더 이동, 환경 변수 추가
첫 번째 시도에도 해결이 안 돼서 두 번째 방법을 시도해 봤다.
아예 tmpdir로 사용할 lib 폴더를 war 파일과 다른 경로로 이동시켰다. 물론 lib 폴더와 was 파일이 같은 경로에 있어서 발생한 에러는 아니지만 그래도 혹시 몰라 그냥 이동시켰다.
그리고 war 파일을 실행하는 명령어도 tmpdir 경로를 환경 변수로 주입하는 방식으로 수정했다.
macOS에서 NGRINDER_HOME 환경 변수 추가
먼저 zshrc 파일에 환경변수를 추가해 줬다.
1. 아래 명령어로 zshrc 파일을 열어준다.
vi ~/.zshrc
2. zshrc 파일에 NGRINDER_HOME 환경 변수를 추가하고 저장해 준다.
export NGRINDER_HOME=/Users/yijun/ngrinder
3. 그리고 zshrc를 리로드 시켜줬다.
source ~/.zshrc
4. 제대로 리로드 됐는지 확인하는 명령어는 다음과 같다.
echo $NGRINDER_HOME
출력문을 보면 환경변수가 잘 적용된 모습을 확인할 수 있다.
nGrinder 실행
nGrinder를 실행하는 명령문에 방금 적용한 환경 변수를 사용해 보자.
java -Djava.io.tmpdir=${NGRINDER_HOME}/lib -jar ngrinder-controller-3.5.8.war --port=8300
이렇게 실행해도 맨 처음에 났던 에러가 계속 똑같이 발생했다...
에러 로그를 분석하면 두 가지를 추론할 수 있다.
SQLJet 관련 에러
CANTOPEN 에러는 SQLJet 라이브러리가 파일 또는 데이터베이스를 열 수 없을 때 발생한다. SVN 저장소를 초기화하거나 접근하는 과정에서 발생한 것으로 보이며, 파일 시스템 권한 문제나 경로 문제일 수 있다.
Subversion (SVN) 관련 에러
Unable to open an ra_local session to URL, Permission denied 등의 에러는 nGrinder가 내부적으로 사용하는 SVN 저장소에 접근할 수 없거나, 필요한 파일을 생성할 권한이 없음을 나타낸다. 주로 파일 시스템 권한 설정 문제로 발생한다.
해결 시도 3 - 디렉토리 소유권과 권한 조정
디렉토리 소유권, 권한 조정
일단 /Users/yijun/ngrinder/repos 디렉토리랑 하위 디렉토리 파일의 소유권과 권한을 조정해 주자.
nGrinder를 실행하는 사용자가 이 경로에 파일을 생성하고 수정할 수 있는 권한을 가져야 하기 때문에 아래 명령어로 권한을 수정해 준다.
sudo chown -R yijun:staff /Users/yijun/ngrinder/repos
sudo chmod -R 755 /Users/yijun/ngrinder/repos
첫 번째 명령어 - sudo chown -R yijun:staff /Users/yijun/ngrinder/repos
- sudo: 슈퍼유저 권한으로 명령을 실행한다는 의미이다. 파일 시스템의 소유권을 변경하는 등의 작업은 일반 사용자 권한으로는 수행할 수 없기 때문에, 슈퍼유저 권한이 필요하다.
- chown: 'change owner'의 약자로, 파일이나 디렉토리의 소유자를 변경하는 명령어이다.
- -R: 'recursive'의 약자로, 지정된 디렉토리와 그 하위 모든 파일 및 디렉토리에 대해 명령을 재귀적으로 적용한다는 의미이다.
- <사용자명>:staff: yijun은 새로운 소유자(사용자) 이름이고, staff는 새로운 소유자 그룹을 의미한다. 이는 /Users/yijun/ngrinder/repos 디렉토리와 그 하위 모든 파일 및 디렉토리의 소유자를 사용자 yijun과 그룹 staff로 변경하라는 명령이다.
두 번째 명령어 - sudo chmod -R 755 /Users/yijun/ngrinder/repos
- chmod: 'change mode'의 약자로, 파일이나 디렉토리의 접근 권한을 변경하는 명령어이다.
- 755: 이는 권한 설정을 숫자로 표현한 것이다. 여기서 7은 소유자에게 읽기, 쓰기, 실행 권한을 모두 부여한다는 의미이고, 첫 번째 5는 그룹에게 읽기와 실행 권한을 부여한다는 의미, 두 번째 5는 다른 모든 사용자에게 읽기와 실행 권한을 부여한다는 의미이다. 즉, 소유자는 모든 작업을 할 수 있고, 그룹 멤버와 다른 사용자는 읽고 실행할 수만 있다.
이 명령어들을 실행함으로써, nGrinder 애플리케이션을 실행하는 사용자가 /Users/yijun/ngrinder/repos 디렉토리와 그 하위 디렉토리에 대한 적절한 접근 및 수정 권한을 갖게 되어, 앞서 언급된 에러를 해결할 수 있게 된다.
Password: 부분에 노트북 비밀번호를 입력하면 수정이 완료된다!
이렇게 수정해 주고 다시 nGrinder를 실행해 보자.
nGrinder 실행
nGrinder를 실행해 보자.
java -Djava.io.tmpdir=${NGRINDER_HOME}/lib -jar ngrinder-controller-3.5.8.war --port=8300
그럼 정상 실행된다. (여기까지는 맨 처음에도 됐다. 이 뒤에 스크립트 메뉴에 접속이 안 됐을 뿐,,,)
페이지에 접속해서 스크립트 메뉴로 이동해 보자.
(현재 목록이 있는 이유는 캡처하기 전에 테스트 스크립트를 생성해서 그렇고 스크립트 메뉴에 처음 접속하면 아무 스크립트 없다!)
이렇게 스크립트 메뉴로 정상 접속되고 부하테스트도 정상적으로 진행할 수 있다.
같은 팀원인 "개발자의 서랍"님의 블로그도 한번 방문해 보세요! 좋은 글이 많이 있습니다 :)
'Tools > nGrinder' 카테고리의 다른 글
nGrinder를 사용하여 시스템 성능 한계와 최적 부하 지점 분석 (5) | 2024.02.14 |
---|---|
nGrinder를 활용한 성능 테스트 - 기본에서 전략까지 (1) | 2024.02.14 |
macOS에서 nGrinder 설치 - 엔그라인더 환경 설정 (4) | 2024.02.14 |