stateIs0 / lu-raft-kv

this is raft java project. raft-kv-storage
https://thinkinjava.cn/2019/01/12/2019/2019-01-12-lu-raft-kv/
Apache License 2.0
806 stars 216 forks source link

RocksDB bug #24

Open dajitui opened 1 year ago

dajitui commented 1 year ago

在高并发下,对RocksDB 处理出现数据不一致问题

    @SneakyThrows
    @Test
    public void test() throws RocksDBException {
        System.out.println(getLastIndex());
        System.out.println(get(getLastIndex()));

        System.out.println("-------begin--------");

        int i = 0;

        while (i < 10) {
            int finalI = i;
            CompletableFuture.runAsync(() -> {
                write(new Cmd("hello", "value"));
                System.out.println(finalI +" "+ getLastIndex());

                deleteOnStartIndex(getLastIndex());

                System.out.println(finalI +" "+ getLastIndex());
            });
            i++;
        }

        Thread.sleep(4000);

        System.out.println("----------end----------");

        System.out.println(getLastIndex());

        System.out.println(get(getLastIndex()));

        Thread.sleep(3000);

    }
kebukeYi commented 1 year ago

image 在红色框中,很有可能 线程A获得锁执行了一次write()函数,随后释放锁; 然后线程C紧接着获得了锁,也执行了一次write()函数,此时 getLastIndex()==2,然后线程A获得锁执行的 deleteOnStartIndex()函数,是从2开始的,因此会出现1位置的日志没有被删除;

dajitui commented 1 year ago

image 在红色框中,很有可能 线程A获得锁执行了一次write()函数,随后释放锁; 然后线程C紧接着获得了锁,也执行了一次write()函数,此时 getLastIndex()==2,然后线程A获得锁执行的 deleteOnStartIndex()函数,是从2开始的,因此会出现1位置的日志没有被删除;

getLastIndex跟写操作没有同步

kebukeYi commented 1 year ago

是没有同步;所以,你是想怎么改???

dajitui commented 1 year ago

是没有同步;所以,你是想怎么改???

这个问题简单,可以百度一下或者问下chaigpt

kebukeYi commented 1 year ago

image 怎么感觉你在自问自答啊? 你明知道那样操作 会出现问题,还把问题抛出来,是想起到一个错误示范作用吗?

dajitui commented 1 year ago

我来给你普及一下,github 的issue 是为了开发者提出问题、缺陷。并不是我给了一个错误的示范,而是框架就不严谨,就是java并发没有做好。 我开着三轮车,不说三轮车不行,说开的人有问题,哈哈

kebukeYi commented 1 year ago

那我就不懂了;那你既然说 解决方法简单,那你大致说一下你的解决思路?