【已完成】关于用多线程加速ElasticBF的Filter loading的想法 #14
Replies: 2 comments
-
大概是这样: 但是放入到db的时候,似乎会和compaction冲突,会卡住 |
Beta Was this translation helpful? Give feedback.
-
已经搞完了,看这个commit。 ##加载部分 Env里的Schedule函数可以接收一个任务(函数),然后用一个额外的线程去处理,如果接收时,Schedule还在工作,那么添加的线程将sleep,之前一直拿整个db的Schedule去加载bf。 当进行Compaction的时候,Compaction会尝试把FilterBlockReader加载起来,放入mq,因为Compaction线程本身就是从Schedule创建的,这相当于,在Schedule里执行Schedule函数,Compaction线程会sleep,因为此时Schedule正在处理Compaction线程,所以要等Compaction线程完事了才能调动Compaction线程,所以Compaction线程会一直Sleep,就变成了死锁。 解决的方法很简单,因为Env是全局单例的,你怎么创建都是原来那一个,所以我只好从Env里把Schedule抠出来,单独写一个MQSchedule类,两个相互独立,使用不同的锁,就不会死锁。 读取部分因为加载BF,和主线程是并发的,所以,主线程完全有可能在加载BF未完成前就读取到FilterBlockReader,这个时候可能会使得假阳率太大,所以我在FilterBlockReader里设置了一个flag:done,代表加载BF是否完成,当主线程要使用Reader的时候,如果background线程尚未完成加载,也就是done为false,那么它将在一个信号量上wait,等background线程完成了加载,它会使得done为true,然后让wait在当前信号量上的线程重新启动,使用Reader,此时的Reader就是正常的。 |
Beta Was this translation helpful? Give feedback.
-
实现方式
实现上主要有两种方式:
可能产生的问题
因为Filter多一个少一个无所谓,无非是假阳率的变化,数据不会读错。
Beta Was this translation helpful? Give feedback.
All reactions