apache / apache/iotdb

[Bug] An error occurred when executing getDeviceToStorageGroup():root is not a legal path

Open
#12,966 3 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
6.4k
Forks
1.2k
Avg merge
1d 23h
Merged PRs (30d)
115

Description

### Search before asking

- [X] I searched in the [issues](https://github.com/apache/iotdb/issues) and found nothing similar.

### Version

1.3.2

### Describe the bug and provide the minimal reproduce step

Insert data via restful api, the request payload is as below:
```json
{
"time": "2024-07-18T11:14:37.669158+00:00",
"msg": "action_template_rendered",
"meta": {
"trace_tag": "QUERY_RENDER",
"rule_trigger_ts": [
1721301277619
],
"rule_ids": [
"rule_9f32_duplication"
],
"result": {
"url": "{http,{8,130,129,18},18080,\"/rest/v2/insertTablet\"}",
"timeout": 30000,
"port": 18080,
"path": "/rest/v2/insertTablet",
"method": "post",
"host": "8.130.129.18",
"headers": {
"Content-type": "application/json",
"Authorization": "******"
},
"body": "{\"is_aligned\":false,\"device\":\"mock_client_15\",\"data_types\":[\"FLOAT\",\"FLOAT\",\"FLOAT\",\"FLOAT\",\"FLOAT\",\"FLOAT\",\"FLOAT\",\"FLOAT\",\"TEXT\"],\"measurements\":[\"temperature\",\"humidity\",\"volume\",\"PM10\",\"pm25\",\"SO2\",\"NO2\",\"CO\",\"area\"],\"timestamps\":[1721301277657,1721301277657,1721301277657,1721301277657,1721301277657,1721301277657,1721301277657,1721301277657,1721301277657],\"values\":[[36.62,null,null,null,null,null,null,null,null],[null,78.38,null,null,null,null,null,null,null],[null,null,134.72,null,null,null,null,null,null],[null,null,null,203.57,null,null,null,null,null],[null,null,null,null,28.1,null,null,null,null],[null,null,null,null,null,16.15,null,null,null],[null,null,null,null,null,null,2.1,null,null],[null,null,null,null,null,null,null,29.68,null],[null,null,null,null,null,null,null,null,\"77\"]]}"
},
"client_ids": [
"mock_client_15"
],
"action_info": {
"type": "iotdb",
"name": "IoTDB"
}
},
"level": "debug"
}
```

response from restful api:
```json
{
"time": "2024-07-18T11:14:37.678849+00:00",
"msg": "action_failed",
"meta": {
"trace_tag": "ACTION",
"rule_trigger_ts": [
1721301277619
],
"rule_id": "rule_9f32_duplication",
"reason": {
"message": "An error occurred when executing getDeviceToStorageGroup():root is not a legal path",
"code": 507
},
"clientid": "mock_client_15",
"action_info": {
"type": "iotdb",
"name": "IoTDB"
}
},
"level": "debug"
}
```

Server logs
```
iotdb-service | org.apache.iotdb.db.exception.sql.StatementAnalyzeException: An error occurred when executing getDeviceToStorageGroup():root is not a legal path
iotdb-service | at org.apache.iotdb.db.queryengine.plan.analyze.cache.partition.PartitionCache.getStorageGroupCacheResult(PartitionCache.java:369)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.analyze.cache.partition.PartitionCache.getStorageGroupToDevice(PartitionCache.java:143)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.analyze.ClusterPartitionFetcher.getOrCreateSchemaPartition(ClusterPartitionFetcher.java:134)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.analyze.AnalyzeVisitor.visitInternalCreateTimeseries(AnalyzeVisitor.java:2422)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.analyze.AnalyzeVisitor.visitInternalCreateTimeseries(AnalyzeVisitor.java:198)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.statement.internal.InternalCreateTimeSeriesStatement.accept(InternalCreateTimeSeriesStatement.java:110)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor.process(StatementVisitor.java:135)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.analyze.Analyzer.analyze(Analyzer.java:47)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.planner.TreeModelPlanner.analyze(TreeModelPlanner.java:94)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.execution.QueryExecution.analyze(QueryExecution.java:253)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.execution.QueryExecution.(QueryExecution.java:121)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.Coordinator.createQueryExecutionForTreeModel(Coordinator.java:211)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.Coordinator.lambda$executeForTreeModel$0(Coordinator.java:175)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.Coordinator.execution(Coordinator.java:127)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.Coordinator.executeForTreeModel(Coordinator.java:170)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.analyze.schema.AutoCreateSchemaExecutor.executeStatement(AutoCreateSchemaExecutor.java:86)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.analyze.schema.AutoCreateSchemaExecutor.executeInternalCreateTimeseriesStatement(AutoCreateSchemaExecutor.java:508)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.analyze.schema.AutoCreateSchemaExecutor.internalCreateTimeSeries(AutoCreateSchemaExecutor.java:472)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.analyze.schema.AutoCreateSchemaExecutor.autoCreateTimeSeries(AutoCreateSchemaExecutor.java:130)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.analyze.schema.NormalSchemaFetcher.processNormalTimeSeries(NormalSchemaFetcher.java:179)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.analyze.schema.ClusterSchemaFetcher.fetchAndComputeSchemaWithAutoCreate(ClusterSchemaFetcher.java:177)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.analyze.schema.SchemaValidator.validate(SchemaValidator.java:48)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.analyze.AnalyzeVisitor.validateSchema(AnalyzeVisitor.java:2694)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.analyze.AnalyzeVisitor.visitInsertTablet(AnalyzeVisitor.java:2513)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.analyze.AnalyzeVisitor.visitInsertTablet(AnalyzeVisitor.java:198)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.statement.crud.InsertTabletStatement.accept(InsertTabletStatement.java:137)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor.process(StatementVisitor.java:135)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.analyze.Analyzer.analyze(Analyzer.java:47)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.planner.TreeModelPlanner.analyze(TreeModelPlanner.java:94)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.execution.QueryExecution.analyze(QueryExecution.java:253)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.execution.QueryExecution.(QueryExecution.java:121)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.Coordinator.createQueryExecutionForTreeModel(Coordinator.java:211)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.Coordinator.lambda$executeForTreeModel$0(Coordinator.java:175)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.Coordinator.execution(Coordinator.java:127)
iotdb-service | at org.apache.iotdb.db.queryengine.plan.Coordinator.executeForTreeModel(Coordinator.java:170)
iotdb-service | at org.apache.iotdb.db.protocol.rest.v2.impl.RestApiServiceImpl.insertTablet(RestApiServiceImpl.java:244)
iotdb-service | at org.apache.iotdb.db.protocol.rest.v2.RestApi.insertTablet(RestApi.java:115)
iotdb-service | at jdk.internal.reflect.GeneratedMethodAccessor14.invoke(Unknown Source)
iotdb-service | at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
iotdb-service | at java.base/java.lang.reflect.Method.invoke(Unknown Source)
iotdb-service | at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52)
iotdb-service | at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:146)
iotdb-service | at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:189)
iotdb-service | at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:176)
iotdb-service | at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:93)
iotdb-service | at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:478)
iotdb-service | at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:400)
iotdb-service | at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:81)
iotdb-service | at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:256)
iotdb-service | at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
iotdb-service | at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
iotdb-service | at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
iotdb-service | at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
iotdb-service | at org.glassfish.jersey.internal.Errors.process(Errors.java:244)
iotdb-service | at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)
iotdb-service | at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:235)
iotdb-service | at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:684)
iotdb-service | at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:394)
iotdb-service | at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)
iotdb-service | at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:358)
iotdb-service | at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:311)
iotdb-service | at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205)
iotdb-service | at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)
iotdb-service | at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1656)
iotdb-service | at org.apache.iotdb.db.protocol.rest.filter.ApiOriginFilter.doFilter(ApiOriginFilter.java:37)
iotdb-service | at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
iotdb-service | at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1626)
iotdb-service | at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:552)
iotdb-service | at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
iotdb-service | at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1440)
iotdb-service | at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
iotdb-service | at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:505)
iotdb-service | at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
iotdb-service | at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355)
iotdb-service | at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
iotdb-service | at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
iotdb-service | at org.eclipse.jetty.server.Server.handle(Server.java:516)
iotdb-service | at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487)
iotdb-service | at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732)
iotdb-service | at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479)
iotdb-service | at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
iotdb-service | at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
iotdb-service | at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
iotdb-service | at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
iotdb-service | at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
iotdb-service | at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
iotdb-service | at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
iotdb-service | at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
iotdb-service | at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
iotdb-service | at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
iotdb-service | at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
iotdb-service | at java.base/java.lang.Thread.run(Unknown Source)
```

### What did you expect to see?

Data inserted successfully

### What did you see instead?

An error happended: 2024-07-18 10:59:47,463 [qtp1038651236-54] WARN o.a.i.d.p.r.v.h.ExceptionHandler:84 - An error occurred when executing getDeviceToStorageGroup():root is not a legal path

### Anything else?

_No response_

### Are you willing to submit a PR?

- [ ] I'm willing to submit a PR!

Contributor guide

Open the contributing guide

Research direction

Reproduce the REST v2 insertTablet request from the issue, then trace the failure from RestApiServiceImpl.insertTablet through ClusterPartitionFetcher.getOrCreateSchemaPartition to PartitionCache.getStorageGroupCacheResult. Determine why the device path is rejected as illegal and verify that the same request completes without the getDeviceToStorageGroup error.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
api, databases
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.