objectbox-java icon indicating copy to clipboard operation
objectbox-java copied to clipboard

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

Open linge123 opened this issue 1 year ago • 8 comments

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

linge123 avatar Jul 19 '23 07:07 linge123

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.

greenrobot avatar Jul 23 '23 18:07 greenrobot

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 avatar Aug 14 '23 05:08 ldpGitHub

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)

ldpGitHub avatar Aug 14 '23 06:08 ldpGitHub

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)
    }
}

greenrobot-team avatar Aug 23 '23 09:08 greenrobot-team

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)

linge123 avatar Aug 24 '23 11:08 linge123

@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)?

greenrobot-team avatar Aug 28 '23 08:08 greenrobot-team

Add a repair mode, that would be great。

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

linge123 avatar Aug 28 '23 09:08 linge123

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

ldpGitHub avatar Sep 12 '23 09:09 ldpGitHub