apache / apache/iotdb

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

オープン
#12,966 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
Java
スター
6.4k
フォーク
1.2k
平均マージ
1日 23時間
マージ済み PR(30日)
115

説明

### 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!

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

issue に記載された REST v2 insertTablet リクエストを再現し、その後、RestApiServiceImpl.insertTablet から ClusterPartitionFetcher.getOrCreateSchemaPartition を経て PartitionCache.getStorageGroupCacheResult に至るまで、失敗の発生箇所を追跡してください。デバイスパスが不正として拒否される理由を特定し、同じリクエストが getDeviceToStorageGroup エラーなしで完了することを確認してください。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
java
領域
api, databases
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
説明が足りない
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。