Search code examples
kotlinxodus

xd.lck lock file is not removed after store is closed


My assumption on xodus database locking was that closing the entity store would close the database.

I implemented this with a simple example using the use pattern that calls close:

package whatever

import jetbrains.exodus.entitystore.Entity
import kotlinx.dnq.XdEntity
import kotlinx.dnq.XdModel
import kotlinx.dnq.XdNaturalEntityType
import kotlinx.dnq.store.container.StaticStoreContainer
import kotlinx.dnq.util.initMetaData
import kotlinx.dnq.xdRequiredStringProp
import org.junit.Test
import java.nio.file.Files

class UnclosedTest {
    private val dbFolder = Files.createTempDirectory(null).toFile()

    private val store = StaticStoreContainer.init(
            dbFolder = dbFolder,
            environmentName = "store"
    ).also {
        XdModel.registerNodes(
                Bogus
        )

        initMetaData(XdModel.hierarchy, it)
    }

    @Test
    fun `lock file is removed when store is closed`() {
        store.use { store ->
            store.transactional {
                Bogus.new {
                    text = "gnarf"
                }
            }
        }

        assert(dbFolder.exists())
        assert(dbFolder.isDirectory)
        assert(!dbFolder.resolve("xd.lck").exists())
    }

    class Bogus(entity: Entity) : XdEntity(entity) {
        companion object : XdNaturalEntityType<Bogus>()

        var text by xdRequiredStringProp()
    }
}

Surprisingly, this test fails with the xd.lck file still being present.

How do I close all resources, making sure the lockfile is removed?


Solution

  • The xd.lck file is being released on closing the database, not removed, regardless of which API do you use: Environments, EntityStores, or Xodus-DNQ DSL. See how it is implemented.