cubrid icon indicating copy to clipboard operation
cubrid copied to clipboard

[CBRD-26249] delvoldb utility

Open mhoh3963 opened this issue 4 months ago • 5 comments

http://jira.cubrid.org/browse/CBRD-26249

영구 볼륨 중 빈 볼륨 또는 임시 볼륨을 삭제할 수 있는 유틸리티 지원 (SA 모드에서만 지원)

해당 PR는 recovery 부분의 조언을 받지 위한 것으로 ..

  • log_append_postpone ()을 사용했는데, commit 중 crash 후 redo recovery시 log_recovery_abort_interrupted_sysop()에서 assert 발생 : 현재는 해당 assert를 주석 처리함.

mhoh3963 avatar Sep 16 '25 02:09 mhoh3963

@hornetmj

redo recovery 함수는 disk_rv_redo_delvol()이고, log_append_postspone() 호출하는 곳은 disk_del_volume_extension() 입니다. 현재 log_append_postpone() 호출시 log data addr를 NULL로 처리했습니다. (addr의 page를 주었을 경우, disk_rv_redo_delvol()에서 disk_unformat() 호출 후 crash가 발생할 경우 recovery에서 disk_rv_redo_delvol()를 호출하지 않는 문제가 있네요.) assert를 확인하려면, log_recovery.c의 4045 라인의 #if 0 를 #if 1 로 변경하면 됩니다.

delvoldb의 recovery test는 다음과 같이 shell script를 만들어서 수행하면 됩니다.

for i in {1..7} do export delvol_break=$i cubrid createdb -r --db-volume-size=128m deltmp ko_KR.utf8 cubrid addvoldb -S --db-volume-size=20m -p data deltmp cubrid addvoldb -S --db-volume-size=20m -p data deltmp yes | cubrid delvoldb -i 1 deltmp unset delvol_break cubrid spacedb -S deltmp done

mhoh3963 avatar Sep 16 '25 03:09 mhoh3963

@mhoh3963

diff --git a/src/storage/disk_manager.c b/src/storage/disk_manager.c
index c87c7e22e..ce60556cc 100644
--- a/src/storage/disk_manager.c
+++ b/src/storage/disk_manager.c
@@ -2687,8 +2687,12 @@ disk_del_volume_extension (THREAD_ENTRY * thread_p, VOLID volid)
   addr.pgptr = NULL;
   addr.vfid = NULL;

+  log_sysop_start (thread_p);
+
   log_append_postpone (thread_p, RVDK_DELVOL, &addr, redo_size, redo_recv);

+  log_sysop_commit (thread_p);
+
   free_and_init (redo_recv);

   return NO_ERROR;
diff --git a/src/transaction/recovery.h b/src/transaction/recovery.h
index 48381a67c..17c0293ff 100644
--- a/src/transaction/recovery.h
+++ b/src/transaction/recovery.h
@@ -261,7 +261,8 @@ extern void rv_check_rvfuns (void);
 #define RCV_IS_LOGICAL_RUN_POSTPONE_MANUAL(idx) \
   ((idx) == RVFL_DEALLOC \
    || (idx) == RVHF_MARK_DELETED \
-   || (idx) == RVBT_DELETE_OBJECT_POSTPONE)
+   || (idx) == RVBT_DELETE_OBJECT_POSTPONE \
+   || (idx) == RVDK_DELVOL)

 #define RCV_IS_LOGICAL_LOG(vpid, idx) \
   (((vpid)->volid == NULL_VOLID) \

hornetmj avatar Sep 16 '25 12:09 hornetmj

@hornetmj 미팅때 이야기한 것처럼 아래 시나리오 처럼 백업 후 backuptime 으로 restoredb 하는 경우 2가지 문제가 있습니다. 해결 방안을 알려주시면 좋겠네요. (1) backuptime이 devoldb 수행 이후의 commit으로 설정됨 (2) delvoldb 이후나 마지막 addvoldb 이후로 시점 복구시 disk_rv_redo_delvol()가 호출되지 않아 volume개수 맞지 않는 문제가 발생됨

[재현 시나리오] cubrid deletedb addvol \rm -rf addvol* cubrid createdb --db-volume-size=128m --log-volume-size=20m addvol ko_KR.utf8 cubrid addvoldb -S --db-volume-size=20m -p temp addvol cubrid backupdb -S -o backup.info addvol date '+%d-%m-%Y-%H:%M:%S' sleep 5 yes | cubrid delvoldb -i 1 addvol date '+%d-%m-%Y-%H:%M:%S' sleep 5 cubrid addvoldb -S --db-volume-size=20m -p data addvol date '+%d-%m-%Y-%H:%M:%S'

[복구 시나리오] cubrid restoredb -d backuptime addvol cubrid restoredb -d ... addvol (위의 재현 시나리오의 date 시간을 사용하면 됨.)

mhoh3963 avatar Sep 22 '25 07:09 mhoh3963

@hornetmj develop과 동기화했습니다. 확인부탁합니다.

mhoh3963 avatar Nov 28 '25 06:11 mhoh3963

@mhoh3963 확인 후 회신드리겠습니다.

hornetmj avatar Dec 01 '25 02:12 hornetmj