This is an automated email from the ASF dual-hosted git repository.

justinchen pushed a commit to branch last-permission
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/last-permission by this push:
     new a56f2d5e721 fix
a56f2d5e721 is described below

commit a56f2d5e721035a3855656b028d9b4dade23db77
Author: Caideyipi <[email protected]>
AuthorDate: Mon Apr 13 16:30:48 2026 +0800

    fix
---
 .../rest/protocol/v2/impl/RestApiServiceImpl.java  | 19 ++++++----
 .../protocol/thrift/impl/ClientRPCServiceImpl.java | 43 ++++++++++++++--------
 2 files changed, 39 insertions(+), 23 deletions(-)

diff --git 
a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v2/impl/RestApiServiceImpl.java
 
b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v2/impl/RestApiServiceImpl.java
index f6c42533a62..08338c8dde4 100644
--- 
a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v2/impl/RestApiServiceImpl.java
+++ 
b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v2/impl/RestApiServiceImpl.java
@@ -133,20 +133,23 @@ public class RestApiServiceImpl extends RestApiService {
         }
         sensorNum += region.fillLastQueryMap(prefixPath, resultMap);
       }
+
+      final IClientSession clientSession = SESSION_MANAGER.getCurrSession();
+      final TSLastDataQueryReq tsLastDataQueryReq =
+          FastLastHandler.createTSLastDataQueryReq(clientSession, 
prefixPathList);
+      statement = StatementGenerator.createStatement(tsLastDataQueryReq);
+
+      final Response response = 
authorizationHandler.checkAuthority(securityContext, statement);
+      if (response != null) {
+        return response;
+      }
+
       // Check cache first
       if (!TableDeviceSchemaCache.getInstance().getLastCache(resultMap)) {
-        IClientSession clientSession = SESSION_MANAGER.getCurrSession();
-        TSLastDataQueryReq tsLastDataQueryReq =
-            FastLastHandler.createTSLastDataQueryReq(clientSession, 
prefixPathList);
-        statement = StatementGenerator.createStatement(tsLastDataQueryReq);
-
         if (ExecuteStatementHandler.validateStatement(statement)) {
           return 
FastLastHandler.buildErrorResponse(TSStatusCode.EXECUTE_STATEMENT_ERROR);
         }
 
-        
Optional.ofNullable(authorizationHandler.checkAuthority(securityContext, 
statement))
-            .ifPresent(Response.class::cast);
-
         queryId = SESSION_MANAGER.requestQueryId();
         SessionInfo sessionInfo = 
SESSION_MANAGER.getSessionInfo(clientSession);
 
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 ed754c418c6..875709d6f45 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
@@ -1199,7 +1199,20 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
         return executeLastDataQueryInternal(convert(req), SELECT_RESULT);
       }
 
-      // 2.2 all sensors hit cache, return response ~= 20ms
+      // 2.2 Check permission, the cost is rather low because the req only 
contains one prefix path
+      final Statement s = StatementGenerator.createStatement(convert(req));
+      final TSStatus status =
+          AuthorityChecker.checkAuthority(
+              s,
+              new TreeAccessCheckContext(
+                  clientSession.getUserId(),
+                  clientSession.getUsername(),
+                  clientSession.getClientAddress()));
+      if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+        return RpcUtils.getTSExecuteStatementResp(status);
+      }
+
+      // 2.3 all sensors hit cache, return response ~= 20ms
       final TsBlockBuilder builder = 
LastQueryUtil.createTsBlockBuilder(sensorNum);
 
       for (final Map.Entry<TableId, Map<IDeviceID, Map<String, 
Pair<TSDataType, TimeValuePair>>>>
@@ -1332,6 +1345,20 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
               .get(0)
               .mPPDataExchangeEndPoint;
 
+      // Place the permission check at first
+      final Statement s = StatementGenerator.createStatement(convert(req));
+      // permission check
+      final TSStatus status =
+          AuthorityChecker.checkAuthority(
+              s,
+              new TreeAccessCheckContext(
+                  clientSession.getUserId(),
+                  clientSession.getUsername(),
+                  clientSession.getClientAddress()));
+      if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+        return RpcUtils.getTSExecuteStatementResp(status);
+      }
+
       // the device's dataRegion's leader of the latest time partition is on 
current node, may can
       // read directly from cache
       if (isSameNode(lastRegionLeader)) {
@@ -1390,20 +1417,6 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
         }
       }
 
-      // cache miss
-      Statement s = StatementGenerator.createStatement(convert(req));
-      // permission check
-      TSStatus status =
-          AuthorityChecker.checkAuthority(
-              s,
-              new TreeAccessCheckContext(
-                  clientSession.getUserId(),
-                  clientSession.getUsername(),
-                  clientSession.getClientAddress()));
-      if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
-        return RpcUtils.getTSExecuteStatementResp(status);
-      }
-
       quota =
           DataNodeThrottleQuotaManager.getInstance()
               .checkQuota(SESSION_MANAGER.getCurrSession().getUsername(), s);

Reply via email to