ostafen / clover

A lightweight document-oriented NoSQL database written in pure Golang.
MIT License
666 stars 55 forks source link

DropCollection doesn't delete the collection from disk #95

Closed werelord closed 2 years ago

werelord commented 2 years ago

using Clover v1.2.0

the DropCollection() method doesn't remove the data from the disk; recreating the collection after dropping the collection still has the documents previously stored in the collection.

Given the following code:

    type Foobar struct {
        Foo string
        Bar string
        Num int
    }
    var foo = Foobar{Foo: "foo", Bar: "bar", Num: 42}

    db, _ := clover.Open("clover-db")
    defer db.Close()
    db.CreateCollection("foobar")

    doc := clover.NewDocument()
    doc.Set("foobar", foo)

    docId, _ := db.InsertOne("foobar", doc)
    fmt.Println("id inserted: ", docId)

    if err := db.DropCollection("foobar"); err != nil {
        fmt.Print("error: ", err)
    }
    db.Close() // explicitly close just because

    // reopen the db, recreate the collection
    db, _ = clover.Open("clover-db")
    defer db.Close()
    db.CreateCollection("foobar")

    docs, _ := db.Query("foobar").FindAll()
    fmt.Println("after recreation, document count: ", len(docs))
    for _, d := range docs {
        fmt.Printf("docs:%+v\n", d)
    }

The output from the code:

id inserted:  b0a869b0-c8cf-4d61-91aa-98cc93808d0a
after recreation, document count:  1
docs:&{fields:map[_id:b0a869b0-c8cf-4d61-91aa-98cc93808d0a foobar:map[Bar:bar Foo:foo Num:42]]}

I would guess that this is possibly an issue with the Badger storage engine?

ostafen commented 2 years ago

@werelord, can you try using the v2.0.0-alpha.2? This issue should be solved starting from that version.

werelord commented 2 years ago

@ostafen just tried it on v2 branch, and indeed it is fixed:

id inserted:  2c247429-481f-4a63-852a-a8b3b0ac2870
after recreation, document count:  0

I'm curious, if I may ask, what the fix was? In my limited digging thru Badger it appears they set a Delete flag, which is then cleaned up on GC..

Would this be ported back to v1.2, or is v2 alpha stable enough to use?? I'm using this mostly for a toy project, so stability isn't a huge issue for me..

ostafen commented 2 years ago

That was an issue with clover, not with badger, which have been fixed in the v2. v2 is currently in alpha state because I want to collect user feedback, before releasing a stable version, but you can go with it, since in the future it will be the reference version. It also contains a lot of optimizations, which are not available in the v1.2.0.

I'm curious, if I may ask, what the fix was? In my limited digging thru Badger it appears they set a Delete flag, which is then cleaned up on GC..

Yes, this is an implementation detail of badger, values are simply marked as deleted and are cleared from disk in a second moment, but this doesn't imply that you can continue to see them