[CBRD-26249] delvoldb utility
http://jira.cubrid.org/browse/CBRD-26249
영구 볼륨 중 빈 볼륨 또는 임시 볼륨을 삭제할 수 있는 유틸리티 지원 (SA 모드에서만 지원)
해당 PR는 recovery 부분의 조언을 받지 위한 것으로 ..
- log_append_postpone ()을 사용했는데, commit 중 crash 후 redo recovery시 log_recovery_abort_interrupted_sysop()에서 assert 발생 : 현재는 해당 assert를 주석 처리함.
@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
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 미팅때 이야기한 것처럼 아래 시나리오 처럼 백업 후 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 시간을 사용하면 됨.)
@hornetmj develop과 동기화했습니다. 확인부탁합니다.
@mhoh3963 확인 후 회신드리겠습니다.