IoTDB数据库集群环境写入数据时出现IndexOutOfBoundsException
IndexOutOfBoundsException when data is written in IoTDB database cluster environment
我在使用集群版本向IoTDB写入数据时,有时会在服务器日志中出现异常。所以我做了两个版本的测试。
发布v0.12,三节点三副本。我有20个存储组,100000个设备,每个设备有30个sensors.Write,一次连续写几分钟,然后停几分钟继续写。这是服务器日志中的异常信息。 ps。 IP的信息我删了:)
2021-08-10 13:23:02,335 [check-log-applier-Node(internalIp: x.x.x.x, metaPort:9003, nodeIdentifier:185043799, dataPort:40010, clientPort:6667, clientIp:0.0.0.0)] ERROR o.a.i.c.l.m.RaftLogManager:918 - Node(internalIp: x.x.x.x, metaPort:9003, nodeIdentifier:185043799, dataPort:40010, clientPort:6667, clientIp:0.0.0.0), an exception occurred when checking the applied log index
java.lang.IndexOutOfBoundsException: Index: 1965, Size: 1001
at java.util.ArrayList.rangeCheck(ArrayList.java:657)
at java.util.ArrayList.get(ArrayList.java:433)
at java.util.Collections$SynchronizedList.get(Collections.java:2417)
at org.apache.iotdb.cluster.log.manage.CommittedEntryManager.getEntry(CommittedEntryManager.java:188)
at org.apache.iotdb.cluster.log.manage.RaftLogManager.doCheckAppliedLogIndex(RaftLogManager.java:937)
at org.apache.iotdb.cluster.log.manage.RaftLogManager.checkAppliedLogIndex(RaftLogManager.java:916)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
实际出现问题是因为我们有两个异步线程,一个是定时删除内存中的raftLog防止内存溢出,另一个是提前applyIndex去申请状态机
其实我觉得是因为我们的RaftLogManager在concurreny上做的不好,会出一些异常日志,但是并没有很严重的副作用。详情可参考related docs。我们可能需要增强 `RaftLogManager' 以更好地处理并发。
我在使用集群版本向IoTDB写入数据时,有时会在服务器日志中出现异常。所以我做了两个版本的测试。
发布v0.12,三节点三副本。我有20个存储组,100000个设备,每个设备有30个sensors.Write,一次连续写几分钟,然后停几分钟继续写。这是服务器日志中的异常信息。 ps。 IP的信息我删了:)
2021-08-10 13:23:02,335 [check-log-applier-Node(internalIp: x.x.x.x, metaPort:9003, nodeIdentifier:185043799, dataPort:40010, clientPort:6667, clientIp:0.0.0.0)] ERROR o.a.i.c.l.m.RaftLogManager:918 - Node(internalIp: x.x.x.x, metaPort:9003, nodeIdentifier:185043799, dataPort:40010, clientPort:6667, clientIp:0.0.0.0), an exception occurred when checking the applied log index
java.lang.IndexOutOfBoundsException: Index: 1965, Size: 1001
at java.util.ArrayList.rangeCheck(ArrayList.java:657)
at java.util.ArrayList.get(ArrayList.java:433)
at java.util.Collections$SynchronizedList.get(Collections.java:2417)
at org.apache.iotdb.cluster.log.manage.CommittedEntryManager.getEntry(CommittedEntryManager.java:188)
at org.apache.iotdb.cluster.log.manage.RaftLogManager.doCheckAppliedLogIndex(RaftLogManager.java:937)
at org.apache.iotdb.cluster.log.manage.RaftLogManager.checkAppliedLogIndex(RaftLogManager.java:916)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
实际出现问题是因为我们有两个异步线程,一个是定时删除内存中的raftLog防止内存溢出,另一个是提前applyIndex去申请状态机
其实我觉得是因为我们的RaftLogManager在concurreny上做的不好,会出一些异常日志,但是并没有很严重的副作用。详情可参考related docs。我们可能需要增强 `RaftLogManager' 以更好地处理并发。