Cassandraの書き込み
Commit Log=>MemTable
RowMutationの送信
RowMutationの受信
- org.apache.cassandra.db.RowMutationVerbHandler
- RowMutationを受信
- handlerはStorageServiceで登録されている
- Table.open(rm.getTable()).apply(rm, bytes, true)によりMemTableに書き込み
MemTableの書き込み
- org.apache.cassandra.db.Table
- apply(RowMutation mutation, Object serializedMutation, boolean writeCommitLog)関数によりmemtableにrmの書き込みを行う
- writeCommitLogがtrueの場合はmutationに関するfutureオブジェクトを使ってローカルログへ書き込み(Future
future = CommitLog.instance().add(mutation, serializedMutation);) - カラムファミリーごとにColumnFamilyStoreを介してmemtableオブジェクトを作り、memtablesToFlushというHashMapに書き込み
- memtablesToFlushがいっぱいならflushする
- maybeSwitchMemTableを呼ぶ。
- writeCommitLogがtrueの場合はmutationに関するfutureオブジェクトを使ってローカルログへ書き込み(Future
- apply(RowMutation mutation, Object serializedMutation, boolean writeCommitLog)関数によりmemtableにrmの書き込みを行う
MemTable=>SSTable
- MemTableが一杯になったらColumnFamilyStoreによる処理で非同期でSSTableに書き出される
- org.apache.cassandra.db.ColumnFamilyStore
SSTableの圧縮
非同期でSSTableを圧縮。ガベージコレクタにファントム参照オブジェクト(PhantomReference)を登録し、SSTableへの参照がなくなった時点で消去する。