[iRods] 데이터 오브젝트가 포함된 리소스 삭제하기 CAT_RESOURCE_NOT_EMPTY

작성: 2022.10.17

수정: 2022.10.17

읽는시간: 00 분

Development/Daily Error

반응형

iRods Resource 관련 명령어

iadmin 명령어를 사용하기 위해서는 iRods 호스트 (혹은 컨테이너) 에 접근해 iinit 을 먼저 실시 해 주어야 합니다.

모든 iadmin 명령은 한번의 iadmin 후에 iadmin> 상태에서 입력 가능.

보다 자세한 iRods 명령어는 https://docs.irods.org/ 를 참고.

mkresc

리소스 생성. Valut 경로는 반드시 마운트가 이루어져 있어야 합니다.

사용방법

iadmin mkresc 이름 타입 [호스트:Path] [ContextString]

예시

# compound 부모 리소스 생성
iadmin mkresc compex compound '' auto_repl=on

# replication 부모 리소스 생성
iadmin mkresc replex replication

# 일반적인 / 혹은 자식으로 쓸 unixfilesystem 리소스 생성
iadmin mkresc sample1 compound unixfilesystem irods:/mnt0

addchildtoresc

부모 리소스에 자식 리소스 추가

사용방법

iadmin addchildtoresc 부모리소스이름 자식리소스이름 [ContextString]

예시

# replication 구성시 자식 리소스 추가
iadmin addchildtoresc replex sample1 
iadmin addchildtoresc replex sample2

# compound 구성시 cache / archive 리소스로 추가. 
# 첫번째 replica를 cache 리소스에 생성 후 두번째 replica를 archive resource에 추가 한다.
iadmin addchildtoresc compex sample1 cache
iadmin addchildtoresc compex sample2 archive

moderesc

리소스 정보 수정

사용방법

modresc 리소스이름 [name, type, host, path, status, comment, info, free_space, context, rebalance] 변경할값

사용 예시

# 리소스 이름 변경. sample1 에서 sample0 으로
iadmin modresc sample1 name sample0
# 리소스 리밸런스. replication 구성 한 부모 리소스에서 실행시 모든 자식 리소스들의 데이터가 동기화됨
iadmin modresc replex rebalance

ilsresc

ilsresc

구성된 Resource 들의 Hierarchy를 볼 수 있습니다.

image-20221017142534407

rmchildfromresc

부모 리소스에서 자식 리소스 제거

image-20221017142637254

사용방법

iadmin rmchildfromresc 부모리소스이름 자식리소스이름

예시

iadmin rmchildfromresc replex sample1
iadmin rmchildfromresc compex sample1

rmresc

리소스 삭제. 삭제를 위해서는 부모 자식 관계를 미리 제거해야 합니다.

사용방법

iadmin rmresc 리소스이름

예시

iadmin rmresc sample1

문제상황

image-20221017142735486

replication 구성 후 rebalance까지 진행하여 repl_resc1 이라는 이름의 자식 리소스는 여러가지 dataObjects 를 포함하고 있는 상태. 이 상태에서는 rmresc 명령이 먹히지 않습니다.

ERROR: rcGeneralAdmin failed with error -835000 CAT_RESOURCE_NOT_EMPTY
Level 0: resource 'repl_resc1' contains one or more dataObjects

추가된 파일이 많지 않다면 하나씩 제거 해 낸 후 진행 할 수 있지만 파일의 수가 많을 경우엔 쉽지 않습니다.

해결

혹시 모를 휴지통을 먼저 한번 비워 주고..

irmtrash

일단 파일이 어느정도 있는지를 판단 합니다.

iquest "SELECT DATA_NAME WHERE DATA_RESC_NAME like 'repl_resc1%'"

image-20221017143251083

꽤 많은 파일 들이 확인됩니다. 파일이 적다면 하나씩 삭제 해도 됩니다.

각각 파일들의 위치를 확인 합니다.

iquest "SELECT DATA_NAME, COLL_NAME WHERE DATA_RESC_NAME = 'repl_resc1'"

image-20221017150237168

모든 파일이 /rdss/home/rods 하위에 위치 해 있습니다.

irm -rf /rdss/home/rods
irmdir /rdss/home/rods

image-20221017150947380

그렇지만 폴더가 비어 있지 않고, 해당 경로가 홈 디렉터리기 때문에 폴더를 한번에 삭제하는 방법이 먹히지 않습니다.

image-20221017152601429

https://groups.google.com/g/irod-chat/c/0qhLSSP5aNo/m/H0vwlG4LOH8J

사용자가 실수로 홈 디렉터리를 날려버리는 경우를 방지하기 위해서라고 합니다.

아래처럼 파일을 하나씩 일일히 삭제 할 수는 있지만 (-f 는 trash로 보내지 않고 바로 삭제하는 옵션)

irm -f /rdss/home/rods/fe/ee/0test.1b1666.jpg

파일이 많으면 하나씩 삭제하기에는 너무 힘듭니다.

쉘 스크립트를 이용 해 보도록 하겠습니다.

ils

image-20221017152802171

일단 ils 를 실행하면 위와 같이 모든 Home의 하위 디렉터리가 표시됩니다.

이번에는 각 line을 반복하며 substirng 으로 잘라서 두번째 텍스트부터 echo로 출력 해 보겠습니다.

ils | while read line; do echo ${line:2}; done

image-20221017153213589

얼추 필요한 데이터 추출이 된 것 같습니다. 이제 라인마다 반복적으로 irm -rf 명령을 실행 합니다.

ils | while read line; do irm -rf ${line:2}; done

image-20221017153402406

드디어 모든 하위폴더를 삭제 하고 홈 디렉터리만 남겼습니다! 첫줄을 제외시키지 않아 에러메시지가 나왔지만 실행에는 문제가 없습니다. 하나씩 삭제하려면 정말 힘들었을 텐데 천만다행입니다.

이후로는 admin이 아닌 다른 계정에 약간의 파일이 남아 있어서 삭제를 시도 했는데 admin 계정에서는 삭제가 안되어서

iinit -l

image-20221017155323644

irods 설정을 조회 한 뒤에, iexit 로 로그인 세션을 종료 하고, /root/.irods/irods_environment.json 파일의 로그인 계정을 변경 해서 해당 파일에 대한 권한이 있는 계정으로 들어가 남은 파일을 마저 삭제 했습니다.

후에 리소스에 남은 파일을 조회 해 봅니다.

iquest "SELECT DATA_NAME, COLL_NAME WHERE DATA_RESC_NAME = 'repl_resc1'"

image-20221017155435420

드디어 삭제 할 준비가 되었습니다. 다시 원래의 관리자 계정으로 로그인 한 후에

iadmin rmresc repl_resc1

image-20221017155630279

드디어 깔끔하게 삭제 되었습니다.

이상입니다.

References

반응형