在bluestore中open block时会传递一个cb函数,当对这个block异步写也就是aio写完成时会调用这个aio_cb int BlueStore::_open_bdev(bool create) { assert(bdev == NULL); string p = path + "/block"; #aio_cb 时aio写完成时的回调函数,第四个参数static_cast<void*>(this),是在回调函数中真正调用的函数, #这里的static_cast 表示指针强制转换 bdev = BlockDevice::create(cct, p, aio_cb, static_cast<void*>(this)); int r = bdev->open(p); if (r < 0) goto fail; } static void aio_cb(void *priv, void *priv2) { BlueStore *store = static_cast<BlueStore*>(priv); #再次强制类型转换 BlueStore::AioContext *c = static_cast<BlueStore::AioContext*>(priv2); #执行aio_finish表示本次写操作完成 c->aio_finish(store); } 这里的AioContext的定义如下: struct AioContext { virtual void aio_finish(BlueStore *store) = 0; virtual ~AioContext() {} }; 在bluestore中 这个类的子类总共有两个 struct TransContext : public AioContext { void aio_finish(BlueStore *store) override { store->txc_aio_finish(this); } }; struct DeferredBatch : public AioContext { void aio_finish(BlueStore *store) override { store->_deferred_aio_finish(osr); } }; 可见 这两个子类的aio_finish中有分别调用bluestore的txc_aio_finish和_deferred_aio_finish
bluestore中的aio回调
猜你喜欢
转载自blog.csdn.net/tiantao2012/article/details/80190681
今日推荐
周排行