190 likes | 258 Views
ページロック処理での TSNTranslationTable 同期. 平成14年1月15日 田村慶一,中野裕也 ( H14.6.17 に一部変更). Web ページ http://www.db.is.kyushu-u.ac.jp/fish /. 概要. ページロック処理での TSNTranslationTable に関するマルチスレッド処理同期の問題と解決. 以前のデッドロック. 時間. write lock 保持. _doing_local_page _lock_on_mirror. write lock. スレッド 3. read lock.
E N D
ページロック処理でのTSNTranslationTable 同期 平成14年1月15日 田村慶一,中野裕也 (H14.6.17 に一部変更) Webページ http://www.db.is.kyushu-u.ac.jp/fish/
概要 ページロック処理での TSNTranslationTableに関するマルチスレッド処理同期の問題と解決
以前のデッドロック 時間 write lock保持 _doing_local_page _lock_on_mirror write lock スレッド3 read lock スレッド2 write lock write lock スレッド1 read lock TSN_translation _table_lock read lock保持 ・ロックの順番をきめることで回避
別の問題 TSN_translation _table_lock read lock read lock write lock スレッド(page_lock_forward) ミラーサイト スレッド(transaction begin, commit, abort) スレッド(page_lock) ページのwrite要求 スレッド プライマリサイト スレッド ページのwrite要求 スレッド(page_lock) ミラーサイト スレッド(transaction begin, commit, abort) スレッド(page_lock_forward) read lock read lock write lock TSN_translation _table_lock
回避案 複数のミラーサイトでpage lock(_TSN_translation_table_lockをreadロック)していて、 それぞれがpage_lock_forwardを呼び出す page_lock_forwardが呼ばれるまでに別のスレッドが_TSN_translation_table_lockを writeロックするために待つ page_lock_forwardが_TSN_translation_table_lockをreadロックするために待って、 デッドロックが起こる ・案1 page_lock_forwardで_TSN_translation_table_lockが取れないときはpage_lockに 処理を戻し、page_lockが保持するロックを開放し、writeロックを済ませてから またpage_lock_forwardを行う ・案2 _TSN_translation_table_lockは必要な場合だけロックして、処理が終わるとすぐに ロックを開放 リモートに問い合わせている間にトランザクションがなくなってないかチェックする 案2の採用を検討
用語の説明TSN Translation Table • TSNとTENの変換テーブル • TSN トランザクションシリアル番号 • ユーザから見える番号 • 1つのサイト内でトランザクションの識別番号 • 0~264 -1 • IPアドレスとペアを組むことでトランザクション識別子(TID)となる • TEN トランザクションエントリー番号 • 分散ロックマネージャ内でトランザクションに関する情報を格納するための番号 • ページロックテーブルにはTENでロックのオーナーが格納されている • 0~1024(同時に実行できるトランザクションの最大値)
ミラーサイト TSN_translation_table_lock read lock write lock待ち read lock待ち page_lock transaction_begin page_lock_forward ミラーサイト page_lock transaction_begin page_lock_forward write lock待ち read lock待ち read lock TSN_translation_table_lock
page_lock中にTSNTranslationTableのRead Lockを保持しないといけない理由 同期の問題 • ロックコンフリクトが発生した時、ロックのオーナーのTSNを求めることができなくなることを防ぐ • remote page lockメッセージをプライマリサイトに出している途中にそのトランザクションにrollback signalが届いて、ロックリリース処理が分散ロックマネージャで行なわれることを防ぐ 上記の問題に対する 単純な解決策は,TSNTransalation テーブルのRead Lock を保持すること(次ページ,次々ページ参照)
単純な解決策 (1/2) PageServerMain::page_lock ① TSNTranslation TableをRead Lock ② ロックを獲得しようとしたがロックコンフリクトと判定. lockのownerのtenとtsnをDistributedLockManagerから 返り値として受け取る ⇒ この中では,TSNTranslation Tableを使ってten からtsnを求める この一瞬の間(②と③の間)にten が示すトランザクションがコミットまたはアボート tsnをtableから削除する操作は待たされる ③ tserverにwait for page lockメッセージを送信 ④ TSNTranslation TableをUnLock 処理の流れ
単純な解決策 (2/2) PageServerMain::page_lock ①TSNTranslation TableをRead Lock ② remote page lock この間にトランザクションに rollback signalが届きロールバック lock releaseの操作は 待たされる ③remote page lockの返事を受け取る ④TSNTranslation TableをUnLock 処理の流れ
課題 • TSNTransalation テーブルの Read Lock を保持すると • 「ページロック処理(page_lock)中にTSNTranslationに関して起こりえる問題」は解決できるが • ページサーバがデッドロックするという,新たな問題が発生する
page_lock中にTSN TranslationTableのRead Lockを保持しなくてもいいようにするための同期処理 • 1.に関しては分散デッドロックマネージャの機能を使って問題の発生を防ぐ • 2.に関してはremote page lockメッセージの返事を受け取った時にロールバックされていないかどうかチェックすることで問題の発生を防ぐ 以上の2点でpage lock中にTSN Translation TableをRead Lockをかけたままにしなくてよくなる 注意 page lock の処理の最初にtsnからtenを求めるコードがありその時だけRead Lockが必要
PageServerMain::page_lock ①ロックを獲得しようとしたがロックコンフリクトと判定 lockのownerのtenをDistributedLockManagerから返り値 として受け取る この一瞬の間にtenが示すトランザクション がコミットまたはアボート 再実行 tsnを求めることができなくなる ②TSNTranslation Tableを使ってtenからtsnを求めることが できない tsn= -1 ③tserverにwait for page lockメッセージを送信 tsnが-1なのでtserverからTS_RETRYが 返信される 処理の流れ
PageServerMain::page_lock ① remote page lock この一瞬の間にトランザクションに rollback signalが届きロールバック lock releaseされる ② remote page lockの返事を受け取る ③ロールバックされていないか確認する ④-(a) ロールバックされていたら処理を終了 ④-(b) ロールバックされていなかったら通常の処理 処理の流れ
ロールバックされているかどうか確認する方法ロールバックされているかどうか確認する方法 • TSN Translation Tableにそのトランザクションのtsnが登録されているかどうか調べると分かる • tsnが存在するならばそのtsnを示すトランザクションはロールバックされていない • tsnが存在しないならばそのtsnを示すトランザクションはすでにロールバック済み
PageServerMain::page_lock ①ロックを獲得しようとしたがロックコンフリクトと判定 lockのownerのtenをDistributedLockManagerから返り値 として受け取る この一瞬の間にtenが示すトランザクション がコミットまたはアボート 再実行 tsnを求めることができなくなる ③TSNTranslation Tableを使ってtenからtsnを求めることが できない tsn= -1 ⑤tserverにwait for page lockメッセージを送信 tsnが-1なのでtserverからTS_RETRYが 返信される 処理の流れ
PageServerMain::page_lock ① remote page lock ② remote page lockの返事を受け取る 処理の流れ