diff --git a/iotdb-client/session/src/main/java/org/apache/iotdb/session/SessionConnection.java b/iotdb-client/session/src/main/java/org/apache/iotdb/session/SessionConnection.java index 468b59abb0c23..65c7f55c41fd5 100644 --- a/iotdb-client/session/src/main/java/org/apache/iotdb/session/SessionConnection.java +++ b/iotdb-client/session/src/main/java/org/apache/iotdb/session/SessionConnection.java @@ -864,6 +864,9 @@ private TSStatus insertTabletsInternal(TSInsertTabletsReq request) throws TExcep protected void deleteTimeseries(List paths) throws IoTDBConnectionException, StatementExecutionException { + if (paths.isEmpty()) { + return; + } callWithRetryAndVerify(() -> client.deleteTimeseries(sessionId, paths)); } diff --git a/iotdb-client/session/src/main/java/org/apache/iotdb/session/pool/SessionPool.java b/iotdb-client/session/src/main/java/org/apache/iotdb/session/pool/SessionPool.java index 8136b2be68fd1..6a4107f5c0d07 100644 --- a/iotdb-client/session/src/main/java/org/apache/iotdb/session/pool/SessionPool.java +++ b/iotdb-client/session/src/main/java/org/apache/iotdb/session/pool/SessionPool.java @@ -2013,6 +2013,9 @@ public void deleteTimeseries(String path) @Override public void deleteTimeseries(List paths) throws IoTDBConnectionException, StatementExecutionException { + if (paths.isEmpty()) { + return; + } ISession session = getSession(); try { session.deleteTimeseries(paths); diff --git a/iotdb-client/session/src/test/java/org/apache/iotdb/session/SessionConnectionTest.java b/iotdb-client/session/src/test/java/org/apache/iotdb/session/SessionConnectionTest.java index a10d9b1d6f4da..fea78466a78b1 100644 --- a/iotdb-client/session/src/test/java/org/apache/iotdb/session/SessionConnectionTest.java +++ b/iotdb-client/session/src/test/java/org/apache/iotdb/session/SessionConnectionTest.java @@ -351,6 +351,14 @@ public void testInsertRecord() sessionConnection.deleteTimeseries(Arrays.asList("root.sg1.d1.s1")); } + @Test + public void testDeleteEmptyTimeseries() + throws IoTDBConnectionException, StatementExecutionException, TException { + sessionConnection.deleteTimeseries(Collections.emptyList()); + + Mockito.verify(client, Mockito.never()).deleteTimeseries(anyLong(), any()); + } + @Test public void testDeleteData() throws IoTDBConnectionException, StatementExecutionException { sessionConnection.deleteData(new TSDeleteDataReq()); diff --git a/iotdb-client/session/src/test/java/org/apache/iotdb/session/pool/SessionPoolTest.java b/iotdb-client/session/src/test/java/org/apache/iotdb/session/pool/SessionPoolTest.java index ce48172af2b87..d08625cb978c4 100644 --- a/iotdb-client/session/src/test/java/org/apache/iotdb/session/pool/SessionPoolTest.java +++ b/iotdb-client/session/src/test/java/org/apache/iotdb/session/pool/SessionPoolTest.java @@ -777,6 +777,17 @@ public void testDeleteTimeseriesList() ((ConcurrentLinkedDeque) Whitebox.getInternalState(sessionPool, "queue")).size()); } + @Test + public void testDeleteEmptyTimeseriesList() + throws IoTDBConnectionException, StatementExecutionException { + sessionPool.deleteTimeseries(Collections.emptyList()); + + Mockito.verify(session, Mockito.never()).deleteTimeseries(Mockito.>any()); + assertEquals( + 1, + ((ConcurrentLinkedDeque) Whitebox.getInternalState(sessionPool, "queue")).size()); + } + @Test public void testDeleteData() throws IoTDBConnectionException, StatementExecutionException { String path = "root.device1.temperature"; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java index 54ac31ce7f774..6b0350287fb4b 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java @@ -2026,6 +2026,9 @@ public TSStatus deleteTimeseries(long sessionId, List path) { return getNotLoggedInStatus(); } + if (path.isEmpty()) { + return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS); + } // Step 1: transfer from DeleteStorageGroupsReq to Statement DeleteTimeSeriesStatement statement = StatementGenerator.createDeleteTimeSeriesStatement(path);