rosedblabs / rosedb

Lightweight, fast and reliable key/value storage engine based on Bitcask.
https://rosedblabs.github.io
Apache License 2.0
4.56k stars 631 forks source link

remove 000000002.SEG: no such file or directory #242

Closed taroim closed 1 year ago

taroim commented 1 year ago

当 Merge() 方法连续执行两次后,重新打开数据库,就会提示:remove 000000002.SEG: no such file or directory

why is that?

roseduan commented 1 year ago

能把你的代码贴一下吗

taroim commented 1 year ago
package main

import (
    "crypto/rand"
    "fmt"

    "github.com/rosedblabs/rosedb/v2"
)

func generateRandomBinaryData(size int) ([]byte, error) {
    data := make([]byte, size)
    _, err := rand.Read(data)
    if err != nil {
        return nil, err
    }
    return data, nil
}

func main() {
    opts := rosedb.Options{
        DirPath:     ".",
        BlockCache:  100 * rosedb.MB,
        SegmentSize: 2 * rosedb.GB,
    }

    db, err := rosedb.Open(opts)
    if err != nil {
        fmt.Printf("open error: %v", err)
        return
    }
    defer db.Close()

    data, _ := generateRandomBinaryData(1024 * 100)
    for i := 0; i < 100; i++ {
        key := fmt.Sprintf("test___%v___", i)
        err := db.Put([]byte(key), data)
        if err != nil {
            fmt.Printf("put error: %v", err)
            return
        }
    }

    if err := db.Merge(); err != nil {
        fmt.Printf("merge error: %v", err)
        return
    }

    // 如果这里重复执行 Merge() 的话
    // 那么下一轮运行本程序就会出现:open error: remove 000000002.SEG: no such file or directory
    if err := db.Merge(); err != nil {
        fmt.Printf("merge error: %v", err)
        return
    }
}
taroim commented 1 year ago

以下代码来自示例中:

package main

import (
    "github.com/rosedblabs/rosedb/v2"
    "github.com/rosedblabs/rosedb/v2/utils"
)

// this file shows how to use the Merge feature of rosedb.
// Merge is used to merge the data files in the database.
// It is recommended to use it when the database is not busy.

func main() {
    // specify the options
    options := rosedb.DefaultOptions
    options.DirPath = "/tmp/rosedb_merge"

    // open a database
    db, err := rosedb.Open(options)
    if err != nil {
        panic(err)
    }
    defer func() {
        _ = db.Close()
    }()

    // write some data
    for i := 0; i < 100000; i++ {
        _ = db.Put([]byte(utils.GetTestKey(i)), utils.RandomValue(128))
    }

        // 将以下代码注释后,多执行几次程序就会出现:remove 000000002.SEG: no such file or directory
    // delete some data
    //for i := 0; i < 100000/2; i++ {
    //  _ = db.Delete([]byte(utils.GetTestKey(i)))
    //}

    // then merge the data files
    // all the invalid data will be removed, and the valid data will be merged into the new data files.
    _ = db.Merge()
}
Jeremy-Run commented 1 year ago

@taroim Thank you for your feedback, I hope this pr can help you. https://github.com/rosedblabs/rosedb/pull/243

roseduan commented 1 year ago

已经在最新的 Commit 中修复了,请问你是打算使用 rosedb 还是仅学习? @taroim

taroim commented 1 year ago

@Jeremy-Run Thank you, the speed of problem-solving is very fast, thumbs up! @roseduan 这个项目很棒,在将其应用到实际项目中之前,我希望先进行学习和测试。

roseduan commented 1 year ago

@Jeremy-Run Thank you, the speed of problem-solving is very fast, thumbs up! @roseduan 这个项目很棒,在将其应用到实际项目中之前,我希望先进行学习和测试。

好的,谢谢,有任何问题都可以反馈