FgForrest / evitaDB

evitaDB is a specialized database with an easy-to-use API for e-commerce systems. It is a low-latency NoSQL in-memory engine that handles all the complex tasks that e-commerce systems have to deal with on a daily basis. evitaDB is expected to act as a fast secondary lookup/search index used by front stores.
https://evitadb.io
Other
61 stars 7 forks source link

Cannot fetch catalog statistics when catalog is corrupted #674

Closed lukashornych closed 1 day ago

lukashornych commented 1 day ago

When any catalog is corrupted, cannot fetch catalog statistics with

curl -XPOST -H 'content-type: application/json; charset=utf-8; protocol=gRPC' 'http://localhost:5555/io.evitadb.externalApi.grpc.generated.EvitaManagementService/GetCatalogStatistics' -d '{}'

it returns

{
  "code": 13,
  "grpc-code": "INTERNAL",
  "details": [

  ]
}

with following error in server log

09:41:19.636 ERROR i.e.e.g.s.i.GlobalExceptionHandlerInterceptor - Exception occurred during processing of gRPC call: Cannot invoke "io.evitadb.api.CatalogState.ordinal()" because "catalogState" is null
java.lang.NullPointerException: Cannot invoke "io.evitadb.api.CatalogState.ordinal()" because "catalogState" is null
    at io.evitadb.externalApi.grpc.requestResponse.EvitaEnumConverter.toGrpcCatalogState(EvitaEnumConverter.java:102)
    at io.evitadb.externalApi.grpc.dataType.EvitaDataTypesConverter.toGrpcCatalogStatistics(EvitaDataTypesConverter.java:1525)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:1024)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575)
    at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
    at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616)
    at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:622)
    at java.base/java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:627)
    at io.evitadb.externalApi.grpc.services.EvitaManagementService.lambda$getCatalogStatistics$12(EvitaManagementService.java:291)
    at io.evitadb.externalApi.grpc.services.EvitaManagementService.lambda$executeWithClientContext$0(EvitaManagementService.java:132)
    at io.evitadb.core.async.ObservableThreadExecutor$ObservableRunnable.run(ObservableThreadExecutor.java:443)
    at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1423)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
    at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312)
    at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843)
    at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808)
    at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188)

I've simulated the corrupted catalog by deleting the catalog binary file (the test-catalog_0.catalog). Maybe it is related to the fact, that before corrupting the catalog file, the catalog was in warming up state.

novoj commented 1 day ago

I fixed this one. Probably in the JFR branch. Is it possible you didn't fetch the updates or work in different branch?

lukashornych commented 1 day ago

@novoj Yeah you are right. I did fetch the newest commits, but forgot to rebuild it. Sorry, it is working now.