objectbox / objectbox-java

Android Database - first and fast, lightweight on-device vector database
https://objectbox.io
Apache License 2.0
4.33k stars 297 forks source link

io.objectbox.exception.FileCorruptException: Corrupt DB, min key size violated: 0 #1143

Open linge123 opened 10 months ago

linge123 commented 10 months ago

hello in my app always

Basic info (please complete the following information): ObjectBox version : :3.5.1 Reproducibility: occurred once only Devices: android

init boxStore code: BoxStoreBuilder storeBuilder = MyObjectBox.builder() .validateOnOpen(ValidateOnOpenMode.WithLeaves) // Additional DB page validation .validateOnOpenPageLimit(20) .androidContext(context.getApplicationContext())

queryData code: getBox().query().equal(Db_.userId, "4229047", QueryBuilder.StringOrder.CASE_INSENSITIVE).build().find();

Logs, stack traces: io.objectbox.exception.FileCorruptException: Corrupt DB, min key size violated: 0 at io.objectbox.query.Query.nativeFind(Native Method) at io.objectbox.query.Query.lambda$find$2$io-objectbox-query-Query(Query.java:252) at io.objectbox.query.Query$$ExternalSyntheticLambda4.call(Unknown Source:2) at io.objectbox.BoxStore.callInReadTx(BoxStore.java:940) at io.objectbox.BoxStore.callInReadTxWithRetry(BoxStore.java:886) at io.objectbox.query.Query.callInReadTx(Query.java:368) at io.objectbox.query.Query.find(Query.java:251)

image

greenrobot commented 10 months ago

Reproducibility: occurred once only

That's a little problematic to work with because the stacktrace doesn't help us in this case.

If you see some way to reproduce, please let us know. Otherwise, a next upcoming version will provide validation for this error type, which might be helpful.

Edit: See also related #1090.

ldpGitHub commented 9 months ago

i get this error also,in my case ,i found another problem,some data can't been query by isNull, after that i get this error in bugly

ldpGitHub commented 9 months ago

here is the stackTrace,user already unistall the app,so i can't provide more infomation for this

2 main

io.objectbox.exception.FileCorruptException

Corrupt DB, min key size violated: 0

io.objectbox.query.Query.nativeFind(Native Method) io.objectbox.query.Query.lambda$find$2$io-objectbox-query-Query(Query.java:252) io.objectbox.query.Query$$ExternalSyntheticLambda6.call(Unknown Source:2) io.objectbox.BoxStore.callInReadTx(BoxStore.java:940) io.objectbox.BoxStore.callInReadTxWithRetry(BoxStore.java:886) io.objectbox.query.Query.callInReadTx(Query.java:368) io.objectbox.query.Query.find(Query.java:251)

greenrobot-team commented 9 months ago

We have released version 3.7.0 which contains a new validation option to help diagnose this issue.

A new key/value validation option validateOnOpenKv() is available on MyObjectBox.builder(). If enabled, the build() call will throw a FileCorruptException if corruption is detected with details on which key/value is affected in the exception message.

This can be used if the above exception is thrown to re-open the store with additional validation to get more details:

try {
    boxStore = storeBuilder.build();
} catch (FileCorruptException e) {
    try {
        boxStore = MyObjectBox.builder()
                .androidContext(context.getApplicationContext())
                .validateOnOpenKv()
                .build();
    } catch (FileCorruptException ce) {
        // TODO Report the exception message, for example:
        // KV validation failed; key is empty (KV pair number: 1, key size: 0, data size: 112)
    }
}
linge123 commented 9 months ago

We have released version 3.7.0 which contains a new validation option to help diagnose this issue.

A new key/value validation option validateOnOpenKv() is available on MyObjectBox.builder(). If enabled, the build() call will throw a FileCorruptException if corruption is detected with details on which key/value is affected in the exception message.

This can be used if the above exception is thrown to re-open the store with additional validation to get more details:

try {
    boxStore = storeBuilder.build();
} catch (FileCorruptException e) {
    try {
        boxStore = MyObjectBox.builder()
                .androidContext(context.getApplicationContext())
                .validateOnOpenKv()
                .build();
    } catch (FileCorruptException ce) {
        // TODO Report the exception message, for example:
        // KV validation failed; key is empty (KV pair number: 1, key size: 0, data size: 112)
    }
}

FileCorruptException:

io.objectbox.exception.FileCorruptException: KV validation failed; key is empty (KV pair number: 40753, key size: 0, data size: 3145)

greenrobot-team commented 9 months ago

@linge123 Thanks for this!

If possible, can you send use the corrupted database file? (We have some example code on how to ask users to do this for a production app.)

Also to everyone, would it be helpful if ObjectBox included a repair mode that would delete corrupted keys and values (basically affected objects)?

linge123 commented 9 months ago

Add a repair mode, that would be great。

The database contains user private information, which is best not to do so

ldpGitHub commented 8 months ago

Add a repair mode, that would be great。

The database contains user private information, which is best not to do so

how many data when crash happens ? i guess it may assosiate with data size , in my case it was about 50W data in one table