مسیر نوشتن BlueStore
در کتاب: فصل ۱۲
آزمایشگاه
مسیر نوشتن BlueStore
دستگاه، offset و طول یک نوشتن را انتخاب کنید و ببینید BlueStore چطور آن را تکه میکند و تصمیم میگیرد چه چیزی از WAL (deferred) و چه چیزی مستقیم نوشته شود.
۱تکه
۴ KiBبایتهایی که از WAL میگذرند
–بایتهایی که مستقیم نوشته میشوند
۶۴ KiBprefer_deferred_size
| تکه | بازه | مسیر | شیوه | خواندن پیشین | تخصیص |
|---|---|---|---|---|---|
| big | ۰ B + ۴ KiB | بازنویسی بزرگ در blobهای موجود | deferred (WAL) | – | – |
- queue_transactions OSD تراکنشی به BlueStore میدهد؛ یک TransContext در حالت PREPARE ساخته میشود.
BlueStore::queue_transactions, _txc_create - بُرش در min_alloc _do_write_data نوشتن را به ۱ تکه میبُرد و هر تکه را به _do_write_small یا _do_write_big میفرستد.
BlueStore::_do_write_data, _do_write_small, _do_write_big - عملیات deferred بایتهایی که باید در جا نوشته شوند در یک bluestore_deferred_op_t درون همان تراکنش RocksDB قرار میگیرند.
bluestore_deferred_op_t, BlueStore::_txc_add_transaction - commit در KV همراه داده _kv_sync_thread، metadata و دادهٔ deferred را با یک sync در RocksDB commit میکند؛ نوشتن WAL تنها نوشتن همزمان روی دیسک است.
BlueStore::_kv_sync_thread, _txc_apply_kv - تأیید پس از commit نوشتن ماندگار است؛ _txc_committed_kv callbackهای OSD را کامل میکند و کلاینت میتواند تأییدش را بگیرد.
BlueStore::_txc_committed_kv, _txc_state_proc - نوشتن deferred بعداً و دستهدسته (bluestore_deferred_batch_ops)، بایتهای deferred سر جایشان روی block device نوشته میشوند.
BlueStore::_deferred_queue, _deferred_submit_unlock - پاکسازی وقتی آن نوشتن روی دیسک رفت، _deferred_aio_finish رکورد deferred را از RocksDB پاک میکند.
BlueStore::_deferred_aio_finish
new data: deferred ⇔ data_size < prefer_deferred_size (۶۴ KiB) · small overwrite: always deferred · big overwrite: deferred ⇔ len ≤ 2 × prefer_deferred_size
مطابق با:
src/os/bluestore/BlueStore.cc :: _do_write, _do_write_dataبریدن نوشتن به سر، میانه و دُمBlueStore.cc :: _do_write_small, _do_write_bigمسیرهای نوشتن کوچک و بزرگBlueStore.cc :: _do_alloc_write (prefer_deferred_size)تخصیص و تصمیم deferred یا مستقیمBlueStore.cc :: _txc_state_proc, _kv_sync_thread, _deferred_queueماشین حالت تراکنش، commit در KV و صف deferredsrc/os/bluestore/BlueStore_components.h :: TransContext::state_tحالتهای TransContextsrc/common/options/global.yaml.in :: bluestore_min_alloc_size_hdd/ssd (4K), bluestore_prefer_deferred_size_hdd (64K) / _ssd (0)اندازههای پیشفرضی که اینجا به کار رفته