Merge branch 'master' into add_keep_same_disk_when_loading_snapshot # Conflicts: # iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
diff --git a/.github/workflows/pipe-it.yml b/.github/workflows/pipe-it.yml index 154cebf..9c2899f 100644 --- a/.github/workflows/pipe-it.yml +++ b/.github/workflows/pipe-it.yml
@@ -890,3 +890,89 @@ name: cluster-log-dual-table-manual-enhanced-java${{ matrix.java }}-${{ runner.os }}-${{ matrix.cluster }}-${{ matrix.cluster }} path: integration-test/target/cluster-logs retention-days: 30 + triple: + strategy: + fail-fast: false + max-parallel: 1 + matrix: + java: [ 17 ] + cluster1: [ ScalableSingleNodeMode ] + cluster2: [ ScalableSingleNodeMode ] + cluster3: [ ScalableSingleNodeMode ] + os: [ ubuntu-latest ] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - name: Set up JDK ${{ matrix.java }} + uses: actions/setup-java@v4 + with: + distribution: oracle + java-version: ${{ matrix.java }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Cache Maven packages + uses: actions/cache@v4 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2- + - name: Sleep for a random duration between 0 and 10000 milliseconds + run: | + sleep $(( $(( RANDOM % 10000 + 1 )) / 1000)) + - name: IT Test + shell: bash + # we do not compile client-cpp for saving time, it is tested in client.yml + # we can skip influxdb-protocol because it has been tested separately in influxdb-protocol.yml + run: | + retry() { + local -i max_attempts=3 + local -i attempt=1 + local -i retry_sleep=5 + local test_output + + while [ $attempt -le $max_attempts ]; do + mvn clean verify \ + -P with-integration-tests \ + -DskipUTs \ + -DintegrationTest.forkCount=1 -DConfigNodeMaxHeapSize=256 -DDataNodeMaxHeapSize=1024 -DDataNodeMaxDirectMemorySize=768 \ + -DClusterConfigurations=${{ matrix.cluster1 }},${{ matrix.cluster2 }},${{ matrix.cluster3 }} \ + -pl integration-test \ + -am -PMultiClusterIT3 \ + -ntp >> ~/run-tests-$attempt.log && return 0 + test_output=$(cat ~/run-tests-$attempt.log) + + echo "==================== BEGIN: ~/run-tests-$attempt.log ====================" + echo "$test_output" + echo "==================== END: ~/run-tests-$attempt.log ======================" + + if ! mv ~/run-tests-$attempt.log integration-test/target/cluster-logs/ 2>/dev/null; then + echo "Failed to move log file ~/run-tests-$attempt.log to integration-test/target/cluster-logs/. Skipping..." + fi + + if echo "$test_output" | grep -q "Could not transfer artifact"; then + if [ $attempt -lt $max_attempts ]; then + echo "Test failed with artifact transfer issue, attempt $attempt. Retrying in $retry_sleep seconds..." + sleep $retry_sleep + attempt=$((attempt + 1)) + else + echo "Test failed after $max_attempts attempts due to artifact transfer issue." + echo "Treating this as a success because the issue is likely transient." + return 0 + fi + elif [ $? -ne 0 ]; then + echo "Test failed with a different error." + return 1 + else + echo "Tests passed" + return 0 + fi + done + } + retry + - name: Upload Artifact + if: failure() + uses: actions/upload-artifact@v4 + with: + name: cluster-log-triple-java${{ matrix.java }}-${{ runner.os }}-${{ matrix.cluster1 }}-${{ matrix.cluster2 }}-${{ matrix.cluster3 }} + path: integration-test/target/cluster-logs + retention-days: 30
diff --git a/integration-test/src/test/java/org/apache/iotdb/auth/it/IoTDBLoginLockManagerIT.java b/integration-test/src/test/java/org/apache/iotdb/auth/it/IoTDBLoginLockManagerIT.java index 1fc09e0..fa820d4 100644 --- a/integration-test/src/test/java/org/apache/iotdb/auth/it/IoTDBLoginLockManagerIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/auth/it/IoTDBLoginLockManagerIT.java
@@ -101,7 +101,9 @@ login("test", "wrong", new String[] {authFailedMsg}, 1); } // account was locked - login("test", "test", new String[] {authFailedMsg}, 1); + String lockedMsg = + "ErrorCan't execute sql because822: Account is blocked due to consecutive failed logins."; + login("test", "test", new String[] {lockedMsg}, 1); // unlock user-lock manual session.executeNonQueryStatement("ALTER USER test ACCOUNT UNLOCK"); login("test", "test", new String[] {loginSuccessMsg}, 1); @@ -111,7 +113,7 @@ login("test", "wrong", new String[] {authFailedMsg}, 1); } // account was locked - login("test", "test", new String[] {authFailedMsg}, 1); + login("test", "test", new String[] {lockedMsg}, 1); // unlock user-lock manual session.executeNonQueryStatement("ALTER USER test @ '127.0.0.1' ACCOUNT UNLOCK"); login("test", "test", new String[] {loginSuccessMsg}, 1);
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/audit/AuditLogSet.java b/integration-test/src/test/java/org/apache/iotdb/db/it/audit/AuditLogSet.java new file mode 100644 index 0000000..9fff64a --- /dev/null +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/audit/AuditLogSet.java
@@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.db.it.audit; + +import com.google.common.collect.HashMultiset; +import org.junit.Assert; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class AuditLogSet { + + private static final Logger LOGGER = LoggerFactory.getLogger(AuditLogSet.class); + + private final int logCnt; + private final HashMultiset<List<String>> auditLogSet; + + @SafeVarargs + public AuditLogSet(List<String>... auditLogs) { + logCnt = auditLogs.length; + auditLogSet = Stream.of(auditLogs).collect(Collectors.toCollection(HashMultiset::create)); + } + + public void containAuditLog(ResultSet resultSet, Set<Integer> indexForContain, int columnCnt) + throws SQLException { + LOGGER.info("==========================================================="); + for (List<String> auditLog : auditLogSet) { + LOGGER.info("Expected audit log: {}", auditLog); + } + for (int curLog = 0; curLog < logCnt; curLog++) { + resultSet.next(); + List<String> actualFields = new ArrayList<>(); + for (int i = 1; i <= columnCnt; i++) { + actualFields.add(resultSet.getString(i + 1)); + } + LOGGER.info("Actual audit log: {}", actualFields); + boolean match = false; + for (List<String> expectedFields : auditLogSet) { + match = true; + for (int i = 1; i <= columnCnt; i++) { + if (indexForContain.contains(i)) { + if (resultSet.getString(i + 1).contains(expectedFields.get(i - 1))) { + continue; + } else { + match = false; + break; + } + } + if (!expectedFields.get(i - 1).equals(resultSet.getString(i + 1))) { + match = false; + break; + } + } + if (match) { + auditLogSet.remove(expectedFields); + break; + } + } + Assert.assertTrue(match); + } + Assert.assertTrue(auditLogSet.isEmpty()); + } +}
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/audit/IoTDBAuditLogBasicIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/audit/IoTDBAuditLogBasicIT.java index 39a5146..f12dd4c 100644 --- a/integration-test/src/test/java/org/apache/iotdb/db/it/audit/IoTDBAuditLogBasicIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/audit/IoTDBAuditLogBasicIT.java
@@ -35,18 +35,16 @@ import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.StringJoiner; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -58,8 +56,9 @@ @Category({LocalStandaloneIT.class}) public class IoTDBAuditLogBasicIT { - private static final Logger LOGGER = LoggerFactory.getLogger(IoTDBAuditLogBasicIT.class); - private static final List<String> AUDIT_TABLE_COLUMNS = + public static final long ENSURE_AUDIT_LOG_SLEEP_IN_MS = 250; + + public static final List<String> AUDIT_TABLE_COLUMNS = Arrays.asList( AbstractAuditLogger.AUDIT_LOG_NODE_ID, AbstractAuditLogger.AUDIT_LOG_USER_ID, @@ -74,18 +73,18 @@ AbstractAuditLogger.AUDIT_LOG_SQL_STRING, AbstractAuditLogger.AUDIT_LOG_LOG); - private static final List<String> AUDIT_TABLE_DATA_TYPES = + public static final List<String> AUDIT_TABLE_DATA_TYPES = Arrays.asList( "STRING", "STRING", "STRING", "STRING", "STRING", "STRING", "STRING", "STRING", "BOOLEAN", "STRING", "STRING", "STRING"); - private static final List<String> AUDIT_TABLE_CATEGORIES = + public static final List<String> AUDIT_TABLE_CATEGORIES = Arrays.asList( "TAG", "TAG", "FIELD", "FIELD", "FIELD", "FIELD", "FIELD", "FIELD", "FIELD", "FIELD", "FIELD", "FIELD"); - private static final boolean ENABLE_AUDIT_LOG = true; - private static final String AUDITABLE_OPERATION_TYPE = + public static final boolean ENABLE_AUDIT_LOG = true; + public static final String AUDITABLE_OPERATION_TYPE = new StringJoiner(",") .add(AuditLogOperation.DDL.toString()) .add(AuditLogOperation.DML.toString()) @@ -93,9 +92,9 @@ .add(AuditLogOperation.CONTROL.toString()) .toString(); - private static final String AUDITABLE_OPERATION_LEVEL = PrivilegeLevel.GLOBAL.toString(); + public static final String AUDITABLE_OPERATION_LEVEL = PrivilegeLevel.GLOBAL.toString(); - private static final String AUDITABLE_OPERATION_RESULT = "SUCCESS,FAIL"; + public static final String AUDITABLE_OPERATION_RESULT = "SUCCESS,FAIL"; @Before public void setUp() throws SQLException, InterruptedException { @@ -115,14 +114,7 @@ ResultSet resultSet = statement.executeQuery("SHOW DATABASES root.__audit"); Assert.assertTrue(resultSet.next()); Assert.assertEquals("root.__audit", resultSet.getString(1)); - Thread.sleep(1000); - ((ClusterTestConnection) connection).writeConnection.close(); - Thread.sleep(1000); - for (NodeConnection conn : ((ClusterTestConnection) connection).readConnections) { - Thread.sleep(1000); - conn.close(); - Thread.sleep(1000); - } + closeConnectionCompletely(connection); connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); statement = connection.createStatement(); resultSet = statement.executeQuery("DESC __audit.audit_log"); @@ -135,14 +127,7 @@ cnt++; } Assert.assertEquals(AUDIT_TABLE_COLUMNS.size(), cnt); - Thread.sleep(1000); - ((ClusterTestConnection) connection).writeConnection.close(); - Thread.sleep(1000); - for (NodeConnection conn : ((ClusterTestConnection) connection).readConnections) { - Thread.sleep(1000); - conn.close(); - Thread.sleep(1000); - } + closeConnectionCompletely(connection); } @After @@ -150,1123 +135,2293 @@ EnvFactory.getEnv().cleanClusterEnvironment(); } - private static final List<String> TABLE_MODEL_AUDIT_SQLS = + public static void closeConnectionCompletely(Connection connection) throws InterruptedException { + // Ensure the session conns in test env are closed completely, + // in order to generate logout audit log + // TODO: Optimize this func after the close func of connection is optimized + TimeUnit.MILLISECONDS.sleep(ENSURE_AUDIT_LOG_SLEEP_IN_MS); + ((ClusterTestConnection) connection).writeConnection.close(); + TimeUnit.MILLISECONDS.sleep(ENSURE_AUDIT_LOG_SLEEP_IN_MS); + for (NodeConnection conn : ((ClusterTestConnection) connection).readConnections) { + TimeUnit.MILLISECONDS.sleep(ENSURE_AUDIT_LOG_SLEEP_IN_MS); + conn.close(); + TimeUnit.MILLISECONDS.sleep(ENSURE_AUDIT_LOG_SLEEP_IN_MS); + } + } + + private static final List<String> TABLE_MODEL_AUDIT_SQLS_USER_ROOT = Arrays.asList( "CREATE DATABASE test", - // "SHOW DATABASES", - "ALTER DATABASE test SET PROPERTIES TTL='INF'", "USE test", - "CREATE TABLE table1(t1 STRING TAG, a1 STRING ATTRIBUTE, s1 TEXT FIELD)", + // "SHOW CURRENT_DATABASE", + "SHOW DATABASES", + "ALTER DATABASE test SET PROPERTIES TTL='INF'", + "CREATE TABLE table1(t1 STRING TAG, a1 STRING ATTRIBUTE, s1 STRING FIELD)", "SHOW TABLES", "DESC table1", "ALTER TABLE table1 set properties TTL='INF'", - "CREATE USER user1 'IoTDB@2021abc'", - "CREATE role role1", - "GRANT SELECT, ALTER, INSERT, DELETE ON test.table1 TO ROLE role1", - "GRANT ROLE role1 TO user1", - "LIST USER", - "LIST ROLE", - "DROP ROLE role1", - "DROP USER user1", + "CREATE USER user1 'IoTDB@2025abc'", + "CREATE USER user2 'IoTDB@2025abc'", + "CREATE ROLE role1", + "GRANT SELECT,ALTER,INSERT,DELETE ON TEST.TABLE1 TO USER user1", + "GRANT SELECT ON ANY TO ROLE role1", + "GRANT ROLE role1 TO user2", + "list user", + "list role"); + private static final List<String> TABLE_MODEL_AUDIT_SQLS_USER_USER1 = + Arrays.asList( + "LIST PRIVILEGES OF USER user1", + "USE test", "INSERT INTO table1(time, t1, a1, s1) values(1, 't1', 'a1', 's1')", "SELECT * FROM table1", - "DELETE FROM table1", + "UPDATE table1 SET a1 = t1", + "DELETE FROM table1"); + private static final List<String> TABLE_MODEL_AUDIT_SQLS_USER_USER2 = + Arrays.asList( + "LIST PRIVILEGES OF USER user2", + "LIST PRIVILEGES OF ROLE role1", + "list user", + "list role", + "USE test", + "INSERT INTO table1(time, t1, a1, s1) values(1, 't1', 'a1', 's1')", + "SELECT * FROM table1", + "UPDATE table1 SET a1 = t1", + "DELETE FROM table1"); + private static final List<String> TABLE_MODEL_AUDIT_SQLS_USER_ROOT_FINAL = + Arrays.asList( + "USE test", "DROP TABLE table1", - "DROP DATABASE IF EXISTS test"); - private static final List<List<String>> TABLE_MODEL_AUDIT_FIELDS = + "DROP DATABASE IF EXISTS test", + "REVOKE SELECT,ALTER,INSERT,DELETE ON TEST.TABLE1 FROM USER user1", + "REVOKE SELECT ON ANY FROM ROLE role1", + "DROP USER user1", + "DROP USER user2", + "DROP ROLE role1"); + private static final List<AuditLogSet> TABLE_MODEL_AUDIT_FIELDS = Arrays.asList( // Start audit service - Arrays.asList( - "node_1", - "u_none", - "null", - "null", - "CHANGE_AUDIT_OPTION", - "CONTROL", - "[AUDIT]", - "GLOBAL", - "true", - "null", - "null", - "Successfully start the Audit service with configurations (auditableOperationType [DDL, DML, QUERY, CONTROL], auditableOperationLevel GLOBAL, auditableOperationResult SUCCESS,FAIL)"), - + new AuditLogSet( + Arrays.asList( + "node_1", + "u_none", + "null", + "null", + "CHANGE_AUDIT_OPTION", + "CONTROL", + "[AUDIT]", + "GLOBAL", + "true", + "null", + "null", + "Successfully start the Audit service with configurations (auditableOperationType [DDL, DML, QUERY, CONTROL], auditableOperationLevel GLOBAL, auditableOperationResult SUCCESS,FAIL)")), // Environment init login/logout - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "LOGIN", - "CONTROL", - "null", - "GLOBAL", - "true", - "", - "", - "IoTDB: Login status: Login successfully. User root (ID=0), opens Session"), - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "LOGOUT", - "CONTROL", - "null", - "GLOBAL", - "true", - "", - "", - "is closing"), - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "LOGIN", - "CONTROL", - "null", - "GLOBAL", - "true", - "", - "", - "IoTDB: Login status: Login successfully. User root (ID=0), opens Session"), - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "LOGIN", - "CONTROL", - "null", - "GLOBAL", - "true", - "", - "", - "IoTDB: Login status: Login successfully. User root (ID=0), opens Session"), - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "QUERY", - "[MANAGE_DATABASE]", - "OBJECT", - "true", - "[root.__audit]", - "SHOW DATABASES root.__audit", - "User root (ID=0) requests authority on object root.__audit with result true"), - // Setup logout through tree model dialect, twice for both read and write connections - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "LOGOUT", - "CONTROL", - "null", - "GLOBAL", - "true", - "", - "", - "is closing"), - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "LOGOUT", - "CONTROL", - "null", - "GLOBAL", - "true", - "", - "", - "is closing"), - // Setup login through table model dialect, twice for both read and write connections - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "LOGIN", - "CONTROL", - "null", - "GLOBAL", - "true", - "", - "", - "IoTDB: Login status: Login successfully. User root (ID=0), opens Session"), - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "LOGIN", - "CONTROL", - "null", - "GLOBAL", - "true", - "", - "", - "IoTDB: Login status: Login successfully. User root (ID=0), opens Session"), - // Desc audit table - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "QUERY", - "[READ_SCHEMA]", - "OBJECT", - "true", - "__audit", - "DESC __audit.audit_log", - "User root (ID=0) requests authority on object audit_log with result true"), - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "LOGOUT", - "CONTROL", - "null", - "GLOBAL", - "true", - "", - "", - "is closing"), - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "LOGOUT", - "CONTROL", - "null", - "GLOBAL", - "true", - "", - "", - "is closing"), - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "LOGIN", - "CONTROL", - "null", - "GLOBAL", - "true", - "", - "", - "IoTDB: Login status: Login successfully. User root (ID=0), opens Session"), - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "LOGIN", - "CONTROL", - "null", - "GLOBAL", - "true", - "", - "", - "IoTDB: Login status: Login successfully. User root (ID=0), opens Session"), + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "LOGIN", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "LOGOUT", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "is closing")), + // Show audit log database + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "LOGIN", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "LOGIN", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[SYSTEM]", + "GLOBAL", + "true", + "[root.__audit]", + "SHOW DATABASES root.__audit", + "User root (ID=0) requests authority on object [root.__audit] with result true"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "LOGOUT", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "is closing"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "LOGOUT", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "is closing")), + // Desc audit log table view + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "LOGIN", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "LOGIN", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[READ_SCHEMA]", + "OBJECT", + "true", + "__audit", + "DESC __audit.audit_log", + "User root (ID=0) requests authority on object audit_log with result true"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "LOGOUT", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "is closing"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "LOGOUT", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "is closing")), + // =============================Audit user root============================= + // Root login, twice for both read and write connections + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "LOGIN", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "LOGIN", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session")), // Create database - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "DDL", - "[CREATE]", - "OBJECT", - "true", - "test", - "CREATE DATABASE test", - "User root (ID=0) requests authority on object test with result true"), - // Show database TODO: Enable only when the order of show databases authentication fixed - // Arrays.asList( - // "node_1", - // "u_0", - // "root", - // "127.0.0.1", - // "OBJECT_AUTHENTICATION", - // "QUERY", - // "[READ_SCHEMA]", - // "OBJECT", - // "true", - // "test", - // "SHOW DATABASES", - // "User root (ID=0) requests authority on object test with result true"), - // Arrays.asList( - // "node_1", - // "u_0", - // "root", - // "127.0.0.1", - // "OBJECT_AUTHENTICATION", - // "QUERY", - // "[READ_SCHEMA]", - // "OBJECT", - // "true", - // "information_schema", - // "SHOW DATABASES", - // "User root (ID=0) requests authority on object information_schema with - // result true"), - // Arrays.asList( - // "node_1", - // "u_0", - // "root", - // "127.0.0.1", - // "OBJECT_AUTHENTICATION", - // "QUERY", - // "[READ_SCHEMA]", - // "OBJECT", - // "true", - // "__audit", - // "SHOW DATABASES", - // "User root (ID=0) requests authority on object test with result true"), - // Alter database - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "DDL", - "[ALTER]", - "OBJECT", - "true", - "test", - "ALTER DATABASE test SET PROPERTIES TTL='INF'", - "User root (ID=0) requests authority on object test with result true"), + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DDL", + "[CREATE]", + "OBJECT", + "true", + "test", + "CREATE DATABASE test", + "User root (ID=0) requests authority on object test with result true")), // Use database, twice for both read and write connections - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "QUERY", - "[READ_SCHEMA]", - "OBJECT", - "true", - "test", - "USE test", - "User root (ID=0) requests authority on object test with result true"), - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "QUERY", - "[READ_SCHEMA]", - "OBJECT", - "true", - "test", - "USE test", - "User root (ID=0) requests authority on object test with result true"), + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[READ_SCHEMA]", + "OBJECT", + "true", + "test", + "USE test", + "User root (ID=0) requests authority on object test with result true"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[READ_SCHEMA]", + "OBJECT", + "true", + "test", + "USE test", + "User root (ID=0) requests authority on object test with result true")), + // Show database + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[READ_SCHEMA]", + "OBJECT", + "true", + "test", + "SHOW DATABASES", + "User root (ID=0) requests authority on object test with result true"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[READ_SCHEMA]", + "OBJECT", + "true", + "information_schema", + "SHOW DATABASES", + "User root (ID=0) requests authority on object information_schema with result true"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[READ_SCHEMA]", + "OBJECT", + "true", + "__audit", + "SHOW DATABASES", + "User root (ID=0) requests authority on object __audit with result true")), + // Alter database + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DDL", + "[ALTER]", + "OBJECT", + "true", + "test", + "ALTER DATABASE test SET PROPERTIES TTL='INF'", + "User root (ID=0) requests authority on object test with result true")), // Create table - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "DDL", - "[CREATE]", - "OBJECT", - "true", - "test", - "CREATE TABLE table1(t1 STRING TAG, a1 STRING ATTRIBUTE, s1 TEXT FIELD)", - "User root (ID=0) requests authority on object table1 with result true"), + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DDL", + "[CREATE]", + "OBJECT", + "true", + "test", + "CREATE TABLE table1(t1 STRING TAG, a1 STRING ATTRIBUTE, s1 STRING FIELD)", + "User root (ID=0) requests authority on object table1 with result true")), // Show table - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "QUERY", - "[READ_SCHEMA]", - "OBJECT", - "true", - "test", - "SHOW TABLES", - "User root (ID=0) requests authority on object table1 with result true"), + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[READ_SCHEMA]", + "OBJECT", + "true", + "test", + "SHOW TABLES", + "User root (ID=0) requests authority on object table1 with result true")), // Desc table - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "QUERY", - "[READ_SCHEMA]", - "OBJECT", - "true", - "test", - "DESC table1", - "User root (ID=0) requests authority on object table1 with result true"), + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[READ_SCHEMA]", + "OBJECT", + "true", + "test", + "DESC table1", + "User root (ID=0) requests authority on object table1 with result true")), // Create user - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "DDL", - "[SECURITY]", - "GLOBAL", - "true", - "null", - "CREATE USER user1 ...", - "User root (ID=0) requests authority on object user1 with result true"), + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DDL", + "[SECURITY]", + "GLOBAL", + "true", + "null", + "CREATE USER user1 ...", + "User root (ID=0) requests authority on object user1 with result true"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DDL", + "[SECURITY]", + "GLOBAL", + "true", + "null", + "CREATE USER user2 ...", + "User root (ID=0) requests authority on object user2 with result true")), // Create role - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "DDL", - "[SECURITY]", - "GLOBAL", - "true", - "null", - "CREATE role role1", - "User root (ID=0) requests authority on object role1 with result true"), - // Grant privileges to role - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "DDL", - "[SECURITY]", - "GLOBAL", - "true", - "test", - "GRANT SELECT, ALTER, INSERT, DELETE ON test.table1 TO ROLE role1", - "User root (ID=0) requests authority on object role1 with result true"), - // Grant role to user - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "DDL", - "[SECURITY]", - "GLOBAL", - "true", - "null", - "GRANT ROLE role1 TO user1", - "User root (ID=0) requests authority on object user: user1, role: role1 with result true"), - // List user TODO: whether to include user object? - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "QUERY", - "[SECURITY]", - "GLOBAL", - "true", - "null", - "LIST USER", - "User root (ID=0) requests authority on object null with result true"), - // List role TODO: whether to include role object? - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "QUERY", - "[SECURITY]", - "GLOBAL", - "true", - "null", - "LIST ROLE", - "User root (ID=0) requests authority on object null with result true"), - // Drop role - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "DDL", - "[SECURITY]", - "GLOBAL", - "true", - "null", - "DROP ROLE role1", - "User root (ID=0) requests authority on object role1 with result true"), - // Drop user - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "DDL", - "[SECURITY]", - "GLOBAL", - "true", - "null", - "DROP USER user1", - "User root (ID=0) requests authority on object user1 with result true"), + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DDL", + "[SECURITY]", + "GLOBAL", + "true", + "null", + "CREATE ROLE role1", + "User root (ID=0) requests authority on object role1 with result true")), + // Grant privileges: pri->user, pri->role, role->user + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DDL", + "[SECURITY]", + "GLOBAL", + "true", + "test", + "GRANT SELECT,ALTER,INSERT,DELETE ON TEST.TABLE1 TO USER user1", + "User root (ID=0) requests authority on object user1 with result true"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DDL", + "[SECURITY]", + "GLOBAL", + "true", + "null", + "GRANT SELECT ON ANY TO ROLE role1", + "User root (ID=0) requests authority on object role1 with result true"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DDL", + "[SECURITY]", + "GLOBAL", + "true", + "null", + "GRANT ROLE role1 TO user2", + "User root (ID=0) requests authority on object user: user2, role: role1 with result true")), + // List user/role, the authentication object is null since the root can list all + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[SECURITY]", + "GLOBAL", + "true", + "null", + "list user", + "User root (ID=0) requests authority on object null with result true"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[SECURITY]", + "GLOBAL", + "true", + "null", + "list role", + "User root (ID=0) requests authority on object null with result true")), + // Root logout, twice for both read and write connections + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "LOGOUT", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "is closing"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "LOGOUT", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "is closing")), + // =============================Audit user user1============================= + // User1 login, twice for both read and write connections + new AuditLogSet( + Arrays.asList( + "node_1", + "u_10000", + "user1", + "127.0.0.1", + "LOGIN", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "IoTDB: Login status: Login successfully. User user1 (ID=10000), opens Session"), + Arrays.asList( + "node_1", + "u_10000", + "user1", + "127.0.0.1", + "LOGIN", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "IoTDB: Login status: Login successfully. User user1 (ID=10000), opens Session")), + // List privileges of user1 + new AuditLogSet( + Arrays.asList( + "node_1", + "u_10000", + "user1", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "null", + "GLOBAL", + "true", + "null", + "LIST PRIVILEGES OF USER user1", + "User user1 (ID=10000) requests authority on object user1 with result true")), + // Use database, twice for both read and write connections + new AuditLogSet( + Arrays.asList( + "node_1", + "u_10000", + "user1", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[READ_SCHEMA]", + "OBJECT", + "true", + "test", + "USE test", + "User user1 (ID=10000) requests authority on object test with result true"), + Arrays.asList( + "node_1", + "u_10000", + "user1", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[READ_SCHEMA]", + "OBJECT", + "true", + "test", + "USE test", + "User user1 (ID=10000) requests authority on object test with result true")), // Insert into table - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "DML", - "[INSERT]", - "OBJECT", - "true", - "test", - "INSERT INTO table1(time, t1, a1, s1) values(...)", - "User root (ID=0) requests authority on object table1 with result true"), + new AuditLogSet( + Arrays.asList( + "node_1", + "u_10000", + "user1", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DML", + "[INSERT]", + "OBJECT", + "true", + "test", + "INSERT INTO table1(time, t1, a1, s1) values(...)", + "User user1 (ID=10000) requests authority on object table1 with result true")), // Select from table, including fetch device - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "QUERY", - "[SELECT]", - "OBJECT", - "true", - "test", - "SELECT * FROM table1", - "User root (ID=0) requests authority on object table1 with result true"), - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "QUERY", - "[SELECT]", - "OBJECT", - "true", - "test", - "fetch device for query", - "User root (ID=0) requests authority on object table1 with result true"), - // Delete table - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "DML", - "[DELETE]", - "OBJECT", - "true", - "test", - "DELETE FROM table1", - "User root (ID=0) requests authority on object table1 with result true"), + new AuditLogSet( + Arrays.asList( + "node_1", + "u_10000", + "user1", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[SELECT]", + "OBJECT", + "true", + "test", + "SELECT * FROM table1", + "User user1 (ID=10000) requests authority on object table1 with result true"), + Arrays.asList( + "node_1", + "u_10000", + "user1", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[SELECT]", + "OBJECT", + "true", + "test", + "fetch device for query", + "User user1 (ID=10000) requests authority on object table1 with result true")), + // Update table + new AuditLogSet( + Arrays.asList( + "node_1", + "u_10000", + "user1", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DML", + "[INSERT]", + "OBJECT", + "true", + "test", + "UPDATE table1 SET a1 = t1", + "User user1 (ID=10000) requests authority on object table1 with result true")), + // Delete from table + new AuditLogSet( + Arrays.asList( + "node_1", + "u_10000", + "user1", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DML", + "[DELETE]", + "OBJECT", + "true", + "test", + "DELETE FROM table1", + "User user1 (ID=10000) requests authority on object table1 with result true")), + // User1 logout, twice for both read and write connections + new AuditLogSet( + Arrays.asList( + "node_1", + "u_10000", + "user1", + "127.0.0.1", + "LOGOUT", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "is closing"), + Arrays.asList( + "node_1", + "u_10000", + "user1", + "127.0.0.1", + "LOGOUT", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "is closing")), + // =============================Audit user user2============================= + // User2 login, twice for both read and write connections + new AuditLogSet( + Arrays.asList( + "node_1", + "u_10001", + "user2", + "127.0.0.1", + "LOGIN", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "IoTDB: Login status: Login successfully. User user2 (ID=10001), opens Session"), + Arrays.asList( + "node_1", + "u_10001", + "user2", + "127.0.0.1", + "LOGIN", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "IoTDB: Login status: Login successfully. User user2 (ID=10001), opens Session")), + // List privileges of user2, role1 + new AuditLogSet( + Arrays.asList( + "node_1", + "u_10001", + "user2", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "null", + "GLOBAL", + "true", + "null", + "LIST PRIVILEGES OF USER user2", + "User user2 (ID=10001) requests authority on object user2 with result true"), + Arrays.asList( + "node_1", + "u_10001", + "user2", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "null", + "GLOBAL", + "true", + "null", + "LIST PRIVILEGES OF ROLE role1", + "User user2 (ID=10001) requests authority on object role1 with result true")), + // List user and role, only him/herself + new AuditLogSet( + Arrays.asList( + "node_1", + "u_10001", + "user2", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "null", + "GLOBAL", + "true", + "null", + "list user", + "User user2 (ID=10001) requests authority on object user2 with result true"), + Arrays.asList( + "node_1", + "u_10001", + "user2", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "null", + "GLOBAL", + "true", + "null", + "list role", + "User user2 (ID=10001) requests authority on object null with result true")), + // Use database, twice for both read and write connections + new AuditLogSet( + Arrays.asList( + "node_1", + "u_10001", + "user2", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[READ_SCHEMA]", + "OBJECT", + "true", + "test", + "USE test", + "User user2 (ID=10001) requests authority on object test with result true"), + Arrays.asList( + "node_1", + "u_10001", + "user2", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[READ_SCHEMA]", + "OBJECT", + "true", + "test", + "USE test", + "User user2 (ID=10001) requests authority on object test with result true")), + // Failed to insert since no privilege + new AuditLogSet( + Arrays.asList( + "node_1", + "u_10001", + "user2", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DML", + "[INSERT]", + "OBJECT", + "false", + "test", + "INSERT INTO table1(time, t1, a1, s1) values(...)", + "User user2 (ID=10001) requests authority on object table1 with result false")), + // Select from table1, including fetch device + new AuditLogSet( + Arrays.asList( + "node_1", + "u_10001", + "user2", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[SELECT]", + "OBJECT", + "true", + "test", + "SELECT * FROM table1", + "User user2 (ID=10001) requests authority on object table1 with result true"), + Arrays.asList( + "node_1", + "u_10001", + "user2", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[SELECT]", + "OBJECT", + "true", + "test", + "fetch device for query", + "User user2 (ID=10001) requests authority on object table1 with result true")), + // Update table + new AuditLogSet( + Arrays.asList( + "node_1", + "u_10001", + "user2", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DML", + "[INSERT]", + "OBJECT", + "false", + "test", + "UPDATE table1 SET a1 = t1", + "User user2 (ID=10001) requests authority on object table1 with result false")), + // Delete from table + new AuditLogSet( + Arrays.asList( + "node_1", + "u_10001", + "user2", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DML", + "[DELETE]", + "OBJECT", + "false", + "test", + "DELETE FROM table1", + "User user2 (ID=10001) requests authority on object table1 with result false")), + // User2 logout, twice for both read and write connections + new AuditLogSet( + Arrays.asList( + "node_1", + "u_10001", + "user2", + "127.0.0.1", + "LOGOUT", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "is closing"), + Arrays.asList( + "node_1", + "u_10001", + "user2", + "127.0.0.1", + "LOGOUT", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "is closing")), + // =============================Audit user root============================= + // Root login, twice for both read and write connections + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "LOGIN", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "LOGIN", + "CONTROL", + "null", + "GLOBAL", + "true", + "", + "", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session")), + // Use database, twice for both read and write connections + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[READ_SCHEMA]", + "OBJECT", + "true", + "test", + "USE test", + "User root (ID=0) requests authority on object test with result true"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[READ_SCHEMA]", + "OBJECT", + "true", + "test", + "USE test", + "User root (ID=0) requests authority on object test with result true")), // Drop table - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "DDL", - "[DROP]", - "OBJECT", - "true", - "test", - "DROP TABLE table1", - "User root (ID=0) requests authority on object table1 with result true"), + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DDL", + "[DROP]", + "OBJECT", + "true", + "test", + "DROP TABLE table1", + "User root (ID=0) requests authority on object table1 with result true")), // Drop database - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "DDL", - "[DROP]", - "OBJECT", - "true", - "test", - "DROP DATABASE IF EXISTS test", - "User root (ID=0) requests authority on object test with result true"), + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DDL", + "[DROP]", + "OBJECT", + "true", + "test", + "DROP DATABASE IF EXISTS test", + "User root (ID=0) requests authority on object test with result true")), + // Revoke user/role privilege + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DDL", + "[SECURITY]", + "GLOBAL", + "true", + "test", + "REVOKE SELECT,ALTER,INSERT,DELETE ON TEST.TABLE1 FROM USER user1", + "User root (ID=0) requests authority on object user1 with result true"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DDL", + "[SECURITY]", + "GLOBAL", + "true", + "null", + "REVOKE SELECT ON ANY FROM ROLE role1", + "User root (ID=0) requests authority on object role1 with result true")), + // Drop user, role + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DDL", + "[SECURITY]", + "GLOBAL", + "true", + "null", + "DROP USER user1", + "User root (ID=0) requests authority on object user1 with result true"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DDL", + "[SECURITY]", + "GLOBAL", + "true", + "null", + "DROP USER user2", + "User root (ID=0) requests authority on object user2 with result true"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "DDL", + "[SECURITY]", + "GLOBAL", + "true", + "null", + "DROP ROLE role1", + "User root (ID=0) requests authority on object role1 with result true")), // Select audit log - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "QUERY", - "[SELECT]", - "OBJECT", - "true", - "__audit", - "SELECT * FROM __audit.audit_log ORDER BY TIME", - "User root (ID=0) requests authority on object __audit with result true"), - Arrays.asList( - "node_1", - "u_0", - "root", - "127.0.0.1", - "OBJECT_AUTHENTICATION", - "QUERY", - "[SELECT]", - "OBJECT", - "true", - "__audit", - "fetch device for query", - "User root (ID=0) requests authority on object __audit with result true")); + new AuditLogSet( + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[SELECT]", + "OBJECT", + "true", + "__audit", + "SELECT * FROM __audit.audit_log ORDER BY TIME", + "User root (ID=0) requests authority on object __audit with result true"), + Arrays.asList( + "node_1", + "u_0", + "root", + "127.0.0.1", + "OBJECT_AUTHENTICATION", + "QUERY", + "[SELECT]", + "OBJECT", + "true", + "__audit", + "fetch device for query", + "User root (ID=0) requests authority on object __audit with result true"))); private static final Set<Integer> TABLE_INDEX_FOR_CONTAIN = Stream.of(11, 12).collect(Collectors.toSet()); @Test - public void basicAuditLogTestForTableModel() throws SQLException { - try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); - Statement statement = connection.createStatement()) { - for (String sql : TABLE_MODEL_AUDIT_SQLS) { - statement.execute(sql); - } - int count = 0; - ResultSet resultSet = statement.executeQuery("SELECT * FROM __audit.audit_log ORDER BY TIME"); - while (resultSet.next()) { - LOGGER.info("Expected audit log: {}", TABLE_MODEL_AUDIT_FIELDS.get(count)); - List<String> actualFields = new ArrayList<>(); - for (int i = 1; i <= 12; i++) { - actualFields.add(resultSet.getString(i + 1)); - } - LOGGER.info("Actual audit log: {}", actualFields); - List<String> expectedFields = TABLE_MODEL_AUDIT_FIELDS.get(count); - for (int i = 1; i <= 12; i++) { - if (TABLE_INDEX_FOR_CONTAIN.contains(i)) { - Assert.assertTrue(resultSet.getString(i + 1).contains(expectedFields.get(i - 1))); - continue; - } - Assert.assertEquals(expectedFields.get(i - 1), resultSet.getString(i + 1)); - } - - count++; - } - Assert.assertEquals(TABLE_MODEL_AUDIT_FIELDS.size(), count); + public void basicAuditLogTestForTableModel() throws SQLException, InterruptedException { + Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); + Statement statement = connection.createStatement(); + for (String sql : TABLE_MODEL_AUDIT_SQLS_USER_ROOT) { + statement.execute(sql); } + closeConnectionCompletely(connection); + connection = + EnvFactory.getEnv().getConnection("user1", "IoTDB@2025abc", BaseEnv.TABLE_SQL_DIALECT); + statement = connection.createStatement(); + for (String sql : TABLE_MODEL_AUDIT_SQLS_USER_USER1) { + statement.execute(sql); + } + closeConnectionCompletely(connection); + connection = + EnvFactory.getEnv().getConnection("user2", "IoTDB@2025abc", BaseEnv.TABLE_SQL_DIALECT); + statement = connection.createStatement(); + for (String sql : TABLE_MODEL_AUDIT_SQLS_USER_USER2) { + try { + statement.execute(sql); + } catch (SQLException e) { + // Ignore, only record audit log + } + } + closeConnectionCompletely(connection); + connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); + statement = connection.createStatement(); + for (String sql : TABLE_MODEL_AUDIT_SQLS_USER_ROOT_FINAL) { + statement.execute(sql); + } + ResultSet resultSet = statement.executeQuery("SELECT * FROM __audit.audit_log ORDER BY TIME"); + for (AuditLogSet expectedAuditLogSet : TABLE_MODEL_AUDIT_FIELDS) { + expectedAuditLogSet.containAuditLog(resultSet, TABLE_INDEX_FOR_CONTAIN, 12); + } + Assert.assertFalse(resultSet.next()); } - private static final List<String> TREE_MODEL_AUDIT_SQLS = + private static final List<String> TREE_MODEL_AUDIT_SQLS_USER_ROOT = Arrays.asList( "CREATE DATABASE root.test", - "CREATE TIMESERIES root.test.d1.s2 WITH DATATYPE=INT64", - "CREATE ALIGNED TIMESERIES root.test.d2(s1 BOOLEAN, s2 INT64)", - "ALTER TIMESERIES root.test.d2.s1 ADD TAGS tag3=v3, tag4=v4", - "CREATE USER user1 'IoTDB@2021abc'", - "CREATE role role1", - "GRANT READ_DATA, WRITE_DATA ON root.test TO ROLE role1", - "GRANT ROLE role1 TO user1", - "LIST USER", - "LIST ROLE", - "DROP ROLE role1", + "show databases", + "COUNT databases", + "set ttl to root.test.** INF", + "create timeseries root.test.d1.s1 with datatype=BOOLEAN", + "create timeseries root.test.d1.s2 with datatype=INT64", + "create timeseries root.test.d1.s3 with datatype=TEXT", + "CREATE ALIGNED TIMESERIES root.test.d2(s1 BOOLEAN, s2 INT64, s3 TEXT)", + "show timeseries", + "COUNT TIMESERIES root.test", + "ALTER timeseries root.test.d1.s1 ADD TAGS tag3=v3, tag4=v4", + "ALTER timeseries root.test.d2.s1 ADD TAGS tag3=v3, tag4=v4", + "CREATE USER user1 'IoTDB@2025abc'", + "CREATE USER user2 'IoTDB@2025abc'", + "CREATE ROLE role1", + "GRANT READ_DATA, WRITE_DATA ON root.test.** TO USER user1", + "GRANT READ ON root.test.** TO ROLE role1", + "GRANT ROLE role1 TO user2", + "list user", + "list role"); + private static final List<String> TREE_MODEL_AUDIT_SQLS_USER_USER1 = + Arrays.asList( + "LIST PRIVILEGES OF USER user1", + "insert into root.test.d1(timestamp,s1,s2,s3) values(1,true,1,'1')", + "insert into root.test.d2(timestamp,s1,s2,s3) aligned values(1,true,1,'1')", + "select * from root.test.d1 order by time", + "select * from root.test.d2 order by time", + "delete from root.test.d1.s3", + "delete from root.test.d2.s3"); + private static final List<String> TREE_MODEL_AUDIT_SQLS_USER_USER2 = + Arrays.asList( + "LIST PRIVILEGES OF USER user2", + "LIST PRIVILEGES OF ROLE role1", + "list user", + "list role", + "insert into root.test.d1(timestamp,s1,s2,s3) values(1,true,1,'1')", + "insert into root.test.d2(timestamp,s1,s2,s3) aligned values(1,true,1,'1')", + "select * from root.test.d1 order by time", + "select * from root.test.d2 order by time", + "delete from root.test.d1.s3", + "delete from root.test.d2.s3"); + private static final List<String> TREE_MODEL_AUDIT_SQLS_USER_ROOT_FINAL = + Arrays.asList( + "delete timeseries root.test.d1.s3", + "drop timeseries root.test.d1.*", + "REVOKE READ_DATA, WRITE_DATA ON root.test.** FROM USER user1", + "REVOKE READ ON root.test.** FROM ROLE role1", "DROP USER user1", - "INSERT INTO root.test.d1(timestamp,s2) VALUES(1,1)", - "INSERT INTO root.test.d2(timestamp,s1,s2) ALIGNED VALUES(1,true,1)", - "SELECT ** FROM root.test", - "DELETE FROM root.test.d2", - "DROP TIMESERIES root.test.d1.s2", - "set ttl to root.test.** 360000", + "DROP USER user2", + "DROP ROLE role1", "DELETE DATABASE root.test"); - private static final List<List<String>> TREE_MODEL_AUDIT_FIELDS = + private static final List<AuditLogSet> TREE_MODEL_AUDIT_FIELDS = Arrays.asList( // Start audit service - Arrays.asList( - "root.__audit.log.node_1.u_none", - "true", - "GLOBAL", - "[AUDIT]", - "null", - "CONTROL", - "Successfully start the Audit service with configurations (auditableOperationType [DDL, DML, QUERY, CONTROL], auditableOperationLevel GLOBAL, auditableOperationResult SUCCESS,FAIL)", - "null", - "CHANGE_AUDIT_OPTION", - "null", - "null"), - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "null", - "", - "CONTROL", - "IoTDB: Login status: Login successfully. User root (ID=0), opens Session", - "", - "LOGIN", - "127.0.0.1", - "root"), - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "null", - "", - "CONTROL", - "is closing", - "", - "LOGOUT", - "127.0.0.1", - "root"), - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "null", - "", - "CONTROL", - "IoTDB: Login status: Login successfully. User root (ID=0), opens Session", - "", - "LOGIN", - "127.0.0.1", - "root"), - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "null", - "", - "CONTROL", - "IoTDB: Login status: Login successfully. User root (ID=0), opens Session", - "", - "LOGIN", - "127.0.0.1", - "root"), - // Show audit database - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "OBJECT", - "[MANAGE_DATABASE]", - "[root.__audit]", - "QUERY", - "User root (ID=0) requests authority on object root.__audit with result true", - "SHOW DATABASES root.__audit", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "null", - "", - "CONTROL", - "is closing", - "", - "LOGOUT", - "127.0.0.1", - "root"), - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "null", - "", - "CONTROL", - "is closing", - "", - "LOGOUT", - "127.0.0.1", - "root"), - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "null", - "", - "CONTROL", - "IoTDB: Login status: Login successfully. User root (ID=0), opens Session", - "", - "LOGIN", - "127.0.0.1", - "root"), - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "null", - "", - "CONTROL", - "IoTDB: Login status: Login successfully. User root (ID=0), opens Session", - "", - "LOGIN", - "127.0.0.1", - "root"), - - // Desc audit table - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "OBJECT", - "[READ_SCHEMA]", - "__audit", - "QUERY", - "User root (ID=0) requests authority on object audit_log with result true", - "DESC __audit.audit_log", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "null", - "", - "CONTROL", - "is closing", - "", - "LOGOUT", - "127.0.0.1", - "root"), - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "null", - "", - "CONTROL", - "is closing", - "", - "LOGOUT", - "127.0.0.1", - "root"), - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "null", - "", - "CONTROL", - "IoTDB: Login status: Login successfully. User root (ID=0), opens Session", - "", - "LOGIN", - "127.0.0.1", - "root"), - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "null", - "", - "CONTROL", - "IoTDB: Login status: Login successfully. User root (ID=0), opens Session", - "", - "LOGIN", - "127.0.0.1", - "root"), + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_none", + "true", + "GLOBAL", + "[AUDIT]", + "null", + "CONTROL", + "Successfully start the Audit service with configurations (auditableOperationType [DDL, DML, QUERY, CONTROL], auditableOperationLevel GLOBAL, auditableOperationResult SUCCESS,FAIL)", + "null", + "CHANGE_AUDIT_OPTION", + "null", + "null")), + // Environment setup login/logout + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session", + "", + "LOGIN", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "is closing", + "", + "LOGOUT", + "127.0.0.1", + "root")), + // Show audit log database + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session", + "", + "LOGIN", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session", + "", + "LOGIN", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "[SYSTEM]", + "[root.__audit]", + "QUERY", + "User root (ID=0) requests authority on object [root.__audit] with result true", + "SHOW DATABASES root.__audit", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "is closing", + "", + "LOGOUT", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "is closing", + "", + "LOGOUT", + "127.0.0.1", + "root")), + // Desc audit log table view + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session", + "", + "LOGIN", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session", + "", + "LOGIN", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "OBJECT", + "[READ_SCHEMA]", + "__audit", + "QUERY", + "User root (ID=0) requests authority on object audit_log with result true", + "DESC __audit.audit_log", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "is closing", + "", + "LOGOUT", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "is closing", + "", + "LOGOUT", + "127.0.0.1", + "root")), + // =============================Audit user root============================= + // Root login, twice for both read and write connections + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session", + "", + "LOGIN", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session", + "", + "LOGIN", + "127.0.0.1", + "root")), // Create database - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "OBJECT", - "[MANAGE_DATABASE]", - "root.test", - "DDL", - "User root (ID=0) requests authority on object root.test with result true", - "CREATE DATABASE root.test", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "OBJECT", + "[MANAGE_DATABASE]", + "root.test", + "DDL", + "User root (ID=0) requests authority on object root.test with result true", + "CREATE DATABASE root.test", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root")), + // Show database + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "[SYSTEM]", + "[root.**]", + "QUERY", + "User root (ID=0) requests authority on object [root.**] with result true", + "show databases", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root")), + // Count database + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "[SYSTEM]", + "[root.**]", + "QUERY", + "User root (ID=0) requests authority on object [root.**] with result true", + "COUNT databases", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root")), + // Set TTL to database + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "[SYSTEM]", + "null", + "DDL", + "User root (ID=0) requests authority on object [root.test.**] with result true", + "set ttl to root.test.** INF", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root")), // Create (aligned) timeseries TODO: fill database if necessary, same as follows - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "OBJECT", - "[WRITE_SCHEMA]", - "null", - "DDL", - "User root (ID=0) requests authority on object [root.test.d1.s2] with result true", - "CREATE TIMESERIES root.test.d1.s2 WITH DATATYPE=INT64", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "OBJECT", - "[WRITE_SCHEMA]", - "null", - "DDL", - "User root (ID=0) requests authority on object [root.test.d2.s1, root.test.d2.s2] with result true", - "CREATE ALIGNED TIMESERIES root.test.d2(s1 BOOLEAN, s2 INT64)", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "OBJECT", + "[WRITE_SCHEMA]", + "null", + "DDL", + "User root (ID=0) requests authority on object [root.test.d1.s1] with result true", + "create timeseries root.test.d1.s1 with datatype=BOOLEAN", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "OBJECT", + "[WRITE_SCHEMA]", + "null", + "DDL", + "User root (ID=0) requests authority on object [root.test.d1.s2] with result true", + "create timeseries root.test.d1.s2 with datatype=INT64", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "OBJECT", + "[WRITE_SCHEMA]", + "null", + "DDL", + "User root (ID=0) requests authority on object [root.test.d1.s3] with result true", + "create timeseries root.test.d1.s3 with datatype=TEXT", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "OBJECT", + "[WRITE_SCHEMA]", + "null", + "DDL", + "User root (ID=0) requests authority on object [root.test.d2.s1, root.test.d2.s2, root.test.d2.s3] with result true", + "CREATE ALIGNED TIMESERIES root.test.d2(s1 BOOLEAN, s2 INT64, s3 TEXT)", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root")), + // Show timeseries + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "OBJECT", + "[READ_DATA, READ_SCHEMA]", + "null", + "QUERY", + "User root (ID=0) requests authority on object [root.**] with result true", + "show timeseries", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root")), + // Count timeseries + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "OBJECT", + "[READ_SCHEMA]", + "null", + "QUERY", + "User root (ID=0) requests authority on object [root.test] with result true", + "COUNT TIMESERIES root.test", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root")), // Alter timeseries - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "OBJECT", - "[WRITE_SCHEMA]", - "null", - "DDL", - "User root (ID=0) requests authority on object [root.test.d2.s1] with result true", - "ALTER TIMESERIES root.test.d2.s1 ADD TAGS tag3=v3, tag4=v4", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), - // Create user - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "[MANAGE_USER]", - "null", - "DDL", - "User root (ID=0) requests authority on object user1 with result true", - "CREATE USER user1 ...", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), - // Create role - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "[MANAGE_ROLE]", - "null", - "DDL", - "User root (ID=0) requests authority on object role1 with result true", - "CREATE role role1", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), - // Grant privileges to role - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "[SECURITY]", - "null", - "DDL", - "User root (ID=0) requests authority on object role1 with result true", - "GRANT READ_DATA, WRITE_DATA ON root.test TO ROLE role1", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), - // Grant role to user - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "[MANAGE_ROLE]", - "null", - "DDL", - "User root (ID=0) requests authority on object user: user1, role: role1 with result true", - "GRANT ROLE role1 TO user1", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), - // List user TODO: whether to include user object? - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "[MANAGE_USER]", - "null", - "QUERY", - "User root (ID=0) requests authority on object null with result true", - "LIST USER", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), - // List role TODO: whether to include role object? - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "[MANAGE_ROLE]", - "null", - "QUERY", - "User root (ID=0) requests authority on object null with result true", - "LIST ROLE", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), - // Drop role - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "[MANAGE_ROLE]", - "null", - "DDL", - "User root (ID=0) requests authority on object role1 with result true", - "DROP ROLE role1", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), - // Drop user - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "[MANAGE_USER]", - "null", - "DDL", - "User root (ID=0) requests authority on object user1 with result true", - "DROP USER user1", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "OBJECT", + "[WRITE_SCHEMA]", + "null", + "DDL", + "User root (ID=0) requests authority on object [root.test.d1.s1] with result true", + "ALTER timeseries root.test.d1.s1 ADD TAGS tag3=v3, tag4=v4", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "OBJECT", + "[WRITE_SCHEMA]", + "null", + "DDL", + "User root (ID=0) requests authority on object [root.test.d2.s1] with result true", + "ALTER timeseries root.test.d2.s1 ADD TAGS tag3=v3, tag4=v4", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root")), + // Create user/role + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "[MANAGE_USER]", + "null", + "DDL", + "User root (ID=0) requests authority on object user1 with result true", + "CREATE USER user1 ...", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "[MANAGE_USER]", + "null", + "DDL", + "User root (ID=0) requests authority on object user2 with result true", + "CREATE USER user2 ...", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "[MANAGE_ROLE]", + "null", + "DDL", + "User root (ID=0) requests authority on object role1 with result true", + "CREATE ROLE role1", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root")), + // Grant privileges: pri->user, pri->role, role->user + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "[SECURITY]", + "null", + "DDL", + "User root (ID=0) requests authority on object user1 with result true", + "GRANT READ_DATA, WRITE_DATA ON root.test.** TO USER user1", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "[SECURITY]", + "null", + "DDL", + "User root (ID=0) requests authority on object role1 with result true", + "GRANT READ ON root.test.** TO ROLE role1", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "[MANAGE_ROLE]", + "null", + "DDL", + "User root (ID=0) requests authority on object user: user2, role: role1 with result true", + "GRANT ROLE role1 TO user2", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root")), + // List user/role, the target object is null since the root can list all, + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "[MANAGE_USER]", + "null", + "QUERY", + "User root (ID=0) requests authority on object null with result true", + "list user", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "[MANAGE_ROLE]", + "null", + "QUERY", + "User root (ID=0) requests authority on object null with result true", + "list role", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root")), + // Root logout, twice for both read and write connections + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "is closing", + "", + "LOGOUT", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "is closing", + "", + "LOGOUT", + "127.0.0.1", + "root")), + // =============================Audit user user1============================= + // User1 login, twice for both read and write connections + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_10000", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "IoTDB: Login status: Login successfully. User user1 (ID=10000), opens Session", + "", + "LOGIN", + "127.0.0.1", + "user1"), + Arrays.asList( + "root.__audit.log.node_1.u_10000", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "IoTDB: Login status: Login successfully. User user1 (ID=10000), opens Session", + "", + "LOGIN", + "127.0.0.1", + "user1")), + // List privilege of user1 + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_10000", + "true", + "GLOBAL", + "null", + "null", + "QUERY", + "User user1 (ID=10000) requests authority on object user1 with result true", + "LIST PRIVILEGES OF USER user1", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user1")), // Insert into (aligned) timeseries - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "OBJECT", - "[WRITE_DATA]", - "null", - "DML", - "User root (ID=0) requests authority on object [root.test.d1.s2] with result true", - "INSERT INTO root.test.d1(timestamp,s2) VALUES(...)", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "OBJECT", - "[WRITE_DATA]", - "null", - "DML", - "User root (ID=0) requests authority on object [root.test.d2.s1, root.test.d2.s2] with result true", - "INSERT INTO root.test.d2(timestamp,s1,s2) ALIGNED VALUES(...)", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), - // Select all timeseries - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "OBJECT", - "[READ_DATA]", - "null", - "QUERY", - "User root (ID=0) requests authority on object [root.test.**] with result true", - "SELECT ** FROM root.test", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_10000", + "true", + "OBJECT", + "[WRITE_DATA]", + "null", + "DML", + "User user1 (ID=10000) requests authority on object [root.test.d1.s1, root.test.d1.s2, root.test.d1.s3] with result true", + "insert into root.test.d1(timestamp,s1,s2,s3) values(...)", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user1"), + Arrays.asList( + "root.__audit.log.node_1.u_10000", + "true", + "OBJECT", + "[WRITE_DATA]", + "null", + "DML", + "User user1 (ID=10000) requests authority on object [root.test.d2.s1, root.test.d2.s2, root.test.d2.s3] with result true", + "insert into root.test.d2(timestamp,s1,s2,s3) aligned values(...)", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user1")), + // Select timeseries data + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_10000", + "false", + "GLOBAL", + "[AUDIT]", + "null", + "QUERY", + "User user1 (ID=10000) requests authority on object root.__audit with result false", + "select * from root.test.d1 order by time", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user1"), + Arrays.asList( + "root.__audit.log.node_1.u_10000", + "true", + "OBJECT", + "[READ_DATA]", + "null", + "QUERY", + "User user1 (ID=10000) requests authority on object [root.test.d1.*] with result true", + "select * from root.test.d1 order by time", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user1"), + Arrays.asList( + "root.__audit.log.node_1.u_10000", + "false", + "GLOBAL", + "[AUDIT]", + "null", + "QUERY", + "User user1 (ID=10000) requests authority on object root.__audit with result false", + "select * from root.test.d2 order by time", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user1"), + Arrays.asList( + "root.__audit.log.node_1.u_10000", + "true", + "OBJECT", + "[READ_DATA]", + "null", + "QUERY", + "User user1 (ID=10000) requests authority on object [root.test.d2.*] with result true", + "select * from root.test.d2 order by time", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user1")), // Delete timeseries data - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "OBJECT", - "[WRITE_DATA]", - "null", - "DML", - "User root (ID=0) requests authority on object [root.test.d2] with result true", - "DELETE FROM root.test.d2", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_10000", + "true", + "OBJECT", + "[WRITE_DATA]", + "null", + "DML", + "User user1 (ID=10000) requests authority on object [root.test.d1.s3] with result true", + "delete from root.test.d1.s3", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user1"), + Arrays.asList( + "root.__audit.log.node_1.u_10000", + "true", + "OBJECT", + "[WRITE_DATA]", + "null", + "DML", + "User user1 (ID=10000) requests authority on object [root.test.d2.s3] with result true", + "delete from root.test.d2.s3", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user1")), + // user1 logout, twice for both read and write connections + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_10000", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "is closing", + "", + "LOGOUT", + "127.0.0.1", + "user1"), + Arrays.asList( + "root.__audit.log.node_1.u_10000", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "is closing", + "", + "LOGOUT", + "127.0.0.1", + "user1")), + // =============================Audit user user2============================= + // User2 login, twice for both read and write connections + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "IoTDB: Login status: Login successfully. User user2 (ID=10001), opens Session", + "", + "LOGIN", + "127.0.0.1", + "user2"), + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "IoTDB: Login status: Login successfully. User user2 (ID=10001), opens Session", + "", + "LOGIN", + "127.0.0.1", + "user2")), + // List privilege of user2/role1 + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "true", + "GLOBAL", + "null", + "null", + "QUERY", + "User user2 (ID=10001) requests authority on object user2 with result true", + "LIST PRIVILEGES OF USER user2", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user2"), + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "true", + "GLOBAL", + "null", + "null", + "QUERY", + "User user2 (ID=10001) requests authority on object user2 with result true", + "LIST PRIVILEGES OF ROLE role1", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user2")), + // List user/role, can only see him/herself + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "false", + "GLOBAL", + "[MANAGE_USER]", + "null", + "QUERY", + "User user2 (ID=10001) requests authority on object null with result false", + "list user", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user2"), + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "true", + "GLOBAL", + "[null]", + "null", + "QUERY", + "User user2 (ID=10001) requests authority on object user2 with result true", + "list user", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user2"), + // List role, can only see his/hers roles + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "false", + "GLOBAL", + "[MANAGE_ROLE]", + "null", + "QUERY", + "User user2 (ID=10001) requests authority on object null with result false", + "list role", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user2"), + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "true", + "GLOBAL", + "[null]", + "null", + "QUERY", + "User user2 (ID=10001) requests authority on object user2 with result true", + "list role", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user2")), + // Insert into (aligned) timeseries failed + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "false", + "OBJECT", + "[WRITE_DATA]", + "null", + "DML", + "User user2 (ID=10001) requests authority on object [root.test.d1.s1, root.test.d1.s2, root.test.d1.s3] with result false", + "insert into root.test.d1(timestamp,s1,s2,s3) values(...)", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user2"), + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "false", + "OBJECT", + "[WRITE_DATA]", + "null", + "DML", + "User user2 (ID=10001) requests authority on object [root.test.d2.s1, root.test.d2.s2, root.test.d2.s3] with result false", + "insert into root.test.d2(timestamp,s1,s2,s3) aligned values(...)", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user2")), + // Select timeseries data + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "false", + "GLOBAL", + "[AUDIT]", + "null", + "QUERY", + "User user2 (ID=10001) requests authority on object root.__audit with result false", + "select * from root.test.d1 order by time", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user2"), + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "true", + "OBJECT", + "[READ_DATA]", + "null", + "QUERY", + "User user2 (ID=10001) requests authority on object [root.test.d1.*] with result true", + "select * from root.test.d1 order by time", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user2"), + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "false", + "GLOBAL", + "[AUDIT]", + "null", + "QUERY", + "User user2 (ID=10001) requests authority on object root.__audit with result false", + "select * from root.test.d2 order by time", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user2"), + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "true", + "OBJECT", + "[READ_DATA]", + "null", + "QUERY", + "User user2 (ID=10001) requests authority on object [root.test.d2.*] with result true", + "select * from root.test.d2 order by time", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user2")), + // Delete timeseries data failed + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "false", + "OBJECT", + "[WRITE_DATA]", + "null", + "DML", + "User user2 (ID=10001) requests authority on object [root.test.d1.s3] with result false", + "delete from root.test.d1.s3", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user2"), + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "false", + "OBJECT", + "[WRITE_DATA]", + "null", + "DML", + "User user2 (ID=10001) requests authority on object [root.test.d2.s3] with result false", + "delete from root.test.d2.s3", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "user2")), + // user2 logout, twice for both read and write connections + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "is closing", + "", + "LOGOUT", + "127.0.0.1", + "user2"), + Arrays.asList( + "root.__audit.log.node_1.u_10001", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "is closing", + "", + "LOGOUT", + "127.0.0.1", + "user2")), + // =============================Audit user root final============================= + // root login, twice for both read and write connections + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session", + "", + "LOGIN", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "null", + "", + "CONTROL", + "IoTDB: Login status: Login successfully. User root (ID=0), opens Session", + "", + "LOGIN", + "127.0.0.1", + "root")), + // Delete timeseries data + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "OBJECT", + "[WRITE_SCHEMA]", + "null", + "DDL", + "User root (ID=0) requests authority on object [root.test.d1.s3] with result true", + "delete timeseries root.test.d1.s3", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root")), // Drop timeseries - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "OBJECT", - "[WRITE_SCHEMA]", - "null", - "DDL", - "User root (ID=0) requests authority on object [root.test.d1.s2] with result true", - "DROP TIMESERIES root.test.d1.s2", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), - // Set TTL to devices - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "GLOBAL", - "[SYSTEM]", - "null", - "DDL", - "User root (ID=0) requests authority on object [root.test.**] with result true", - "set ttl to root.test.** 360000", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "OBJECT", + "[WRITE_SCHEMA]", + "null", + "DDL", + "User root (ID=0) requests authority on object [root.test.d1.*] with result true", + "drop timeseries root.test.d1.*", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root")), + // Revoke privileges + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "[SECURITY]", + "null", + "DDL", + "User root (ID=0) requests authority on object user1 with result true", + "REVOKE READ_DATA, WRITE_DATA ON root.test.** FROM USER user1", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "[SECURITY]", + "null", + "DDL", + "User root (ID=0) requests authority on object role1 with result true", + "REVOKE READ ON root.test.** FROM ROLE role1", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root")), + // Drop user/role + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "[MANAGE_USER]", + "null", + "DDL", + "User root (ID=0) requests authority on object user1 with result true", + "DROP USER user1", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "[MANAGE_USER]", + "null", + "DDL", + "User root (ID=0) requests authority on object user2 with result true", + "DROP USER user2", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root"), + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "GLOBAL", + "[MANAGE_ROLE]", + "null", + "DDL", + "User root (ID=0) requests authority on object role1 with result true", + "DROP ROLE role1", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root")), // Delete database - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "OBJECT", - "[MANAGE_DATABASE]", - "[root.test]", - "DDL", - "User root (ID=0) requests authority on object [root.test] with result true", - "DELETE DATABASE root.test", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root"), + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "OBJECT", + "[MANAGE_DATABASE]", + "[root.test]", + "DDL", + "User root (ID=0) requests authority on object [root.test] with result true", + "DELETE DATABASE root.test", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root")), // Select audit log - Arrays.asList( - "root.__audit.log.node_1.u_0", - "true", - "OBJECT", - "[READ_DATA]", - "null", - "QUERY", - "User root (ID=0) requests authority on object [root.__audit.log.**.*] with result true", - "SELECT * FROM root.__audit.log.** ORDER BY TIME ALIGN BY DEVICE", - "OBJECT_AUTHENTICATION", - "127.0.0.1", - "root")); + new AuditLogSet( + Arrays.asList( + "root.__audit.log.node_1.u_0", + "true", + "OBJECT", + "[READ_DATA]", + "null", + "QUERY", + "User root (ID=0) requests authority on object [root.__audit.log.**.*] with result true", + "SELECT * FROM root.__audit.log.** ORDER BY TIME ALIGN BY DEVICE", + "OBJECT_AUTHENTICATION", + "127.0.0.1", + "root"))); private static final Set<Integer> TREE_INDEX_FOR_CONTAIN = Stream.of(7).collect(Collectors.toSet()); @Test - public void basicAuditLogTestForTreeModel() throws SQLException { - try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TREE_SQL_DIALECT); - Statement statement = connection.createStatement()) { - for (String sql : TREE_MODEL_AUDIT_SQLS) { - statement.execute(sql); - } - int count = 0; - ResultSet resultSet = - statement.executeQuery("SELECT * FROM root.__audit.log.** ORDER BY TIME ALIGN BY DEVICE"); - while (resultSet.next()) { - LOGGER.info("Expected audit log: {}", TREE_MODEL_AUDIT_FIELDS.get(count)); - List<String> actualFields = new ArrayList<>(); - for (int i = 1; i <= 11; i++) { - actualFields.add(resultSet.getString(i + 1)); - } - LOGGER.info("Actual audit log: {}", actualFields); - List<String> expectedFields = TREE_MODEL_AUDIT_FIELDS.get(count); - for (int i = 1; i <= 11; i++) { - if (TREE_INDEX_FOR_CONTAIN.contains(i)) { - Assert.assertTrue(resultSet.getString(i + 1).contains(expectedFields.get(i - 1))); - continue; - } - Assert.assertEquals(expectedFields.get(i - 1), resultSet.getString(i + 1)); - } - - count++; - } - Assert.assertEquals(TREE_MODEL_AUDIT_FIELDS.size(), count); + public void basicAuditLogTestForTreeModel() throws SQLException, InterruptedException { + Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TREE_SQL_DIALECT); + Statement statement = connection.createStatement(); + for (String sql : TREE_MODEL_AUDIT_SQLS_USER_ROOT) { + statement.execute(sql); } + closeConnectionCompletely(connection); + connection = + EnvFactory.getEnv().getConnection("user1", "IoTDB@2025abc", BaseEnv.TREE_SQL_DIALECT); + statement = connection.createStatement(); + for (String sql : TREE_MODEL_AUDIT_SQLS_USER_USER1) { + statement.execute(sql); + } + closeConnectionCompletely(connection); + connection = + EnvFactory.getEnv().getConnection("user2", "IoTDB@2025abc", BaseEnv.TREE_SQL_DIALECT); + statement = connection.createStatement(); + for (String sql : TREE_MODEL_AUDIT_SQLS_USER_USER2) { + try { + statement.execute(sql); + } catch (SQLException e) { + // Ignore, only record audit log + } + } + closeConnectionCompletely(connection); + connection = EnvFactory.getEnv().getConnection(BaseEnv.TREE_SQL_DIALECT); + statement = connection.createStatement(); + for (String sql : TREE_MODEL_AUDIT_SQLS_USER_ROOT_FINAL) { + statement.execute(sql); + } + ResultSet resultSet = + statement.executeQuery("SELECT * FROM root.__audit.log.** ORDER BY TIME ALIGN BY DEVICE"); + for (AuditLogSet expectedAuditLogSet : TREE_MODEL_AUDIT_FIELDS) { + expectedAuditLogSet.containAuditLog(resultSet, TREE_INDEX_FOR_CONTAIN, 11); + } + Assert.assertFalse(resultSet.next()); } }
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBAuthIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBAuthIT.java index 6b8746b..bef61a4 100644 --- a/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBAuthIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBAuthIT.java
@@ -20,6 +20,7 @@ package org.apache.iotdb.db.it.auth; import org.apache.iotdb.commons.auth.entity.PrivilegeType; +import org.apache.iotdb.commons.conf.CommonDescriptor; import org.apache.iotdb.commons.schema.column.ColumnHeaderConstant; import org.apache.iotdb.commons.utils.AuthUtils; import org.apache.iotdb.db.it.utils.TestUtils; @@ -1508,6 +1509,7 @@ public void testPasswordHistory() { try (Connection connection = EnvFactory.getEnv().getConnection(); Statement statement = connection.createStatement()) { + testPasswordHistoryEncrypted(statement); testPasswordHistoryCreateAndDrop(statement); testPasswordHistoryAlter(statement); } catch (SQLException e) { @@ -1516,6 +1518,18 @@ } } + public void testPasswordHistoryEncrypted(Statement statement) throws SQLException { + ResultSet resultSet = + statement.executeQuery("SELECT password,oldPassword from root.__audit.password_history._0"); + assertTrue(resultSet.next()); + assertEquals( + AuthUtils.encryptPassword(CommonDescriptor.getInstance().getConfig().getAdminPassword()), + resultSet.getString("root.__audit.password_history._0.password")); + assertEquals( + AuthUtils.encryptPassword(CommonDescriptor.getInstance().getConfig().getAdminPassword()), + resultSet.getString("root.__audit.password_history._0.oldPassword")); + } + public void testPasswordHistoryCreateAndDrop(Statement statement) throws SQLException { statement.execute("create user userA 'abcdef123456'");
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/udf/IoTDBUDFIntermediateBlockSerdeIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/udf/IoTDBUDFIntermediateBlockSerdeIT.java new file mode 100644 index 0000000..06464de --- /dev/null +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/udf/IoTDBUDFIntermediateBlockSerdeIT.java
@@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.db.it.udf; + +import org.apache.iotdb.it.env.EnvFactory; +import org.apache.iotdb.it.framework.IoTDBTestRunner; +import org.apache.iotdb.itbase.category.ClusterIT; +import org.apache.iotdb.itbase.category.LocalStandaloneIT; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.runner.RunWith; + +import static org.apache.iotdb.db.it.utils.TestUtils.prepareData; +import static org.apache.iotdb.db.it.utils.TestUtils.resultSetEqualWithDescOrderTest; +import static org.apache.iotdb.itbase.constant.TestConstant.TIMESTAMP_STR; + +@RunWith(IoTDBTestRunner.class) +@Category({LocalStandaloneIT.class, ClusterIT.class}) +public class IoTDBUDFIntermediateBlockSerdeIT { + private static final String[] SQLs = + new String[] { + "insert into root.sg.d1(time, s1) values (1,1)", + "insert into root.sg.d1(time, s1) values (2,2)", + "insert into root.sg.d1(time, s1) values (3,3)", + "insert into root.sg.d1(time, s1) values (4,4)", + "insert into root.sg.d1(time, s1) values (5,5)", + "insert into root.sg.d1(time, s1) values (6,6)" + }; + + @BeforeClass + public static void setUp() throws Exception { + EnvFactory.getEnv().getConfig().getCommonConfig().setUdfMemoryBudgetInMB(0.0001f); + EnvFactory.getEnv().initClusterEnvironment(); + prepareData(SQLs); + } + + @AfterClass + public static void tearDown() throws Exception { + EnvFactory.getEnv().cleanClusterEnvironment(); + } + + @Test + public void testM4() { + String[] expectedHeader = + new String[] { + TIMESTAMP_STR, "EQUAL_SIZE_BUCKET_M4_SAMPLE(root.sg.d1.s1, \"proportion\"=\"1\")" + }; + String[] retArray = new String[] {"1,1.0,", "2,2.0,", "3,3.0,", "4,4.0,", "5,5.0,", "6,6.0,"}; + resultSetEqualWithDescOrderTest( + "select EQUAL_SIZE_BUCKET_M4_SAMPLE(s1,'proportion'='1') from root.sg.d1", + expectedHeader, + retArray); + } +}
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/AbstractPipeTableModelDualManualIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/AbstractPipeTableModelDualManualIT.java index 55c0170..3b3fae8 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/AbstractPipeTableModelDualManualIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/AbstractPipeTableModelDualManualIT.java
@@ -42,7 +42,6 @@ } protected void setupConfig() { - // TODO: delete ratis configurations senderEnv .getConfig() .getCommonConfig()
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/basic/IoTDBPipePermissionIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/basic/IoTDBPipePermissionIT.java index 0922b98..958f9d4 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/basic/IoTDBPipePermissionIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/basic/IoTDBPipePermissionIT.java
@@ -61,7 +61,6 @@ senderEnv = MultiEnvFactory.getEnv(0); receiverEnv = MultiEnvFactory.getEnv(1); - // TODO: delete ratis configurations senderEnv .getConfig() .getCommonConfig()
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/basic/IoTDBPipeProtocolIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/basic/IoTDBPipeProtocolIT.java index d2c00c4..3fce11b 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/basic/IoTDBPipeProtocolIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/basic/IoTDBPipeProtocolIT.java
@@ -67,7 +67,6 @@ schemaRegionReplicationFactor = Math.min(schemaRegionReplicationFactor, dataNodesNum); dataRegionReplicationFactor = Math.min(dataRegionReplicationFactor, dataNodesNum); - // TODO: delete ratis configurations senderEnv .getConfig() .getCommonConfig()
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/basic/IoTDBPipeSourceIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/basic/IoTDBPipeSourceIT.java index b9aee65..022d71d 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/basic/IoTDBPipeSourceIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/basic/IoTDBPipeSourceIT.java
@@ -61,7 +61,6 @@ senderEnv = MultiEnvFactory.getEnv(0); receiverEnv = MultiEnvFactory.getEnv(1); - // TODO: delete ratis configurations senderEnv .getConfig() .getCommonConfig()
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/basic/IoTDBPipeWithLoadIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/basic/IoTDBPipeWithLoadIT.java index b24a6b6..57b5846 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/basic/IoTDBPipeWithLoadIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/basic/IoTDBPipeWithLoadIT.java
@@ -59,7 +59,6 @@ senderEnv = MultiEnvFactory.getEnv(0); receiverEnv = MultiEnvFactory.getEnv(1); - // TODO: delete ratis configurations senderEnv .getConfig() .getCommonConfig()
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeAutoConflictIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeAutoConflictIT.java index 352d5b7..de0f0c4 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeAutoConflictIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeAutoConflictIT.java
@@ -55,7 +55,6 @@ senderEnv = MultiEnvFactory.getEnv(0); receiverEnv = MultiEnvFactory.getEnv(1); - // TODO: delete ratis configurations senderEnv .getConfig() .getCommonConfig()
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeClusterIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeClusterIT.java index 2e8eca8..4350d40 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeClusterIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeClusterIT.java
@@ -99,12 +99,12 @@ @Test public void testMachineDowntimeAsync() { - testMachineDowntime("iotdb-thrift-connector"); + testMachineDowntime("iotdb-thrift-sink"); } @Test public void testMachineDowntimeSync() { - testMachineDowntime("iotdb-thrift-sync-connector"); + testMachineDowntime("iotdb-thrift-sync-sink"); } private void testMachineDowntime(String sink) { @@ -120,24 +120,24 @@ try (final SyncConfigNodeIServiceClient client = (SyncConfigNodeIServiceClient) senderEnv.getLeaderConfigNodeConnection()) { - final Map<String, String> extractorAttributes = new HashMap<>(); + final Map<String, String> sourceAttributes = new HashMap<>(); final Map<String, String> processorAttributes = new HashMap<>(); - final Map<String, String> connectorAttributes = new HashMap<>(); + final Map<String, String> sinkAttributes = new HashMap<>(); - extractorAttributes.put("extractor", "iotdb-extractor"); - extractorAttributes.put("capture.table", "true"); - extractorAttributes.put("user", "root"); + sourceAttributes.put("source", "iotdb-source"); + sourceAttributes.put("capture.table", "true"); + sourceAttributes.put("user", "root"); processorAttributes.put("processor", "do-nothing-processor"); - connectorAttributes.put("connector", sink); - connectorAttributes.put("connector.batch.enable", "false"); - connectorAttributes.put("connector.node-urls", a.toString()); + sinkAttributes.put("sink", sink); + sinkAttributes.put("sink.batch.enable", "false"); + sinkAttributes.put("sink.node-urls", a.toString()); final TSStatus status = client.createPipe( - new TCreatePipeReq("p1", connectorAttributes) - .setExtractorAttributes(extractorAttributes) + new TCreatePipeReq("p1", sinkAttributes) + .setExtractorAttributes(sourceAttributes) .setProcessorAttributes(processorAttributes)); Assert.assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), status.getCode()); @@ -188,32 +188,32 @@ TableModelUtils.createDataBaseAndTable(senderEnv, "test", "test"); TableModelUtils.insertData("test", "test", 0, 100, senderEnv); - final Map<String, String> extractorAttributes = new HashMap<>(); + final Map<String, String> sourceAttributes = new HashMap<>(); final Map<String, String> processorAttributes = new HashMap<>(); - final Map<String, String> connectorAttributes = new HashMap<>(); + final Map<String, String> sinkAttributes = new HashMap<>(); - extractorAttributes.put("extractor", "iotdb-extractor"); - extractorAttributes.put("capture.table", "true"); - extractorAttributes.put("database-name", "test"); - extractorAttributes.put("table-name", "test"); - extractorAttributes.put("start-time", "0"); - extractorAttributes.put("end-time", "199"); - extractorAttributes.put("mode.streaming", realtimeMode); - extractorAttributes.put("user", "root"); + sourceAttributes.put("source", "iotdb-source"); + sourceAttributes.put("capture.table", "true"); + sourceAttributes.put("database-name", "test"); + sourceAttributes.put("table-name", "test"); + sourceAttributes.put("start-time", "0"); + sourceAttributes.put("end-time", "199"); + sourceAttributes.put("mode.streaming", realtimeMode); + sourceAttributes.put("user", "root"); processorAttributes.put("processor", "do-nothing-processor"); - connectorAttributes.put("connector", "iotdb-thrift-connector"); - connectorAttributes.put("connector.batch.enable", "false"); - connectorAttributes.put("connector.ip", receiverIp); - connectorAttributes.put("connector.port", Integer.toString(receiverPort)); - connectorAttributes.put("connector.user", "root"); - connectorAttributes.put("connector.password", "root"); + sinkAttributes.put("sink", "iotdb-thrift-sink"); + sinkAttributes.put("sink.batch.enable", "false"); + sinkAttributes.put("sink.ip", receiverIp); + sinkAttributes.put("sink.port", Integer.toString(receiverPort)); + sinkAttributes.put("sink.user", "root"); + sinkAttributes.put("sink.password", "root"); final TSStatus status = client.createPipe( - new TCreatePipeReq("p1", connectorAttributes) - .setExtractorAttributes(extractorAttributes) + new TCreatePipeReq("p1", sinkAttributes) + .setExtractorAttributes(sourceAttributes) .setProcessorAttributes(processorAttributes)); Assert.assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), status.getCode()); @@ -241,9 +241,9 @@ } // This function has a certain probability of triggering replica asynchrony. To ensure the success - // of the test, it will be retried 5 times. The exception will be thrown after five retries. + // of the test, it will be retried 5 times. The test will be ignored after five retries. @Test - public void testPipeAfterDataRegionLeaderStop() throws Exception { + public void testPipeAfterDataRegionLeaderStop() { for (int retry = 0; retry < 5; retry++) { try { if (retry != 0) { @@ -261,31 +261,31 @@ try (final SyncConfigNodeIServiceClient client = (SyncConfigNodeIServiceClient) senderEnv.getLeaderConfigNodeConnection()) { - final Map<String, String> extractorAttributes = new HashMap<>(); + final Map<String, String> sourceAttributes = new HashMap<>(); final Map<String, String> processorAttributes = new HashMap<>(); - final Map<String, String> connectorAttributes = new HashMap<>(); + final Map<String, String> sinkAttributes = new HashMap<>(); TableModelUtils.createDataBaseAndTable(senderEnv, "test", "test"); TableModelUtils.createDataBaseAndTable(senderEnv, "test1", "test1"); TableModelUtils.insertData("test", "test", 0, 100, senderEnv); TableModelUtils.insertData("test1", "test1", 0, 100, senderEnv); - extractorAttributes.put("extractor", "iotdb-extractor"); - extractorAttributes.put("database-name", "test"); - extractorAttributes.put("capture.table", "true"); - extractorAttributes.put("table-name", "test"); - extractorAttributes.put("start-time", "0"); - extractorAttributes.put("end-time", "300"); - extractorAttributes.put("user", "root"); + sourceAttributes.put("source", "iotdb-source"); + sourceAttributes.put("database-name", "test"); + sourceAttributes.put("capture.table", "true"); + sourceAttributes.put("table-name", "test"); + sourceAttributes.put("start-time", "0"); + sourceAttributes.put("end-time", "300"); + sourceAttributes.put("user", "root"); - connectorAttributes.put("connector", "iotdb-thrift-connector"); - connectorAttributes.put("connector.batch.enable", "false"); - connectorAttributes.put("connector.ip", receiverIp); - connectorAttributes.put("connector.port", Integer.toString(receiverPort)); + sinkAttributes.put("sink", "iotdb-thrift-sink"); + sinkAttributes.put("sink.batch.enable", "false"); + sinkAttributes.put("sink.ip", receiverIp); + sinkAttributes.put("sink.port", Integer.toString(receiverPort)); final TSStatus status = client.createPipe( - new TCreatePipeReq("p1", connectorAttributes) - .setExtractorAttributes(extractorAttributes) + new TCreatePipeReq("p1", sinkAttributes) + .setExtractorAttributes(sourceAttributes) .setProcessorAttributes(processorAttributes)); Assert.assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), status.getCode()); @@ -353,26 +353,26 @@ try (final SyncConfigNodeIServiceClient client = (SyncConfigNodeIServiceClient) senderEnv.getLeaderConfigNodeConnection()) { // Create a new pipe and write new data - final Map<String, String> extractorAttributes = new HashMap<>(); + final Map<String, String> sourceAttributes = new HashMap<>(); final Map<String, String> processorAttributes = new HashMap<>(); - final Map<String, String> connectorAttributes = new HashMap<>(); + final Map<String, String> sinkAttributes = new HashMap<>(); - extractorAttributes.put("database-name", "test1"); - extractorAttributes.put("capture.table", "true"); - extractorAttributes.put("table-name", "test1"); - extractorAttributes.put("start-time", "0"); - extractorAttributes.put("end-time", "300"); - extractorAttributes.put("user", "root"); + sourceAttributes.put("database-name", "test1"); + sourceAttributes.put("capture.table", "true"); + sourceAttributes.put("table-name", "test1"); + sourceAttributes.put("start-time", "0"); + sourceAttributes.put("end-time", "300"); + sourceAttributes.put("user", "root"); - connectorAttributes.put("connector", "iotdb-thrift-connector"); - connectorAttributes.put("connector.batch.enable", "false"); - connectorAttributes.put("connector.ip", receiverIp); - connectorAttributes.put("connector.port", Integer.toString(receiverPort)); + sinkAttributes.put("sink", "iotdb-thrift-sink"); + sinkAttributes.put("sink.batch.enable", "false"); + sinkAttributes.put("sink.ip", receiverIp); + sinkAttributes.put("sink.port", Integer.toString(receiverPort)); final TSStatus status = client.createPipe( - new TCreatePipeReq("p2", connectorAttributes) - .setExtractorAttributes(extractorAttributes) + new TCreatePipeReq("p2", sinkAttributes) + .setExtractorAttributes(sourceAttributes) .setProcessorAttributes(processorAttributes)); Assert.assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), status.getCode()); @@ -387,11 +387,9 @@ TableModelUtils.assertData("test1", "test1", 0, 301, receiverEnv, handleFailure); } return; - } catch (Exception | Error e) { + } catch (final Exception e) { if (retry < 4) { this.tearDown(); - } else { - throw e; } } } @@ -411,9 +409,9 @@ try (final SyncConfigNodeIServiceClient client = (SyncConfigNodeIServiceClient) senderEnv.getLeaderConfigNodeConnection()) { - final Map<String, String> extractorAttributes = new HashMap<>(); + final Map<String, String> sourceAttributes = new HashMap<>(); final Map<String, String> processorAttributes = new HashMap<>(); - final Map<String, String> connectorAttributes = new HashMap<>(); + final Map<String, String> sinkAttributes = new HashMap<>(); TableModelUtils.createDataBaseAndTable(senderEnv, "test", "test"); TableModelUtils.createDataBaseAndTable(senderEnv, "test1", "test1"); @@ -421,20 +419,20 @@ TableModelUtils.insertData("test1", "test1", 0, 100, senderEnv); - extractorAttributes.put("database-name", "test"); - extractorAttributes.put("capture.table", "true"); - extractorAttributes.put("table-name", "test"); - extractorAttributes.put("user", "root"); + sourceAttributes.put("database-name", "test"); + sourceAttributes.put("capture.table", "true"); + sourceAttributes.put("table-name", "test"); + sourceAttributes.put("user", "root"); - connectorAttributes.put("connector", "iotdb-thrift-connector"); - connectorAttributes.put("connector.batch.enable", "false"); - connectorAttributes.put("connector.ip", receiverIp); - connectorAttributes.put("connector.port", Integer.toString(receiverPort)); + sinkAttributes.put("sink", "iotdb-thrift-sink"); + sinkAttributes.put("sink.batch.enable", "false"); + sinkAttributes.put("sink.ip", receiverIp); + sinkAttributes.put("sink.port", Integer.toString(receiverPort)); final TSStatus status = client.createPipe( - new TCreatePipeReq("p1", connectorAttributes) - .setExtractorAttributes(extractorAttributes) + new TCreatePipeReq("p1", sinkAttributes) + .setExtractorAttributes(sourceAttributes) .setProcessorAttributes(processorAttributes)); Assert.assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), status.getCode()); @@ -470,24 +468,24 @@ try (final SyncConfigNodeIServiceClient client = (SyncConfigNodeIServiceClient) senderEnv.getLeaderConfigNodeConnection()) { // create a new pipe and write new data - final Map<String, String> extractorAttributes = new HashMap<>(); + final Map<String, String> sourceAttributes = new HashMap<>(); final Map<String, String> processorAttributes = new HashMap<>(); - final Map<String, String> connectorAttributes = new HashMap<>(); + final Map<String, String> sinkAttributes = new HashMap<>(); - extractorAttributes.put("database-name", "test1"); - extractorAttributes.put("capture.table", "true"); - extractorAttributes.put("table-name", "test1"); - extractorAttributes.put("user", "root"); + sourceAttributes.put("database-name", "test1"); + sourceAttributes.put("capture.table", "true"); + sourceAttributes.put("table-name", "test1"); + sourceAttributes.put("user", "root"); - connectorAttributes.put("connector", "iotdb-thrift-connector"); - connectorAttributes.put("connector.batch.enable", "false"); - connectorAttributes.put("connector.ip", receiverIp); - connectorAttributes.put("connector.port", Integer.toString(receiverPort)); + sinkAttributes.put("sink", "iotdb-thrift-sink"); + sinkAttributes.put("sink.batch.enable", "false"); + sinkAttributes.put("sink.ip", receiverIp); + sinkAttributes.put("sink.port", Integer.toString(receiverPort)); final TSStatus status = client.createPipe( - new TCreatePipeReq("p2", connectorAttributes) - .setExtractorAttributes(extractorAttributes) + new TCreatePipeReq("p2", sinkAttributes) + .setExtractorAttributes(sourceAttributes) .setProcessorAttributes(processorAttributes)); Assert.assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), status.getCode()); @@ -513,19 +511,19 @@ try (final SyncConfigNodeIServiceClient client = (SyncConfigNodeIServiceClient) senderEnv.getLeaderConfigNodeConnection()) { - final Map<String, String> extractorAttributes = new HashMap<>(); + final Map<String, String> sourceAttributes = new HashMap<>(); final Map<String, String> processorAttributes = new HashMap<>(); - final Map<String, String> connectorAttributes = new HashMap<>(); + final Map<String, String> sinkAttributes = new HashMap<>(); - extractorAttributes.put("database-name", "test1"); - extractorAttributes.put("capture.table", "true"); - extractorAttributes.put("table-name", "test1"); - extractorAttributes.put("user", "root"); + sourceAttributes.put("database-name", "test1"); + sourceAttributes.put("capture.table", "true"); + sourceAttributes.put("table-name", "test1"); + sourceAttributes.put("user", "root"); - connectorAttributes.put("connector", "iotdb-thrift-connector"); - connectorAttributes.put("connector.batch.enable", "false"); - connectorAttributes.put("connector.ip", receiverIp); - connectorAttributes.put("connector.port", Integer.toString(receiverPort)); + sinkAttributes.put("sink", "iotdb-thrift-sink"); + sinkAttributes.put("sink.batch.enable", "false"); + sinkAttributes.put("sink.ip", receiverIp); + sinkAttributes.put("sink.port", Integer.toString(receiverPort)); final Thread t = new Thread( @@ -533,8 +531,8 @@ for (int i = 0; i < 30; ++i) { try { client.createPipe( - new TCreatePipeReq("p" + i, connectorAttributes) - .setExtractorAttributes(extractorAttributes) + new TCreatePipeReq("p" + i, sinkAttributes) + .setExtractorAttributes(sourceAttributes) .setProcessorAttributes(processorAttributes)); } catch (final TException e) { // Not sure if the "createPipe" has succeeded @@ -584,24 +582,24 @@ TableModelUtils.createDataBaseAndTable(senderEnv, "test", "test"); TableModelUtils.insertData("test", "test", 0, 100, senderEnv); - final Map<String, String> extractorAttributes = new HashMap<>(); + final Map<String, String> sourceAttributes = new HashMap<>(); final Map<String, String> processorAttributes = new HashMap<>(); - final Map<String, String> connectorAttributes = new HashMap<>(); + final Map<String, String> sinkAttributes = new HashMap<>(); - extractorAttributes.put("database-name", "test"); - extractorAttributes.put("capture.table", "true"); - extractorAttributes.put("table-name", "test"); - extractorAttributes.put("user", "root"); + sourceAttributes.put("database-name", "test"); + sourceAttributes.put("capture.table", "true"); + sourceAttributes.put("table-name", "test"); + sourceAttributes.put("user", "root"); - connectorAttributes.put("connector", "iotdb-thrift-connector"); - connectorAttributes.put("connector.batch.enable", "false"); - connectorAttributes.put("connector.ip", receiverIp); - connectorAttributes.put("connector.port", Integer.toString(receiverPort)); + sinkAttributes.put("sink", "iotdb-thrift-sink"); + sinkAttributes.put("sink.batch.enable", "false"); + sinkAttributes.put("sink.ip", receiverIp); + sinkAttributes.put("sink.port", Integer.toString(receiverPort)); final TSStatus status = client.createPipe( - new TCreatePipeReq("p1", connectorAttributes) - .setExtractorAttributes(extractorAttributes) + new TCreatePipeReq("p1", sinkAttributes) + .setExtractorAttributes(sourceAttributes) .setProcessorAttributes(processorAttributes)); Assert.assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), status.getCode()); @@ -663,24 +661,24 @@ try (final SyncConfigNodeIServiceClient client = (SyncConfigNodeIServiceClient) senderEnv.getLeaderConfigNodeConnection()) { - final Map<String, String> extractorAttributes = new HashMap<>(); + final Map<String, String> sourceAttributes = new HashMap<>(); final Map<String, String> processorAttributes = new HashMap<>(); - final Map<String, String> connectorAttributes = new HashMap<>(); + final Map<String, String> sinkAttributes = new HashMap<>(); - extractorAttributes.put("database-name", "test"); - extractorAttributes.put("capture.table", "true"); - extractorAttributes.put("table-name", "test"); - extractorAttributes.put("user", "root"); + sourceAttributes.put("database-name", "test"); + sourceAttributes.put("capture.table", "true"); + sourceAttributes.put("table-name", "test"); + sourceAttributes.put("user", "root"); - connectorAttributes.put("connector", "iotdb-thrift-connector"); - connectorAttributes.put("connector.batch.enable", "false"); - connectorAttributes.put("connector.ip", receiverIp); - connectorAttributes.put("connector.port", Integer.toString(receiverPort)); + sinkAttributes.put("sink", "iotdb-thrift-sink"); + sinkAttributes.put("sink.batch.enable", "false"); + sinkAttributes.put("sink.ip", receiverIp); + sinkAttributes.put("sink.port", Integer.toString(receiverPort)); final TSStatus status = client.createPipe( - new TCreatePipeReq("p1", connectorAttributes) - .setExtractorAttributes(extractorAttributes) + new TCreatePipeReq("p1", sinkAttributes) + .setExtractorAttributes(sourceAttributes) .setProcessorAttributes(processorAttributes)); Assert.assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), status.getCode()); @@ -730,24 +728,24 @@ TableModelUtils.createDataBaseAndTable(senderEnv, "test", "test"); TableModelUtils.insertData("test", "test", 0, 100, senderEnv); - final Map<String, String> extractorAttributes = new HashMap<>(); + final Map<String, String> sourceAttributes = new HashMap<>(); final Map<String, String> processorAttributes = new HashMap<>(); - final Map<String, String> connectorAttributes = new HashMap<>(); + final Map<String, String> sinkAttributes = new HashMap<>(); - extractorAttributes.put("database-name", "test"); - extractorAttributes.put("capture.table", "true"); - extractorAttributes.put("table-name", "test"); - extractorAttributes.put("user", "root"); + sourceAttributes.put("database-name", "test"); + sourceAttributes.put("capture.table", "true"); + sourceAttributes.put("table-name", "test"); + sourceAttributes.put("user", "root"); - connectorAttributes.put("connector", "iotdb-thrift-connector"); - connectorAttributes.put("connector.batch.enable", "false"); - connectorAttributes.put("connector.ip", receiverIp); - connectorAttributes.put("connector.port", Integer.toString(receiverPort)); + sinkAttributes.put("sink", "iotdb-thrift-sink"); + sinkAttributes.put("sink.batch.enable", "false"); + sinkAttributes.put("sink.ip", receiverIp); + sinkAttributes.put("sink.port", Integer.toString(receiverPort)); final TSStatus status = client.createPipe( - new TCreatePipeReq("p1", connectorAttributes) - .setExtractorAttributes(extractorAttributes) + new TCreatePipeReq("p1", sinkAttributes) + .setExtractorAttributes(sourceAttributes) .setProcessorAttributes(processorAttributes)); Assert.assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), status.getCode()); @@ -780,19 +778,19 @@ final String receiverIp = receiverDataNode.getIp(); final int receiverPort = receiverDataNode.getPort(); - final Map<String, String> extractorAttributes = new HashMap<>(); + final Map<String, String> sourceAttributes = new HashMap<>(); final Map<String, String> processorAttributes = new HashMap<>(); - final Map<String, String> connectorAttributes = new HashMap<>(); + final Map<String, String> sinkAttributes = new HashMap<>(); - extractorAttributes.put("database-name", "test"); - extractorAttributes.put("capture.table", "true"); - extractorAttributes.put("table-name", "test"); - extractorAttributes.put("user", "root"); + sourceAttributes.put("database-name", "test"); + sourceAttributes.put("capture.table", "true"); + sourceAttributes.put("table-name", "test"); + sourceAttributes.put("user", "root"); - connectorAttributes.put("connector", "iotdb-thrift-connector"); - connectorAttributes.put("connector.batch.enable", "false"); - connectorAttributes.put("connector.ip", receiverIp); - connectorAttributes.put("connector.port", Integer.toString(receiverPort)); + sinkAttributes.put("sink", "iotdb-thrift-sink"); + sinkAttributes.put("sink.batch.enable", "false"); + sinkAttributes.put("sink.ip", receiverIp); + sinkAttributes.put("sink.port", Integer.toString(receiverPort)); final AtomicInteger successCount = new AtomicInteger(0); final List<Thread> threads = new ArrayList<>(); @@ -804,8 +802,8 @@ (SyncConfigNodeIServiceClient) senderEnv.getLeaderConfigNodeConnection()) { final TSStatus status = client.createPipe( - new TCreatePipeReq("p1", connectorAttributes) - .setExtractorAttributes(extractorAttributes) + new TCreatePipeReq("p1", sinkAttributes) + .setExtractorAttributes(sourceAttributes) .setProcessorAttributes(processorAttributes)); if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { successCount.incrementAndGet(); @@ -889,19 +887,19 @@ final String receiverIp = receiverDataNode.getIp(); final int receiverPort = receiverDataNode.getPort(); - final Map<String, String> extractorAttributes = new HashMap<>(); + final Map<String, String> sourceAttributes = new HashMap<>(); final Map<String, String> processorAttributes = new HashMap<>(); - final Map<String, String> connectorAttributes = new HashMap<>(); + final Map<String, String> sinkAttributes = new HashMap<>(); - extractorAttributes.put("database-name", "test"); - extractorAttributes.put("capture.table", "true"); - extractorAttributes.put("table-name", "test"); - extractorAttributes.put("user", "root"); + sourceAttributes.put("database-name", "test"); + sourceAttributes.put("capture.table", "true"); + sourceAttributes.put("table-name", "test"); + sourceAttributes.put("user", "root"); - connectorAttributes.put("connector", "iotdb-thrift-connector"); - connectorAttributes.put("connector.batch.enable", "false"); - connectorAttributes.put("connector.ip", receiverIp); - connectorAttributes.put("connector.port", Integer.toString(receiverPort)); + sinkAttributes.put("sink", "iotdb-thrift-sink"); + sinkAttributes.put("sink.batch.enable", "false"); + sinkAttributes.put("sink.ip", receiverIp); + sinkAttributes.put("sink.port", Integer.toString(receiverPort)); final AtomicInteger successCount = new AtomicInteger(0); final List<Thread> threads = new ArrayList<>(); @@ -914,8 +912,8 @@ (SyncConfigNodeIServiceClient) senderEnv.getLeaderConfigNodeConnection()) { final TSStatus status = client.createPipe( - new TCreatePipeReq("p" + finalI, connectorAttributes) - .setExtractorAttributes(extractorAttributes) + new TCreatePipeReq("p" + finalI, sinkAttributes) + .setExtractorAttributes(sourceAttributes) .setProcessorAttributes(processorAttributes)); Assert.assertEquals( TSStatusCode.SUCCESS_STATUS.getStatusCode(), status.getCode()); @@ -970,26 +968,26 @@ TableModelUtils.createDataBaseAndTable(senderEnv, "test", "test"); TableModelUtils.insertData("test", "test", -100, 100, senderEnv); - final Map<String, String> extractorAttributes = new HashMap<>(); + final Map<String, String> sourceAttributes = new HashMap<>(); final Map<String, String> processorAttributes = new HashMap<>(); - final Map<String, String> connectorAttributes = new HashMap<>(); + final Map<String, String> sinkAttributes = new HashMap<>(); - extractorAttributes.put("extractor", "iotdb-extractor"); - extractorAttributes.put("database-name", "test"); - extractorAttributes.put("capture.table", "true"); - extractorAttributes.put("table-name", "test"); - extractorAttributes.put("user", "root"); + sourceAttributes.put("source", "iotdb-source"); + sourceAttributes.put("database-name", "test"); + sourceAttributes.put("capture.table", "true"); + sourceAttributes.put("table-name", "test"); + sourceAttributes.put("user", "root"); processorAttributes.put("processor", "do-nothing-processor"); - connectorAttributes.put("connector", "iotdb-thrift-connector"); - connectorAttributes.put("connector.ip", receiverIp); - connectorAttributes.put("connector.port", Integer.toString(receiverPort)); + sinkAttributes.put("sink", "iotdb-thrift-sink"); + sinkAttributes.put("sink.ip", receiverIp); + sinkAttributes.put("sink.port", Integer.toString(receiverPort)); final TSStatus status = client.createPipe( - new TCreatePipeReq("p1", connectorAttributes) - .setExtractorAttributes(extractorAttributes) + new TCreatePipeReq("p1", sinkAttributes) + .setExtractorAttributes(sourceAttributes) .setProcessorAttributes(processorAttributes)); Assert.assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), status.getCode());
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeTypeConversionISessionIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeTypeConversionISessionIT.java index f81ea2d..46bc9e7 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeTypeConversionISessionIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeTypeConversionISessionIT.java
@@ -367,71 +367,83 @@ switch (sourceType) { case INT64: case TIMESTAMP: - value = - ValueConverter.convert( - sourceType, - targetType, - tablet.getBitMaps()[j].isMarked(i) ? null : ((long[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((long[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case INT32: - value = - ValueConverter.convert( - sourceType, - targetType, - tablet.getBitMaps()[j].isMarked(i) ? null : ((int[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((int[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case DOUBLE: - value = - ValueConverter.convert( - sourceType, - targetType, - tablet.getBitMaps()[j].isMarked(i) ? null : ((double[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((double[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case FLOAT: - value = - ValueConverter.convert( - sourceType, - targetType, - tablet.getBitMaps()[j].isMarked(i) ? null : ((float[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((float[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case DATE: - value = - ValueConverter.convert( - sourceType, - targetType, - tablet.getBitMaps()[j].isMarked(i) - ? null - : DateUtils.parseDateExpressionToInt(((LocalDate[]) values[j])[i])); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((LocalDate[]) values[j])[i]; + if (targetType == TSDataType.DATE) { + insertRecord.add(value); + break; + } + if (value != null) { + value = DateUtils.parseDateExpressionToInt((LocalDate) value); + } + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case TEXT: case STRING: - value = - ValueConverter.convert( - sourceType, - targetType, - tablet.getBitMaps()[j].isMarked(i) ? null : ((Binary[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); - break; case BLOB: - value = - ValueConverter.convert( - sourceType, - targetType, - tablet.getBitMaps()[j].isMarked(i) ? null : ((Binary[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((Binary[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case BOOLEAN: - value = - ValueConverter.convert( - sourceType, - targetType, - tablet.getBitMaps()[j].isMarked(i) ? null : ((boolean[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((boolean[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; } }
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/AbstractPipeDualTreeModelAutoIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/AbstractPipeDualTreeModelAutoIT.java index eb2b86e..a7fae02 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/AbstractPipeDualTreeModelAutoIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/AbstractPipeDualTreeModelAutoIT.java
@@ -50,7 +50,6 @@ } protected void setupConfig() { - // TODO: delete ratis configurations senderEnv .getConfig() .getCommonConfig()
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/basic/IoTDBPipeProcessorIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/basic/IoTDBPipeProcessorIT.java index 0447663..0ffdac3 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/basic/IoTDBPipeProcessorIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/basic/IoTDBPipeProcessorIT.java
@@ -54,7 +54,6 @@ senderEnv = MultiEnvFactory.getEnv(0); receiverEnv = MultiEnvFactory.getEnv(1); - // TODO: delete ratis configurations senderEnv .getConfig() .getCommonConfig()
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/basic/IoTDBPipeProtocolIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/basic/IoTDBPipeProtocolIT.java index cf9d108..0d6091c 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/basic/IoTDBPipeProtocolIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/basic/IoTDBPipeProtocolIT.java
@@ -67,7 +67,6 @@ schemaRegionReplicationFactor = Math.min(schemaRegionReplicationFactor, dataNodesNum); dataRegionReplicationFactor = Math.min(dataRegionReplicationFactor, dataNodesNum); - // TODO: delete ratis configurations senderEnv .getConfig() .getCommonConfig()
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/basic/IoTDBPipeSourceIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/basic/IoTDBPipeSourceIT.java index 4556cdb..be4b690 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/basic/IoTDBPipeSourceIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/basic/IoTDBPipeSourceIT.java
@@ -63,7 +63,6 @@ senderEnv = MultiEnvFactory.getEnv(0); receiverEnv = MultiEnvFactory.getEnv(1); - // TODO: delete ratis configurations senderEnv .getConfig() .getCommonConfig()
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeAutoConflictIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeAutoConflictIT.java index a220673..d8a191c 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeAutoConflictIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeAutoConflictIT.java
@@ -55,7 +55,6 @@ senderEnv = MultiEnvFactory.getEnv(0); receiverEnv = MultiEnvFactory.getEnv(1); - // TODO: delete ratis configurations senderEnv .getConfig() .getCommonConfig()
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeIdempotentIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeIdempotentIT.java index 3de685b..39bdd82 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeIdempotentIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeIdempotentIT.java
@@ -55,7 +55,6 @@ senderEnv = MultiEnvFactory.getEnv(0); receiverEnv = MultiEnvFactory.getEnv(1); - // TODO: delete ratis configurations // All the schema operations must be under the same database to // be in the same region, therefore a non-idempotent operation can block the next one // and fail the IT
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeWithLoadIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeWithLoadIT.java index 1a4be3b..74c9008 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeWithLoadIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeWithLoadIT.java
@@ -52,7 +52,6 @@ senderEnv = MultiEnvFactory.getEnv(0); receiverEnv = MultiEnvFactory.getEnv(1); - // TODO: delete ratis configurations senderEnv .getConfig() .getCommonConfig()
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/AbstractPipeDualTreeModelManualIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/AbstractPipeDualTreeModelManualIT.java index 20a7171..11f70d9 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/AbstractPipeDualTreeModelManualIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/AbstractPipeDualTreeModelManualIT.java
@@ -50,7 +50,6 @@ } protected void setupConfig() { - // TODO: delete ratis configurations senderEnv .getConfig() .getCommonConfig()
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipeMetaHistoricalIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipeMetaHistoricalIT.java index 2daa6cd..cb0c334 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipeMetaHistoricalIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipeMetaHistoricalIT.java
@@ -53,7 +53,6 @@ senderEnv = MultiEnvFactory.getEnv(0); receiverEnv = MultiEnvFactory.getEnv(1); - // TODO: delete ratis configurations senderEnv .getConfig() .getCommonConfig()
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipePermissionIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipePermissionIT.java index 085ed30..7fa5bdc 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipePermissionIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipePermissionIT.java
@@ -53,7 +53,6 @@ senderEnv = MultiEnvFactory.getEnv(0); receiverEnv = MultiEnvFactory.getEnv(1); - // TODO: delete ratis configurations senderEnv .getConfig() .getCommonConfig()
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipeTypeConversionISessionIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipeTypeConversionISessionIT.java index b973c2a..d2d3d4e 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipeTypeConversionISessionIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipeTypeConversionISessionIT.java
@@ -434,7 +434,11 @@ break; case TEXT: case STRING: - assertEquals(field.getStringValue(), rowValues.get(i)); + if (rowValues.get(i) instanceof Binary) { + assertEquals(field.getStringValue(), rowValues.get(i).toString()); + } else { + assertEquals(field.getStringValue(), rowValues.get(i)); + } break; case INT32: assertEquals(field.getIntV(), (int) rowValues.get(i)); @@ -602,44 +606,87 @@ switch (sourceType) { case INT64: case TIMESTAMP: - value = ValueConverter.convert(sourceType, targetType, ((long[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((long[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case INT32: - value = ValueConverter.convert(sourceType, targetType, ((int[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((int[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case DOUBLE: - value = ValueConverter.convert(sourceType, targetType, ((double[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((double[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case FLOAT: - value = ValueConverter.convert(sourceType, targetType, ((float[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((float[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case DATE: - value = - ValueConverter.convert( - sourceType, - targetType, - DateUtils.parseDateExpressionToInt(((LocalDate[]) values[j])[i])); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((LocalDate[]) values[j])[i]; + if (targetType == TSDataType.DATE) { + insertRecord.add(value); + break; + } + if (value != null) { + value = DateUtils.parseDateExpressionToInt((LocalDate) value); + } + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case TEXT: case STRING: - value = ValueConverter.convert(sourceType, targetType, ((Binary[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); - break; case BLOB: - value = ValueConverter.convert(sourceType, targetType, ((Binary[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((Binary[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; case BOOLEAN: - value = ValueConverter.convert(sourceType, targetType, ((boolean[]) values[j])[i]); - insertRecord.add(convert(value, targetType)); + value = tablet.getBitMaps()[j].isMarked(i) ? null : ((boolean[]) values[j])[i]; + if (targetType.isCompatible(sourceType)) { + value = targetType.castFromSingleValue(sourceType, value); + } else { + value = ValueConverter.convert(sourceType, targetType, value); + value = convert(value, targetType); + } + insertRecord.add(value); break; } } + insertRecord.add(tablet.getTimestamp(i)); insertRecords.add(insertRecord); }
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/triple/AbstractPipeTripleManualIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/triple/AbstractPipeTripleManualIT.java new file mode 100644 index 0000000..f4e63e1 --- /dev/null +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/triple/AbstractPipeTripleManualIT.java
@@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.pipe.it.triple; + +import org.apache.iotdb.consensus.ConsensusFactory; +import org.apache.iotdb.it.env.MultiEnvFactory; +import org.apache.iotdb.itbase.env.BaseEnv; + +import org.junit.After; +import org.junit.Before; + +abstract class AbstractPipeTripleManualIT { + + protected BaseEnv env1; + protected BaseEnv env2; + protected BaseEnv env3; + + @Before + public void setUp() { + MultiEnvFactory.createEnv(3); + env1 = MultiEnvFactory.getEnv(0); + env2 = MultiEnvFactory.getEnv(1); + env3 = MultiEnvFactory.getEnv(2); + setupConfig(); + env1.initClusterEnvironment(1, 1); + env2.initClusterEnvironment(1, 1); + env3.initClusterEnvironment(1, 1); + } + + protected void setupConfig() { + env1.getConfig() + .getCommonConfig() + .setAutoCreateSchemaEnabled(false) + .setConfigNodeConsensusProtocolClass(ConsensusFactory.RATIS_CONSENSUS) + .setSchemaRegionConsensusProtocolClass(ConsensusFactory.RATIS_CONSENSUS) + .setPipeMemoryManagementEnabled(false) + .setIsPipeEnableMemoryCheck(false) + .setPipeAutoSplitFullEnabled(false); + env1.getConfig().getDataNodeConfig().setDataNodeMemoryProportion("3:3:1:1:3:1"); + + env2.getConfig() + .getCommonConfig() + .setAutoCreateSchemaEnabled(false) + .setConfigNodeConsensusProtocolClass(ConsensusFactory.RATIS_CONSENSUS) + .setSchemaRegionConsensusProtocolClass(ConsensusFactory.RATIS_CONSENSUS) + .setPipeMemoryManagementEnabled(false) + .setIsPipeEnableMemoryCheck(false) + .setPipeAutoSplitFullEnabled(false); + + env3.getConfig() + .getCommonConfig() + .setAutoCreateSchemaEnabled(false) + .setConfigNodeConsensusProtocolClass(ConsensusFactory.RATIS_CONSENSUS) + .setSchemaRegionConsensusProtocolClass(ConsensusFactory.RATIS_CONSENSUS) + .setPipeMemoryManagementEnabled(false) + .setIsPipeEnableMemoryCheck(false) + .setPipeAutoSplitFullEnabled(false); + + // 10 min, assert that the operations will not time out + env1.getConfig().getCommonConfig().setDnConnectionTimeoutMs(600000); + env2.getConfig().getCommonConfig().setDnConnectionTimeoutMs(600000); + env3.getConfig().getCommonConfig().setDnConnectionTimeoutMs(600000); + } + + @After + public final void tearDown() { + env1.cleanClusterEnvironment(); + env2.cleanClusterEnvironment(); + env3.cleanClusterEnvironment(); + } +}
diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/triple/IoTDBPipeForwardIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/triple/IoTDBPipeForwardIT.java new file mode 100644 index 0000000..25019a7 --- /dev/null +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/triple/IoTDBPipeForwardIT.java
@@ -0,0 +1,117 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.pipe.it.triple; + +import org.apache.iotdb.common.rpc.thrift.TSStatus; +import org.apache.iotdb.commons.client.sync.SyncConfigNodeIServiceClient; +import org.apache.iotdb.confignode.rpc.thrift.TCreatePipeReq; +import org.apache.iotdb.db.it.utils.TestUtils; +import org.apache.iotdb.it.env.cluster.node.DataNodeWrapper; +import org.apache.iotdb.it.framework.IoTDBTestRunner; +import org.apache.iotdb.itbase.category.MultiClusterIT3; +import org.apache.iotdb.rpc.TSStatusCode; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.runner.RunWith; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +@RunWith(IoTDBTestRunner.class) +@Category({MultiClusterIT3.class}) +public class IoTDBPipeForwardIT extends AbstractPipeTripleManualIT { + @Test + public void testForwardingPipeRequests() throws Exception { + final DataNodeWrapper env2DataNode = env2.getDataNodeWrapper(0); + final String env2Ip = env2DataNode.getIp(); + final int env2Port = env2DataNode.getPort(); + + try (final SyncConfigNodeIServiceClient client = + (SyncConfigNodeIServiceClient) env1.getLeaderConfigNodeConnection()) { + final Map<String, String> sourceAttributes = new HashMap<>(); + final Map<String, String> processorAttributes = new HashMap<>(); + final Map<String, String> sinkAttributes = new HashMap<>(); + + sourceAttributes.put("inclusion", "all"); + + sinkAttributes.put("sink", "iotdb-thrift-sink"); + sinkAttributes.put("mark-as-pipe-request", "false"); + sinkAttributes.put("ip", env2Ip); + sinkAttributes.put("port", Integer.toString(env2Port)); + + final TSStatus status = + client.createPipe( + new TCreatePipeReq("testPipe", sinkAttributes) + .setExtractorAttributes(sourceAttributes) + .setProcessorAttributes(processorAttributes)); + + Assert.assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), status.getCode()); + + Assert.assertEquals( + TSStatusCode.SUCCESS_STATUS.getStatusCode(), client.startPipe("testPipe").getCode()); + } + + final DataNodeWrapper env3DataNode = env3.getDataNodeWrapper(0); + final String env3Ip = env3DataNode.getIp(); + final int env3Port = env3DataNode.getPort(); + + try (final SyncConfigNodeIServiceClient client = + (SyncConfigNodeIServiceClient) env2.getLeaderConfigNodeConnection()) { + final Map<String, String> sourceAttributes = new HashMap<>(); + final Map<String, String> processorAttributes = new HashMap<>(); + final Map<String, String> sinkAttributes = new HashMap<>(); + + sourceAttributes.put("inclusion", "all"); + sourceAttributes.put("forwarding-pipe-requests", "false"); + + sinkAttributes.put("sink", "iotdb-thrift-sink"); + sinkAttributes.put("ip", env3Ip); + sinkAttributes.put("port", Integer.toString(env3Port)); + + final TSStatus status = + client.createPipe( + new TCreatePipeReq("testPipe", sinkAttributes) + .setExtractorAttributes(sourceAttributes) + .setProcessorAttributes(processorAttributes)); + + Assert.assertEquals(TSStatusCode.SUCCESS_STATUS.getStatusCode(), status.getCode()); + + Assert.assertEquals( + TSStatusCode.SUCCESS_STATUS.getStatusCode(), client.startPipe("testPipe").getCode()); + } + + TestUtils.executeNonQueries( + env1, + Arrays.asList( + "create database root.sg", + "create timeseries root.sg.wf01.GPS.status0 with datatype=BOOLEAN,encoding=PLAIN", + "insert into root.sg.wf01.GPS (time, status0) values (0, 1)"), + null); + TestUtils.assertDataEventuallyOnEnv( + env3, + "select status0 from root.sg.**", + "Time,root.sg.wf01.GPS.status0,", + Collections.singleton("0,true,")); + } +}
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java index 22e3e0c..8f76adb 100644 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java
@@ -1452,12 +1452,22 @@ rec = dataSet.next(); assertEquals(1, rec.getFields().get(0).getLongV()); assertEquals("d1", rec.getFields().get(1).toString()); - if (to == TSDataType.BLOB) { - assertEquals(genValue(to, 1), rec.getFields().get(2).getBinaryV()); - } else if (to == TSDataType.DATE) { - assertEquals(genValue(to, 1), rec.getFields().get(2).getDateV()); - } else { - assertEquals(genValue(to, 1).toString(), rec.getFields().get(2).toString()); + + switch (to) { + case BLOB: + assertEquals(genValue(to, 1), rec.getFields().get(2).getBinaryV()); + break; + case DATE: + assertEquals(genValue(to, 1), rec.getFields().get(2).getDateV()); + break; + case FLOAT: + assertEquals(genValue(to, 1), rec.getFields().get(2).getFloatV()); + break; + case DOUBLE: + assertEquals(genValue(to, 1), rec.getFields().get(2).getDoubleV()); + break; + default: + assertEquals(String.valueOf(genValue(from, 1)), rec.getFields().get(2).toString()); } assertFalse(dataSet.hasNext()); } else { @@ -1621,17 +1631,19 @@ dataTypes.remove(TSDataType.VECTOR); dataTypes.remove(TSDataType.UNKNOWN); - for (TSDataType from : dataTypes) { - for (TSDataType to : dataTypes) { - System.out.println("from: " + from + ", to: " + to); - testOneCastWithTablet(from, to, testNum, false); - System.out.println("partial insert"); - testOneCastWithTablet(from, to, testNum, true); + try { + for (TSDataType from : dataTypes) { + for (TSDataType to : dataTypes) { + System.out.println("from: " + from + ", to: " + to); + testOneCastWithTablet(from, to, testNum, false); + System.out.println("partial insert"); + testOneCastWithTablet(from, to, testNum, true); + } } - } - - try (ISession session = EnvFactory.getEnv().getSessionConnection()) { - session.executeNonQueryStatement("SET CONFIGURATION \"enable_partial_insert\"=\"true\""); + } finally { + try (ISession session = EnvFactory.getEnv().getSessionConnection()) { + session.executeNonQueryStatement("SET CONFIGURATION \"enable_partial_insert\"=\"true\""); + } } }
diff --git a/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSchemaTemplateIT.java b/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSchemaTemplateIT.java index 53bb5e1..ef7bffd 100644 --- a/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSchemaTemplateIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSchemaTemplateIT.java
@@ -498,10 +498,6 @@ e.getMessage() .contains( "data type of root.db.v4.d2.b is not consistent, registered type FLOAT, inserting type DOUBLE")); - Assert.assertTrue( - e.getMessage() - .contains( - "data type of root.db.v4.d2.c is not consistent, registered type TEXT, inserting type INT32")); } } }
diff --git a/integration-test/src/test/resources/test-keystore b/integration-test/src/test/resources/test-keystore index 4dd66ac..2346c54 100644 --- a/integration-test/src/test/resources/test-keystore +++ b/integration-test/src/test/resources/test-keystore Binary files differ
diff --git a/integration-test/src/test/resources/test-truststore b/integration-test/src/test/resources/test-truststore index 26fbd19..92c5b81 100644 --- a/integration-test/src/test/resources/test-truststore +++ b/integration-test/src/test/resources/test-truststore Binary files differ
diff --git a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/BaseRpcTransportFactory.java b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/BaseRpcTransportFactory.java index 1175b16..eccebe2 100644 --- a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/BaseRpcTransportFactory.java +++ b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/BaseRpcTransportFactory.java
@@ -26,6 +26,10 @@ import org.apache.thrift.transport.TTransportException; import org.apache.thrift.transport.TTransportFactory; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; + @SuppressWarnings("java:S1135") // ignore todos public class BaseRpcTransportFactory extends TTransportFactory { @@ -95,8 +99,12 @@ throws TTransportException { TSSLTransportFactory.TSSLTransportParameters params = new TSSLTransportFactory.TSSLTransportParameters(); - params.setTrustStore(trustStore, trustStorePwd); - params.setKeyStore(keyStore, keyStorePwd); + if (Files.exists(Paths.get(trustStore)) && Files.exists(Paths.get(keyStore))) { + params.setTrustStore(trustStore, trustStorePwd); + params.setKeyStore(keyStore, keyStorePwd); + } else { + throw new TTransportException(new IOException("Could not load keystore or truststore file")); + } TTransport transport = TSSLTransportFactory.getClientSocket(ip, port, timeout, params); return inner.getTransport(transport); }
diff --git a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/NettyTNonblockingTransport.java b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/NettyTNonblockingTransport.java index 8cf6c51..b42b901 100644 --- a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/NettyTNonblockingTransport.java +++ b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/NettyTNonblockingTransport.java
@@ -47,6 +47,7 @@ import javax.net.ssl.TrustManagerFactory; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketAddress; @@ -54,6 +55,7 @@ import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; +import java.nio.file.AccessDeniedException; import java.security.KeyStore; import java.util.concurrent.CompletableFuture; import java.util.concurrent.LinkedBlockingQueue; @@ -166,12 +168,15 @@ "SSL handshake completed successfully for {}:{}", host, port); } } else { - if (logger.isDebugEnabled()) { + if (!future + .cause() + .getMessage() + .contains("SslHandler removed before handshake completed")) { + logger.warn( + "SSL handshake failed for {}:{}", host, port, future.cause()); + } else if (logger.isDebugEnabled()) { logger.debug( - "SSL handshake failed for {}:{}: {}", - host, - port, - future.cause().getMessage()); + "SSL handshake failed for {}:{}", host, port, future.cause()); } } }); @@ -187,6 +192,10 @@ KeyStore keyStore = KeyStore.getInstance("JKS"); try (FileInputStream fis = new FileInputStream(keystorePath)) { keyStore.load(fis, keystorePassword.toCharArray()); + } catch (AccessDeniedException e) { + throw new AccessDeniedException("Failed to load keystore file"); + } catch (FileNotFoundException e) { + throw new FileNotFoundException("keystore file not found"); } KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); @@ -198,6 +207,10 @@ KeyStore trustStore = KeyStore.getInstance("JKS"); try (FileInputStream fis = new FileInputStream(truststorePath)) { trustStore.load(fis, truststorePassword.toCharArray()); + } catch (AccessDeniedException e) { + throw new AccessDeniedException("Failed to load truststore file"); + } catch (FileNotFoundException e) { + throw new FileNotFoundException("truststore file not found"); } TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
diff --git a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/TElasticFramedTransport.java b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/TElasticFramedTransport.java index 05a6a83..0ff58f7 100644 --- a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/TElasticFramedTransport.java +++ b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/TElasticFramedTransport.java
@@ -25,6 +25,9 @@ import org.apache.thrift.transport.TTransportFactory; import org.apache.thrift.transport.layered.TFramedTransport; +import javax.net.ssl.SSLHandshakeException; + +import java.io.EOFException; import java.net.SocketTimeoutException; // https://github.com/apache/thrift/blob/master/doc/specs/thrift-rpc.md @@ -126,6 +129,13 @@ if (e.getCause() instanceof SocketTimeoutException) { throw new TTransportException(TTransportException.TIMED_OUT, e.getCause()); } + // When client with SSL shut down due to time out. Some unnecessary error logs may be printed. + // Adding this workaround to avoid the problem. + if (e.getCause() instanceof SSLHandshakeException + && e.getCause().getCause() != null + && e.getCause().getCause() instanceof EOFException) { + throw new TTransportException(TTransportException.END_OF_FILE, e.getCause()); + } throw e; } return readBuffer.read(buf, off, len);
diff --git a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java index b19221e..fc73878 100644 --- a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java +++ b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java
@@ -106,6 +106,7 @@ WRITE_PROCESS_REJECT(606), OUT_OF_TTL(607), COMPACTION_ERROR(608), + @Deprecated ALIGNED_TIMESERIES_ERROR(609), WAL_ERROR(610), DISK_SPACE_INSUFFICIENT(611),
diff --git a/iotdb-core/ainode/iotdb/ainode/core/model/sundial/modeling_sundial.py b/iotdb-core/ainode/iotdb/ainode/core/model/sundial/modeling_sundial.py index b6e6275..544193e 100644 --- a/iotdb-core/ainode/iotdb/ainode/core/model/sundial/modeling_sundial.py +++ b/iotdb-core/ainode/iotdb/ainode/core/model/sundial/modeling_sundial.py
@@ -156,7 +156,7 @@ past_key_value: Optional[Cache] = None, output_attentions: bool = False, **kwargs, - ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Cache]]: bsz, q_len, _ = hidden_states.size() query_states = self.q_proj(hidden_states) @@ -175,7 +175,7 @@ kv_seq_len = key_states.shape[-2] if past_key_value is not None: - kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + kv_seq_len += past_key_value.get_seq_length(self.layer_idx) cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) query_states, key_states = apply_rotary_pos_emb( query_states, key_states, cos, sin, position_ids @@ -238,15 +238,13 @@ hidden_states: torch.Tensor, attention_mask: Optional[torch.Tensor] = None, position_ids: Optional[torch.LongTensor] = None, - past_key_value: Optional[Tuple[torch.Tensor]] = None, + past_key_value: Optional[Cache] = None, output_attentions: Optional[bool] = False, - use_cache: Optional[bool] = False, **kwargs, ) -> Tuple[ torch.FloatTensor, - torch.FloatTensor, - Optional[torch.FloatTensor], - Optional[torch.FloatTensor], + Optional[torch.Tensor], + Optional[Cache], ]: residual = hidden_states @@ -259,7 +257,6 @@ position_ids=position_ids, past_key_value=past_key_value, output_attentions=output_attentions, - use_cache=use_cache, ) hidden_states = residual + hidden_states @@ -272,8 +269,6 @@ if not output_attentions: self_attn_weights = None - if not use_cache: - present_key_value = None return hidden_states, self_attn_weights, present_key_value @@ -317,9 +312,10 @@ input_ids: torch.FloatTensor = None, attention_mask: Optional[torch.Tensor] = None, position_ids: Optional[torch.LongTensor] = None, - past_key_values: Optional[List[torch.FloatTensor]] = None, + past_key_values: Optional[ + Union[Cache, tuple[tuple[torch.Tensor, torch.Tensor]]] + ] = None, inputs_embeds: Optional[torch.FloatTensor] = None, - use_cache: Optional[bool] = None, output_attentions: Optional[bool] = None, output_hidden_states: Optional[bool] = None, return_dict: Optional[bool] = None, @@ -335,7 +331,6 @@ if output_hidden_states is not None else self.config.output_hidden_states ) - use_cache = use_cache if use_cache is not None else self.config.use_cache return_dict = ( return_dict if return_dict is not None else self.config.use_return_dict @@ -359,17 +354,25 @@ inputs_embeds = self.embed_layer(input_ids) seq_length = inputs_embeds.shape[1] - if self.gradient_checkpointing and self.training: - if use_cache: - use_cache = False - past_key_values_length = 0 + use_legacy_cache = False - if use_cache: + if past_key_values is not None: use_legacy_cache = not isinstance(past_key_values, Cache) + # Converts the legacy cache which is tuple into an equivalent Cache. Used for backward compatibility. if use_legacy_cache: past_key_values = DynamicCache.from_legacy_cache(past_key_values) - past_key_values_length = past_key_values.get_usable_length(seq_length) + # Suppose the sequence length of each layer is the same + past_key_values_length = past_key_values.get_seq_length() + + # When training + checkpoints, caching is usually disabled (just do not transfer) + if ( + self.gradient_checkpointing + and self.training + and isinstance(past_key_values, Cache) + ): + past_key_values = None + past_key_values_length = 0 if position_ids is None: device = input_ids.device if input_ids is not None else inputs_embeds.device @@ -412,7 +415,6 @@ position_ids, past_key_values, output_attentions, - use_cache, ) else: layer_outputs = decoder_layer( @@ -421,7 +423,6 @@ position_ids=position_ids, past_key_value=past_key_values, output_attentions=output_attentions, - use_cache=use_cache, ) hidden_states = layer_outputs[0] @@ -429,7 +430,7 @@ if output_attentions: all_self_attns += (layer_outputs[1],) - if use_cache: + if isinstance(past_key_values, Cache): next_decoder_cache = layer_outputs[2] hidden_states = self.norm(hidden_states) @@ -438,7 +439,7 @@ all_hidden_states += (hidden_states,) next_cache = None - if use_cache: + if isinstance(past_key_values, Cache): next_cache = ( next_decoder_cache.to_legacy_cache() if use_legacy_cache @@ -484,12 +485,13 @@ input_ids: torch.FloatTensor = None, attention_mask: Optional[torch.Tensor] = None, position_ids: Optional[torch.LongTensor] = None, - past_key_values: Optional[List[torch.FloatTensor]] = None, + past_key_values: Optional[ + Union[Cache, tuple[tuple[torch.Tensor, torch.Tensor]]] + ] = None, inputs_embeds: Optional[torch.FloatTensor] = None, labels: Optional[torch.FloatTensor] = None, loss_masks: Optional[torch.FloatTensor] = None, mask_y: Optional[torch.FloatTensor] = None, - use_cache: Optional[bool] = None, output_attentions: Optional[bool] = None, output_hidden_states: Optional[bool] = None, return_dict: Optional[bool] = None, @@ -525,7 +527,6 @@ position_ids=position_ids, past_key_values=past_key_values, inputs_embeds=inputs_embeds, - use_cache=use_cache, output_attentions=output_attentions, output_hidden_states=output_hidden_states, return_dict=return_dict, @@ -604,16 +605,9 @@ # Omit tokens covered by past_key_values if past_key_values is not None: if isinstance(past_key_values, Cache): - cache_length = past_key_values.get_seq_length() - if isinstance(past_key_values, DynamicCache): - past_length = past_key_values.seen_tokens - else: - past_length = cache_length - - max_cache_length = past_key_values.get_max_length() + past_length = past_key_values.get_seq_length() else: - cache_length = past_length = past_key_values[0][0].shape[2] - max_cache_length = None + past_length = past_key_values[0][0].shape[2] # Keep only the unprocessed tokens: # 1 - If the length of the attention_mask exceeds the length of input_ids, then we are in a setting where @@ -622,26 +616,13 @@ if attention_mask is not None and attention_mask.shape[1] > ( input_ids.shape[1] // self.config.input_token_len ): - input_ids = input_ids[ - :, - -(attention_mask.shape[1] - past_length) - * self.config.input_token_len :, - ] + input_ids = input_ids[:, -(attention_mask.shape[1] - past_length) :] # 2 - If the past_length is smaller than input_ids', then input_ids holds all input tokens. We can discard # input_ids based on the past_length. elif past_length < (input_ids.shape[1] // self.config.input_token_len): input_ids = input_ids[:, past_length * self.config.input_token_len :] # 3 - Otherwise (past_length >= (input_ids.shape[1] // self.config.input_token_len)), let's assume input_ids only has unprocessed tokens. - # If we are about to go beyond the maximum cache length, we need to crop the input attention mask. - if ( - max_cache_length is not None - and attention_mask is not None - and cache_length + (input_ids.shape[1] // self.config.input_token_len) - > max_cache_length - ): - attention_mask = attention_mask[:, -max_cache_length:] - position_ids = kwargs.get("position_ids", None) if attention_mask is not None and position_ids is None: # create position_ids on the fly for batch generation @@ -662,7 +643,6 @@ { "position_ids": position_ids, "past_key_values": past_key_values, - "use_cache": kwargs.get("use_cache"), "attention_mask": attention_mask, "revin": revin, "num_samples": num_samples,
diff --git a/iotdb-core/ainode/iotdb/ainode/core/model/sundial/ts_generation_mixin.py b/iotdb-core/ainode/iotdb/ainode/core/model/sundial/ts_generation_mixin.py index 0457116..f09621f 100644 --- a/iotdb-core/ainode/iotdb/ainode/core/model/sundial/ts_generation_mixin.py +++ b/iotdb-core/ainode/iotdb/ainode/core/model/sundial/ts_generation_mixin.py
@@ -83,7 +83,7 @@ outputs = (outputs * stdev) + means return outputs - def _greedy_search( + def _sample( self, input_ids: torch.Tensor, logits_processor: Optional[LogitsProcessorList] = None, @@ -269,7 +269,7 @@ horizon_length = next_tokens.shape[-1] // self.config.input_token_len past_key_values = model_kwargs.get("past_key_values") - if past_key_values is None: + if past_key_values is None or generate_results is None: generate_results = next_tokens else: generate_results = torch.cat([generate_results, next_tokens], dim=-1) @@ -328,9 +328,13 @@ standardize_cache_format: bool = False, ) -> Dict[str, Any]: # update past_key_values - model_kwargs["past_key_values"] = self._extract_past_from_model_output( - outputs, standardize_cache_format=standardize_cache_format - ) + if "past_key_values" in outputs: + model_kwargs["past_key_values"] = outputs.past_key_values + elif "mems" in outputs: + model_kwargs["past_key_values"] = outputs.mems + elif "past_buckets_states" in outputs: + model_kwargs["past_key_values"] = outputs.past_buckets_states + if getattr(outputs, "state", None) is not None: model_kwargs["state"] = outputs.state
diff --git a/iotdb-core/ainode/iotdb/ainode/core/model/timerxl/modeling_timer.py b/iotdb-core/ainode/iotdb/ainode/core/model/timerxl/modeling_timer.py index 9eb3cae..37bf56d 100644 --- a/iotdb-core/ainode/iotdb/ainode/core/model/timerxl/modeling_timer.py +++ b/iotdb-core/ainode/iotdb/ainode/core/model/timerxl/modeling_timer.py
@@ -148,7 +148,7 @@ past_key_value: Optional[Cache] = None, output_attentions: bool = False, **kwargs, - ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Cache]]: bsz, q_len, _ = hidden_states.size() query_states = self.q_proj(hidden_states) @@ -167,7 +167,7 @@ kv_seq_len = key_states.shape[-2] if past_key_value is not None: - kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + kv_seq_len += past_key_value.get_seq_length(self.layer_idx) cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) query_states, key_states = apply_rotary_pos_emb( query_states, key_states, cos, sin, position_ids @@ -230,15 +230,13 @@ hidden_states: torch.Tensor, attention_mask: Optional[torch.Tensor] = None, position_ids: Optional[torch.LongTensor] = None, - past_key_value: Optional[Tuple[torch.Tensor]] = None, + past_key_value: Optional[Cache] = None, output_attentions: Optional[bool] = False, - use_cache: Optional[bool] = False, **kwargs, ) -> Tuple[ torch.FloatTensor, - torch.FloatTensor, - Optional[torch.FloatTensor], - Optional[torch.FloatTensor], + Optional[torch.Tensor], + Optional[Cache], ]: residual = hidden_states @@ -249,7 +247,6 @@ position_ids=position_ids, past_key_value=past_key_value, output_attentions=output_attentions, - use_cache=use_cache, ) hidden_states = residual + hidden_states hidden_states = self.norm1(hidden_states) @@ -263,8 +260,6 @@ if not output_attentions: self_attn_weights = None - if not use_cache: - present_key_value = None return hidden_states, self_attn_weights, present_key_value @@ -272,7 +267,7 @@ config_class = TimerConfig base_model_prefix = "model" supports_gradient_checkpointing = True - _no_split_modules = ["TimeMoeDecoderLayer"] + _no_split_modules = ["TimeDecoderLayer"] _skip_keys_device_placement = "past_key_values" _supports_flash_attn_2 = True _supports_sdpa = False @@ -308,9 +303,10 @@ input_ids: torch.FloatTensor = None, attention_mask: Optional[torch.Tensor] = None, position_ids: Optional[torch.LongTensor] = None, - past_key_values: Optional[List[torch.FloatTensor]] = None, + past_key_values: Optional[ + Union[Cache, tuple[tuple[torch.Tensor, torch.Tensor]]] + ] = None, inputs_embeds: Optional[torch.FloatTensor] = None, - use_cache: Optional[bool] = None, output_attentions: Optional[bool] = None, output_hidden_states: Optional[bool] = None, return_dict: Optional[bool] = None, @@ -326,7 +322,6 @@ if output_hidden_states is not None else self.config.output_hidden_states ) - use_cache = use_cache if use_cache is not None else self.config.use_cache return_dict = ( return_dict if return_dict is not None else self.config.use_return_dict @@ -350,17 +345,24 @@ inputs_embeds = self.embed_layer(input_ids) seq_length = inputs_embeds.shape[1] - if self.gradient_checkpointing and self.training: - if use_cache: - use_cache = False - past_key_values_length = 0 + use_legacy_cache = False - if use_cache: + if past_key_values is not None: use_legacy_cache = not isinstance(past_key_values, Cache) + # Converts the legacy cache which is tuple into an equivalent Cache. Used for backward compatibility. if use_legacy_cache: past_key_values = DynamicCache.from_legacy_cache(past_key_values) - past_key_values_length = past_key_values.get_usable_length(seq_length) + past_key_values_length = past_key_values.get_seq_length() + + # When training + checkpoints, caching is usually disabled (just do not transfer) + if ( + self.gradient_checkpointing + and self.training + and isinstance(past_key_values, Cache) + ): + past_key_values = None + past_key_values_length = 0 if position_ids is None: device = input_ids.device if input_ids is not None else inputs_embeds.device @@ -403,7 +405,6 @@ position_ids, past_key_values, output_attentions, - use_cache, ) else: layer_outputs = decoder_layer( @@ -412,7 +413,6 @@ position_ids=position_ids, past_key_value=past_key_values, output_attentions=output_attentions, - use_cache=use_cache, ) hidden_states = layer_outputs[0] @@ -420,7 +420,7 @@ if output_attentions: all_self_attns += (layer_outputs[1],) - if use_cache: + if isinstance(past_key_values, Cache): next_decoder_cache = layer_outputs[2] hidden_states = self.norm(hidden_states) @@ -429,7 +429,7 @@ all_hidden_states += (hidden_states,) next_cache = None - if use_cache: + if isinstance(past_key_values, Cache): next_cache = ( next_decoder_cache.to_legacy_cache() if use_legacy_cache @@ -477,11 +477,12 @@ input_ids: torch.FloatTensor = None, attention_mask: Optional[torch.Tensor] = None, position_ids: Optional[torch.LongTensor] = None, - past_key_values: Optional[List[torch.FloatTensor]] = None, + past_key_values: Optional[ + Union[Cache, tuple[tuple[torch.Tensor, torch.Tensor]]] + ] = None, inputs_embeds: Optional[torch.FloatTensor] = None, labels: Optional[torch.FloatTensor] = None, loss_masks: Optional[torch.FloatTensor] = None, - use_cache: Optional[bool] = None, output_attentions: Optional[bool] = None, output_hidden_states: Optional[bool] = None, return_dict: Optional[bool] = None, @@ -514,7 +515,6 @@ position_ids=position_ids, past_key_values=past_key_values, inputs_embeds=inputs_embeds, - use_cache=use_cache, output_attentions=output_attentions, output_hidden_states=output_hidden_states, return_dict=return_dict, @@ -556,7 +556,7 @@ predictions = predictions * std + mean if not return_dict: output = (predictions,) + outputs[1:] - return (loss) + output if loss is not None else output + return (loss,) + output if loss is not None else output return MoeCausalLMOutputWithPast( loss=loss, @@ -595,16 +595,9 @@ # Omit tokens covered by past_key_values if past_key_values is not None: if isinstance(past_key_values, Cache): - cache_length = past_key_values.get_seq_length() - if isinstance(past_key_values, DynamicCache): - past_length = past_key_values.seen_tokens - else: - past_length = cache_length - - max_cache_length = past_key_values.get_max_length() + past_length = past_key_values.get_seq_length() else: - cache_length = past_length = past_key_values[0][0].shape[2] - max_cache_length = None + past_length = past_key_values[0][0].shape[2] # Keep only the unprocessed tokens: # 1 - If the length of the attention_mask exceeds the length of input_ids, then we are in a setting where @@ -620,15 +613,6 @@ input_ids = input_ids[:, past_length * self.config.input_token_len :] # 3 - Otherwise (past_length >= (input_ids.shape[1] // self.config.input_token_len)), let's assume input_ids only has unprocessed tokens. - # If we are about to go beyond the maximum cache length, we need to crop the input attention mask. - if ( - max_cache_length is not None - and attention_mask is not None - and cache_length + (input_ids.shape[1] // self.config.input_token_len) - > max_cache_length - ): - attention_mask = attention_mask[:, -max_cache_length:] - position_ids = kwargs.get("position_ids", None) if attention_mask is not None and position_ids is None: # create position_ids on the fly for batch generation @@ -649,7 +633,6 @@ { "position_ids": position_ids, "past_key_values": past_key_values, - "use_cache": kwargs.get("use_cache"), "attention_mask": attention_mask, "revin": revin, }
diff --git a/iotdb-core/ainode/iotdb/ainode/core/model/timerxl/ts_generation_mixin.py b/iotdb-core/ainode/iotdb/ainode/core/model/timerxl/ts_generation_mixin.py index 165d3c5..18f711b 100644 --- a/iotdb-core/ainode/iotdb/ainode/core/model/timerxl/ts_generation_mixin.py +++ b/iotdb-core/ainode/iotdb/ainode/core/model/timerxl/ts_generation_mixin.py
@@ -78,7 +78,7 @@ **kwargs, ) - def _greedy_search( + def _sample( self, input_ids: torch.Tensor, logits_processor: Optional[LogitsProcessorList] = None, @@ -315,9 +315,13 @@ standardize_cache_format: bool = False, ) -> Dict[str, Any]: # update past_key_values - model_kwargs["past_key_values"] = self._extract_past_from_model_output( - outputs, standardize_cache_format=standardize_cache_format - ) + if "past_key_values" in outputs: + model_kwargs["past_key_values"] = outputs.past_key_values + elif "mems" in outputs: + model_kwargs["past_key_values"] = outputs.mems + elif "past_buckets_states" in outputs: + model_kwargs["past_key_values"] = outputs.past_buckets_states + if getattr(outputs, "state", None) is not None: model_kwargs["state"] = outputs.state
diff --git a/iotdb-core/ainode/poetry.lock b/iotdb-core/ainode/poetry.lock index 1cae5eb..7a22506 100644 --- a/iotdb-core/ainode/poetry.lock +++ b/iotdb-core/ainode/poetry.lock
@@ -1,24 +1,24 @@ -# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.4 and should not be changed by hand. [[package]] name = "alembic" -version = "1.13.2" +version = "1.16.5" description = "A database migration tool for SQLAlchemy." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "alembic-1.13.2-py3-none-any.whl", hash = "sha256:6b8733129a6224a9a711e17c99b08462dbf7cc9670ba8f2e2ae9af860ceb1953"}, - {file = "alembic-1.13.2.tar.gz", hash = "sha256:1ff0ae32975f4fd96028c39ed9bb3c867fe3af956bd7bb37343b54c9fe7445ef"}, + {file = "alembic-1.16.5-py3-none-any.whl", hash = "sha256:e845dfe090c5ffa7b92593ae6687c5cb1a101e91fa53868497dbd79847f9dbe3"}, + {file = "alembic-1.16.5.tar.gz", hash = "sha256:a88bb7f6e513bd4301ecf4c7f2206fe93f9913f9b48dac3b78babde2d6fe765e"}, ] [package.dependencies] Mako = "*" -SQLAlchemy = ">=1.3.0" -typing-extensions = ">=4" +SQLAlchemy = ">=1.4.0" +typing-extensions = ">=4.12" [package.extras] -tz = ["backports.zoneinfo ; python_version < \"3.9\""] +tz = ["tzdata"] [[package]] name = "black" @@ -67,126 +67,115 @@ [[package]] name = "certifi" -version = "2024.7.4" +version = "2025.8.3" description = "Python package for providing Mozilla's CA Bundle." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" groups = ["main"] files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5"}, + {file = "certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407"}, ] [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.3" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.7" groups = ["main"] files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-win32.whl", hash = "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-win32.whl", hash = "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-win32.whl", hash = "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-win32.whl", hash = "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca"}, + {file = "charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a"}, + {file = "charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14"}, ] [[package]] name = "click" -version = "8.2.1" +version = "8.3.0" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b"}, - {file = "click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202"}, + {file = "click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc"}, + {file = "click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4"}, ] [package.dependencies] @@ -207,14 +196,14 @@ [[package]] name = "colorlog" -version = "6.8.2" +version = "6.9.0" description = "Add colours to the output of Python's logging module." optional = false python-versions = ">=3.6" groups = ["main"] files = [ - {file = "colorlog-6.8.2-py3-none-any.whl", hash = "sha256:4dcbb62368e2800cb3c5abd348da7e53f6c362dda502ec27c560b2e58a66bd33"}, - {file = "colorlog-6.8.2.tar.gz", hash = "sha256:3e3e079a41feb5a1b64f978b5ea4f46040a94f11f0e8bbb8261e3dbbeca64d44"}, + {file = "colorlog-6.9.0-py3-none-any.whl", hash = "sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff"}, + {file = "colorlog-6.9.0.tar.gz", hash = "sha256:bfba54a1b93b94f54e1f4fe48395725a3d92fd2a4af702f6bd70946bdc0c6ac2"}, ] [package.dependencies] @@ -259,31 +248,26 @@ [[package]] name = "filelock" -version = "3.15.4" +version = "3.19.1" description = "A platform independent file lock." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, - {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, + {file = "filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d"}, + {file = "filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58"}, ] -[package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] -typing = ["typing-extensions (>=4.8) ; python_version < \"3.11\""] - [[package]] name = "fsspec" -version = "2024.6.1" +version = "2025.9.0" description = "File-system specification" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e"}, - {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, + {file = "fsspec-2025.9.0-py3-none-any.whl", hash = "sha256:530dc2a2af60a414a832059574df4a6e10cce927f6f4a78209390fe38955cfb7"}, + {file = "fsspec-2025.9.0.tar.gz", hash = "sha256:19fd429483d25d28b65ec68f9f4adc16c17ea2c7c7bf54ec61360d478fb19c19"}, ] [package.extras] @@ -291,7 +275,7 @@ adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] -dev = ["pre-commit", "ruff"] +dev = ["pre-commit", "ruff (>=0.5)"] doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] dropbox = ["dropbox", "dropboxdrivefs", "requests"] full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] @@ -310,99 +294,95 @@ smb = ["smbprotocol"] ssh = ["paramiko"] test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] -test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] -test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard ; python_version < \"3.14\""] tqdm = ["tqdm"] [[package]] name = "greenlet" -version = "3.0.3" +version = "3.2.4" description = "Lightweight in-process concurrent programming" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" groups = ["main"] -markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")" +markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\"" files = [ - {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, - {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, - {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, - {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, - {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, - {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, - {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, - {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, - {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, - {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, - {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, - {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, - {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, - {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, - {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, - {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, + {file = "greenlet-3.2.4-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8c68325b0d0acf8d91dde4e6f930967dd52a5302cd4062932a6b2e7c2969f47c"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:94385f101946790ae13da500603491f04a76b6e4c059dab271b3ce2e283b2590"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f10fd42b5ee276335863712fa3da6608e93f70629c631bf77145021600abc23c"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c8c9e331e58180d0d83c5b7999255721b725913ff6bc6cf39fa2a45841a4fd4b"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58b97143c9cc7b86fc458f215bd0932f1757ce649e05b640fea2e79b54cedb31"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2ca18a03a8cfb5b25bc1cbe20f3d9a4c80d8c3b13ba3df49ac3961af0b1018d"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fe0a28a7b952a21e2c062cd5756d34354117796c6d9215a87f55e38d15402c5"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8854167e06950ca75b898b104b63cc646573aa5fef1353d4508ecdd1ee76254f"}, + {file = "greenlet-3.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:73f49b5368b5359d04e18d15828eecc1806033db5233397748f4ca813ff1056c"}, + {file = "greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa"}, + {file = "greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9"}, + {file = "greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f"}, + {file = "greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02"}, + {file = "greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae"}, + {file = "greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b"}, + {file = "greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337"}, + {file = "greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01"}, + {file = "greenlet-3.2.4-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:b6a7c19cf0d2742d0809a4c05975db036fdff50cd294a93632d6a310bf9ac02c"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:27890167f55d2387576d1f41d9487ef171849ea0359ce1510ca6e06c8bece11d"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18d9260df2b5fbf41ae5139e1be4e796d99655f023a636cd0e11e6406cca7d58"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:671df96c1f23c4a0d4077a325483c1503c96a1b7d9db26592ae770daa41233d4"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:16458c245a38991aa19676900d48bd1a6f2ce3e16595051a4db9d012154e8433"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9913f1a30e4526f432991f89ae263459b1c64d1608c0d22a5c79c287b3c70df"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b90654e092f928f110e0007f572007c9727b5265f7632c2fa7415b4689351594"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81701fd84f26330f0d5f4944d4e92e61afe6319dcd9775e39396e39d7c3e5f98"}, + {file = "greenlet-3.2.4-cp39-cp39-win32.whl", hash = "sha256:65458b409c1ed459ea899e939f0e1cdb14f58dbc803f2f93c5eab5694d32671b"}, + {file = "greenlet-3.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:d2e685ade4dafd447ede19c31277a224a239a0a1a4eca4e6390efedf20260cfb"}, + {file = "greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d"}, ] [package.extras] docs = ["Sphinx", "furo"] -test = ["objgraph", "psutil"] +test = ["objgraph", "psutil", "setuptools"] [[package]] name = "hf-xet" -version = "1.1.9" +version = "1.1.10" description = "Fast transfer of large files with the Hugging Face Hub." optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "hf_xet-1.1.9-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:a3b6215f88638dd7a6ff82cb4e738dcbf3d863bf667997c093a3c990337d1160"}, - {file = "hf_xet-1.1.9-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:9b486de7a64a66f9a172f4b3e0dfe79c9f0a93257c501296a2521a13495a698a"}, - {file = "hf_xet-1.1.9-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4c5a840c2c4e6ec875ed13703a60e3523bc7f48031dfd750923b2a4d1a5fc3c"}, - {file = "hf_xet-1.1.9-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:96a6139c9e44dad1c52c52520db0fffe948f6bce487cfb9d69c125f254bb3790"}, - {file = "hf_xet-1.1.9-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ad1022e9a998e784c97b2173965d07fe33ee26e4594770b7785a8cc8f922cd95"}, - {file = "hf_xet-1.1.9-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:86754c2d6d5afb11b0a435e6e18911a4199262fe77553f8c50d75e21242193ea"}, - {file = "hf_xet-1.1.9-cp37-abi3-win_amd64.whl", hash = "sha256:5aad3933de6b725d61d51034e04174ed1dce7a57c63d530df0014dea15a40127"}, - {file = "hf_xet-1.1.9.tar.gz", hash = "sha256:c99073ce404462e909f1d5839b2d14a3827b8fe75ed8aed551ba6609c026c803"}, + {file = "hf_xet-1.1.10-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:686083aca1a6669bc85c21c0563551cbcdaa5cf7876a91f3d074a030b577231d"}, + {file = "hf_xet-1.1.10-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:71081925383b66b24eedff3013f8e6bbd41215c3338be4b94ba75fd75b21513b"}, + {file = "hf_xet-1.1.10-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6bceb6361c80c1cc42b5a7b4e3efd90e64630bcf11224dcac50ef30a47e435"}, + {file = "hf_xet-1.1.10-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:eae7c1fc8a664e54753ffc235e11427ca61f4b0477d757cc4eb9ae374b69f09c"}, + {file = "hf_xet-1.1.10-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0a0005fd08f002180f7a12d4e13b22be277725bc23ed0529f8add5c7a6309c06"}, + {file = "hf_xet-1.1.10-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f900481cf6e362a6c549c61ff77468bd59d6dd082f3170a36acfef2eb6a6793f"}, + {file = "hf_xet-1.1.10-cp37-abi3-win_amd64.whl", hash = "sha256:5f54b19cc347c13235ae7ee98b330c26dd65ef1df47e5316ffb1e87713ca7045"}, + {file = "hf_xet-1.1.10.tar.gz", hash = "sha256:408aef343800a2102374a883f283ff29068055c111f003ff840733d3b715bb97"}, ] [package.extras] @@ -410,14 +390,14 @@ [[package]] name = "huggingface-hub" -version = "0.34.4" +version = "0.34.6" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" groups = ["main"] files = [ - {file = "huggingface_hub-0.34.4-py3-none-any.whl", hash = "sha256:9b365d781739c93ff90c359844221beef048403f1bc1f1c123c191257c3c890a"}, - {file = "huggingface_hub-0.34.4.tar.gz", hash = "sha256:a4228daa6fb001be3f4f4bdaf9a0db00e1739235702848df00885c9b5742c85c"}, + {file = "huggingface_hub-0.34.6-py3-none-any.whl", hash = "sha256:3387ec9045f9dc5b5715e4e7392c25b0d23fd539eb925111a1b301e60f2b4883"}, + {file = "huggingface_hub-0.34.6.tar.gz", hash = "sha256:d0824eb012e37594357bb1790dfbe26c8f45eed7e701c1cdae02539e0c06f3f8"}, ] [package.dependencies] @@ -449,16 +429,19 @@ [[package]] name = "idna" -version = "3.8" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" groups = ["main"] files = [ - {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, - {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "isort" version = "6.0.1" @@ -495,26 +478,26 @@ [[package]] name = "joblib" -version = "1.4.2" +version = "1.5.2" description = "Lightweight pipelining with Python functions" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, - {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, + {file = "joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241"}, + {file = "joblib-1.5.2.tar.gz", hash = "sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55"}, ] [[package]] name = "lightning-utilities" -version = "0.14.3" +version = "0.15.2" description = "Lightning toolbox for across the our ecosystem." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "lightning_utilities-0.14.3-py3-none-any.whl", hash = "sha256:4ab9066aa36cd7b93a05713808901909e96cc3f187ea6fd3052b2fd91313b468"}, - {file = "lightning_utilities-0.14.3.tar.gz", hash = "sha256:37e2f83f273890052955a44054382c211a303012ee577619efbaa5df9e65e9f5"}, + {file = "lightning_utilities-0.15.2-py3-none-any.whl", hash = "sha256:ad3ab1703775044bbf880dbf7ddaaac899396c96315f3aa1779cec9d618a9841"}, + {file = "lightning_utilities-0.15.2.tar.gz", hash = "sha256:cdf12f530214a63dacefd713f180d1ecf5d165338101617b4742e8f22c032e24"}, ] [package.dependencies] @@ -523,20 +506,20 @@ typing_extensions = "*" [package.extras] -cli = ["fire"] +cli = ["jsonargparse[signatures] (>=4.38.0)", "tomlkit"] docs = ["requests (>=2.0.0)"] -typing = ["fire", "mypy (>=1.0.0)", "types-setuptools"] +typing = ["mypy (>=1.0.0)", "types-setuptools"] [[package]] name = "mako" -version = "1.3.5" +version = "1.3.10" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "Mako-1.3.5-py3-none-any.whl", hash = "sha256:260f1dbc3a519453a9c856dedfe4beb4e50bd5a26d96386cb6c80856556bb91a"}, - {file = "Mako-1.3.5.tar.gz", hash = "sha256:48dbc20568c1d276a2698b36d968fa76161bf127194907ea6fc594fa81f943bc"}, + {file = "mako-1.3.10-py3-none-any.whl", hash = "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59"}, + {file = "mako-1.3.10.tar.gz", hash = "sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28"}, ] [package.dependencies] @@ -549,72 +532,101 @@ [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.3" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, + {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1"}, + {file = "markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a"}, + {file = "markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b"}, + {file = "markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12"}, + {file = "markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe"}, + {file = "markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d"}, + {file = "markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8"}, + {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"}, ] [[package]] @@ -649,22 +661,24 @@ [[package]] name = "networkx" -version = "3.1" +version = "3.5" description = "Python package for creating and manipulating graphs and networks" optional = false -python-versions = ">=3.8" +python-versions = ">=3.11" groups = ["main"] files = [ - {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, - {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, + {file = "networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec"}, + {file = "networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037"}, ] [package.extras] -default = ["matplotlib (>=3.4)", "numpy (>=1.20)", "pandas (>=1.3)", "scipy (>=1.8)"] -developer = ["mypy (>=1.1)", "pre-commit (>=3.2)"] -doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.13)", "sphinx (>=6.1)", "sphinx-gallery (>=0.12)", "texext (>=0.6.7)"] -extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.10)", "sympy (>=1.10)"] -test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] +default = ["matplotlib (>=3.8)", "numpy (>=1.25)", "pandas (>=2.0)", "scipy (>=1.11.2)"] +developer = ["mypy (>=1.15)", "pre-commit (>=4.1)"] +doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=10)", "pydata-sphinx-theme (>=0.16)", "sphinx (>=8.0)", "sphinx-gallery (>=0.18)", "texext (>=0.6.7)"] +example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "momepy (>=0.7.2)", "osmnx (>=2.0.0)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"] +extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)", "pytest-xdist (>=3.0)"] +test-extras = ["pytest-mpl", "pytest-randomly"] [[package]] name = "numpy" @@ -752,76 +766,72 @@ [[package]] name = "nvidia-cublas-cu12" -version = "12.6.4.1" +version = "12.8.4.1" description = "CUBLAS native runtime libraries" optional = false python-versions = ">=3" groups = ["main"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08ed2686e9875d01b58e3cb379c6896df8e76c75e0d4a7f7dace3d7b6d9ef8eb"}, - {file = "nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:235f728d6e2a409eddf1df58d5b0921cf80cfa9e72b9f2775ccb7b4a87984668"}, - {file = "nvidia_cublas_cu12-12.6.4.1-py3-none-win_amd64.whl", hash = "sha256:9e4fa264f4d8a4eb0cdbd34beadc029f453b3bafae02401e999cf3d5a5af75f8"}, + {file = "nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b86f6dd8935884615a0683b663891d43781b819ac4f2ba2b0c9604676af346d0"}, + {file = "nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:8ac4e771d5a348c551b2a426eda6193c19aa630236b418086020df5ba9667142"}, + {file = "nvidia_cublas_cu12-12.8.4.1-py3-none-win_amd64.whl", hash = "sha256:47e9b82132fa8d2b4944e708049229601448aaad7e6f296f630f2d1a32de35af"}, ] [[package]] name = "nvidia-cuda-cupti-cu12" -version = "12.6.80" +version = "12.8.90" description = "CUDA profiling tools runtime libs." optional = false python-versions = ">=3" groups = ["main"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:166ee35a3ff1587f2490364f90eeeb8da06cd867bd5b701bf7f9a02b78bc63fc"}, - {file = "nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_aarch64.whl", hash = "sha256:358b4a1d35370353d52e12f0a7d1769fc01ff74a191689d3870b2123156184c4"}, - {file = "nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6768bad6cab4f19e8292125e5f1ac8aa7d1718704012a0e3272a6f61c4bce132"}, - {file = "nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a3eff6cdfcc6a4c35db968a06fcadb061cbc7d6dde548609a941ff8701b98b73"}, - {file = "nvidia_cuda_cupti_cu12-12.6.80-py3-none-win_amd64.whl", hash = "sha256:bbe6ae76e83ce5251b56e8c8e61a964f757175682bbad058b170b136266ab00a"}, + {file = "nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4412396548808ddfed3f17a467b104ba7751e6b58678a4b840675c56d21cf7ed"}, + {file = "nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea0cb07ebda26bb9b29ba82cda34849e73c166c18162d3913575b0c9db9a6182"}, + {file = "nvidia_cuda_cupti_cu12-12.8.90-py3-none-win_amd64.whl", hash = "sha256:bb479dcdf7e6d4f8b0b01b115260399bf34154a1a2e9fe11c85c517d87efd98e"}, ] [[package]] name = "nvidia-cuda-nvrtc-cu12" -version = "12.6.77" +version = "12.8.93" description = "NVRTC native runtime libraries" optional = false python-versions = ">=3" groups = ["main"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cuda_nvrtc_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5847f1d6e5b757f1d2b3991a01082a44aad6f10ab3c5c0213fa3e25bddc25a13"}, - {file = "nvidia_cuda_nvrtc_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:35b0cc6ee3a9636d5409133e79273ce1f3fd087abb0532d2d2e8fff1fe9efc53"}, - {file = "nvidia_cuda_nvrtc_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:f7007dbd914c56bd80ea31bc43e8e149da38f68158f423ba845fc3292684e45a"}, + {file = "nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a7756528852ef889772a84c6cd89d41dfa74667e24cca16bb31f8f061e3e9994"}, + {file = "nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc1fec1e1637854b4c0a65fb9a8346b51dd9ee69e61ebaccc82058441f15bce8"}, + {file = "nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-win_amd64.whl", hash = "sha256:7a4b6b2904850fe78e0bd179c4b655c404d4bb799ef03ddc60804247099ae909"}, ] [[package]] name = "nvidia-cuda-runtime-cu12" -version = "12.6.77" +version = "12.8.90" description = "CUDA Runtime native Libraries" optional = false python-versions = ">=3" groups = ["main"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6116fad3e049e04791c0256a9778c16237837c08b27ed8c8401e2e45de8d60cd"}, - {file = "nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d461264ecb429c84c8879a7153499ddc7b19b5f8d84c204307491989a365588e"}, - {file = "nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ba3b56a4f896141e25e19ab287cd71e52a6a0f4b29d0d31609f60e3b4d5219b7"}, - {file = "nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a84d15d5e1da416dd4774cb42edf5e954a3e60cc945698dc1d5be02321c44dc8"}, - {file = "nvidia_cuda_runtime_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:86c58044c824bf3c173c49a2dbc7a6c8b53cb4e4dca50068be0bf64e9dab3f7f"}, + {file = "nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:52bf7bbee900262ffefe5e9d5a2a69a30d97e2bc5bb6cc866688caa976966e3d"}, + {file = "nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adade8dcbd0edf427b7204d480d6066d33902cab2a4707dcfc48a2d0fd44ab90"}, + {file = "nvidia_cuda_runtime_cu12-12.8.90-py3-none-win_amd64.whl", hash = "sha256:c0c6027f01505bfed6c3b21ec546f69c687689aad5f1a377554bc6ca4aa993a8"}, ] [[package]] name = "nvidia-cudnn-cu12" -version = "9.5.1.17" +version = "9.10.2.21" description = "cuDNN runtime libraries" optional = false python-versions = ">=3" groups = ["main"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cudnn_cu12-9.5.1.17-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:9fd4584468533c61873e5fda8ca41bac3a38bcb2d12350830c69b0a96a7e4def"}, - {file = "nvidia_cudnn_cu12-9.5.1.17-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:30ac3869f6db17d170e0e556dd6cc5eee02647abc31ca856634d5a40f82c15b2"}, - {file = "nvidia_cudnn_cu12-9.5.1.17-py3-none-win_amd64.whl", hash = "sha256:d7af0f8a4f3b4b9dbb3122f2ef553b45694ed9c384d5a75bab197b8eefb79ab8"}, + {file = "nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:c9132cc3f8958447b4910a1720036d9eff5928cc3179b0a51fb6d167c6cc87d8"}, + {file = "nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8"}, + {file = "nvidia_cudnn_cu12-9.10.2.21-py3-none-win_amd64.whl", hash = "sha256:c6288de7d63e6cf62988f0923f96dc339cea362decb1bf5b3141883392a7d65e"}, ] [package.dependencies] @@ -829,18 +839,16 @@ [[package]] name = "nvidia-cufft-cu12" -version = "11.3.0.4" +version = "11.3.3.83" description = "CUFFT native runtime libraries" optional = false python-versions = ">=3" groups = ["main"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d16079550df460376455cba121db6564089176d9bac9e4f360493ca4741b22a6"}, - {file = "nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8510990de9f96c803a051822618d42bf6cb8f069ff3f48d93a8486efdacb48fb"}, - {file = "nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ccba62eb9cef5559abd5e0d54ceed2d9934030f51163df018532142a8ec533e5"}, - {file = "nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.whl", hash = "sha256:768160ac89f6f7b459bee747e8d175dbf53619cfe74b2a5636264163138013ca"}, - {file = "nvidia_cufft_cu12-11.3.0.4-py3-none-win_amd64.whl", hash = "sha256:6048ebddfb90d09d2707efb1fd78d4e3a77cb3ae4dc60e19aab6be0ece2ae464"}, + {file = "nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:848ef7224d6305cdb2a4df928759dca7b1201874787083b6e7550dd6765ce69a"}, + {file = "nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74"}, + {file = "nvidia_cufft_cu12-11.3.3.83-py3-none-win_amd64.whl", hash = "sha256:7a64a98ef2a7c47f905aaf8931b69a3a43f27c55530c698bb2ed7c75c0b42cb7"}, ] [package.dependencies] @@ -848,47 +856,43 @@ [[package]] name = "nvidia-cufile-cu12" -version = "1.11.1.6" +version = "1.13.1.3" description = "cuFile GPUDirect libraries" optional = false python-versions = ">=3" groups = ["main"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cufile_cu12-1.11.1.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc23469d1c7e52ce6c1d55253273d32c565dd22068647f3aa59b3c6b005bf159"}, - {file = "nvidia_cufile_cu12-1.11.1.6-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:8f57a0051dcf2543f6dc2b98a98cb2719c37d3cee1baba8965d57f3bbc90d4db"}, + {file = "nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d069003be650e131b21c932ec3d8969c1715379251f8d23a1860554b1cb24fc"}, + {file = "nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:4beb6d4cce47c1a0f1013d72e02b0994730359e17801d395bdcbf20cfb3bb00a"}, ] [[package]] name = "nvidia-curand-cu12" -version = "10.3.7.77" +version = "10.3.9.90" description = "CURAND native runtime libraries" optional = false python-versions = ">=3" groups = ["main"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:6e82df077060ea28e37f48a3ec442a8f47690c7499bff392a5938614b56c98d8"}, - {file = "nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a42cd1344297f70b9e39a1e4f467a4e1c10f1da54ff7a85c12197f6c652c8bdf"}, - {file = "nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:99f1a32f1ac2bd134897fc7a203f779303261268a65762a623bf30cc9fe79117"}, - {file = "nvidia_curand_cu12-10.3.7.77-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:7b2ed8e95595c3591d984ea3603dd66fe6ce6812b886d59049988a712ed06b6e"}, - {file = "nvidia_curand_cu12-10.3.7.77-py3-none-win_amd64.whl", hash = "sha256:6d6d935ffba0f3d439b7cd968192ff068fafd9018dbf1b85b37261b13cfc9905"}, + {file = "nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:dfab99248034673b779bc6decafdc3404a8a6f502462201f2f31f11354204acd"}, + {file = "nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:b32331d4f4df5d6eefa0554c565b626c7216f87a06a4f56fab27c3b68a830ec9"}, + {file = "nvidia_curand_cu12-10.3.9.90-py3-none-win_amd64.whl", hash = "sha256:f149a8ca457277da854f89cf282d6ef43176861926c7ac85b2a0fbd237c587ec"}, ] [[package]] name = "nvidia-cusolver-cu12" -version = "11.7.1.2" +version = "11.7.3.90" description = "CUDA solver native runtime libraries" optional = false python-versions = ">=3" groups = ["main"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0ce237ef60acde1efc457335a2ddadfd7610b892d94efee7b776c64bb1cac9e0"}, - {file = "nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e9e49843a7707e42022babb9bcfa33c29857a93b88020c4e4434656a655b698c"}, - {file = "nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6cf28f17f64107a0c4d7802be5ff5537b2130bfc112f25d5a30df227058ca0e6"}, - {file = "nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:dbbe4fc38ec1289c7e5230e16248365e375c3673c9c8bac5796e2e20db07f56e"}, - {file = "nvidia_cusolver_cu12-11.7.1.2-py3-none-win_amd64.whl", hash = "sha256:6813f9d8073f555444a8705f3ab0296d3e1cb37a16d694c5fc8b862a0d8706d7"}, + {file = "nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:db9ed69dbef9715071232caa9b69c52ac7de3a95773c2db65bdba85916e4e5c0"}, + {file = "nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450"}, + {file = "nvidia_cusolver_cu12-11.7.3.90-py3-none-win_amd64.whl", hash = "sha256:4a550db115fcabc4d495eb7d39ac8b58d4ab5d8e63274d3754df1c0ad6a22d34"}, ] [package.dependencies] @@ -898,18 +902,16 @@ [[package]] name = "nvidia-cusparse-cu12" -version = "12.5.4.2" +version = "12.5.8.93" description = "CUSPARSE native runtime libraries" optional = false python-versions = ">=3" groups = ["main"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d25b62fb18751758fe3c93a4a08eff08effedfe4edf1c6bb5afd0890fe88f887"}, - {file = "nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7aa32fa5470cf754f72d1116c7cbc300b4e638d3ae5304cfa4a638a5b87161b1"}, - {file = "nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7556d9eca156e18184b94947ade0fba5bb47d69cec46bf8660fd2c71a4b48b73"}, - {file = "nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:23749a6571191a215cb74d1cdbff4a86e7b19f1200c071b3fcf844a5bea23a2f"}, - {file = "nvidia_cusparse_cu12-12.5.4.2-py3-none-win_amd64.whl", hash = "sha256:4acb8c08855a26d737398cba8fb6f8f5045d93f82612b4cfd84645a2332ccf20"}, + {file = "nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b6c161cb130be1a07a27ea6923df8141f3c295852f4b260c65f18f3e0a091dc"}, + {file = "nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b"}, + {file = "nvidia_cusparse_cu12-12.5.8.93-py3-none-win_amd64.whl", hash = "sha256:9a33604331cb2cac199f2e7f5104dfbb8a5a898c367a53dfda9ff2acb6b6b4dd"}, ] [package.dependencies] @@ -917,59 +919,57 @@ [[package]] name = "nvidia-cusparselt-cu12" -version = "0.6.3" +version = "0.7.1" description = "NVIDIA cuSPARSELt" optional = false python-versions = "*" groups = ["main"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_cusparselt_cu12-0.6.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8371549623ba601a06322af2133c4a44350575f5a3108fb75f3ef20b822ad5f1"}, - {file = "nvidia_cusparselt_cu12-0.6.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e5c8a26c36445dd2e6812f1177978a24e2d37cacce7e090f297a688d1ec44f46"}, - {file = "nvidia_cusparselt_cu12-0.6.3-py3-none-win_amd64.whl", hash = "sha256:3b325bcbd9b754ba43df5a311488fca11a6b5dc3d11df4d190c000cf1a0765c7"}, + {file = "nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8878dce784d0fac90131b6817b607e803c36e629ba34dc5b433471382196b6a5"}, + {file = "nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f1bb701d6b930d5a7cea44c19ceb973311500847f81b634d802b7b539dc55623"}, + {file = "nvidia_cusparselt_cu12-0.7.1-py3-none-win_amd64.whl", hash = "sha256:f67fbb5831940ec829c9117b7f33807db9f9678dc2a617fbe781cac17b4e1075"}, ] [[package]] name = "nvidia-nccl-cu12" -version = "2.26.2" +version = "2.27.3" description = "NVIDIA Collective Communication Library (NCCL) Runtime" optional = false python-versions = ">=3" groups = ["main"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_nccl_cu12-2.26.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c196e95e832ad30fbbb50381eb3cbd1fadd5675e587a548563993609af19522"}, - {file = "nvidia_nccl_cu12-2.26.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:694cf3879a206553cc9d7dbda76b13efaf610fdb70a50cba303de1b0d1530ac6"}, + {file = "nvidia_nccl_cu12-2.27.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9ddf1a245abc36c550870f26d537a9b6087fb2e2e3d6e0ef03374c6fd19d984f"}, + {file = "nvidia_nccl_cu12-2.27.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adf27ccf4238253e0b826bce3ff5fa532d65fc42322c8bfdfaf28024c0fbe039"}, ] [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.6.85" +version = "12.8.93" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" groups = ["main"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:eedc36df9e88b682efe4309aa16b5b4e78c2407eac59e8c10a6a47535164369a"}, - {file = "nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cf4eaa7d4b6b543ffd69d6abfb11efdeb2db48270d94dfd3a452c24150829e41"}, - {file = "nvidia_nvjitlink_cu12-12.6.85-py3-none-win_amd64.whl", hash = "sha256:e61120e52ed675747825cdd16febc6a0730537451d867ee58bee3853b1b13d1c"}, + {file = "nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:81ff63371a7ebd6e6451970684f916be2eab07321b73c9d244dc2b4da7f73b88"}, + {file = "nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:adccd7161ace7261e01bb91e44e88da350895c270d23f744f0820c818b7229e7"}, + {file = "nvidia_nvjitlink_cu12-12.8.93-py3-none-win_amd64.whl", hash = "sha256:bd93fbeeee850917903583587f4fc3a4eafa022e34572251368238ab5e6bd67f"}, ] [[package]] name = "nvidia-nvtx-cu12" -version = "12.6.77" +version = "12.8.90" description = "NVIDIA Tools Extension" optional = false python-versions = ">=3" groups = ["main"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f44f8d86bb7d5629988d61c8d3ae61dddb2015dee142740536bc7481b022fe4b"}, - {file = "nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:adcaabb9d436c9761fca2b13959a2d237c5f9fd406c8e4b723c695409ff88059"}, - {file = "nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b90bed3df379fa79afbd21be8e04a0314336b8ae16768b58f2d34cb1d04cd7d2"}, - {file = "nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6574241a3ec5fdc9334353ab8c479fe75841dbe8f4532a8fc97ce63503330ba1"}, - {file = "nvidia_nvtx_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:2fb11a4af04a5e6c84073e6404d26588a34afd35379f0855a99797897efa75c0"}, + {file = "nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d7ad891da111ebafbf7e015d34879f7112832fc239ff0d7d776b6cb685274615"}, + {file = "nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b17e2001cc0d751a5bc2c6ec6d26ad95913324a4adb86788c944f8ce9ba441f"}, + {file = "nvidia_nvtx_cu12-12.8.90-py3-none-win_amd64.whl", hash = "sha256:619c8304aedc69f02ea82dd244541a83c3d9d40993381b3b590f1adaed3db41e"}, ] [[package]] @@ -1002,66 +1002,79 @@ [[package]] name = "packaging" -version = "24.1" +version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, ] [[package]] name = "pandas" -version = "2.3.2" +version = "2.3.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "pandas-2.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52bc29a946304c360561974c6542d1dd628ddafa69134a7131fdfd6a5d7a1a35"}, - {file = "pandas-2.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:220cc5c35ffaa764dd5bb17cf42df283b5cb7fdf49e10a7b053a06c9cb48ee2b"}, - {file = "pandas-2.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c05e15111221384019897df20c6fe893b2f697d03c811ee67ec9e0bb5a3424"}, - {file = "pandas-2.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc03acc273c5515ab69f898df99d9d4f12c4d70dbfc24c3acc6203751d0804cf"}, - {file = "pandas-2.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d25c20a03e8870f6339bcf67281b946bd20b86f1a544ebbebb87e66a8d642cba"}, - {file = "pandas-2.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21bb612d148bb5860b7eb2c10faacf1a810799245afd342cf297d7551513fbb6"}, - {file = "pandas-2.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:b62d586eb25cb8cb70a5746a378fc3194cb7f11ea77170d59f889f5dfe3cec7a"}, - {file = "pandas-2.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1333e9c299adcbb68ee89a9bb568fc3f20f9cbb419f1dd5225071e6cddb2a743"}, - {file = "pandas-2.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:76972bcbd7de8e91ad5f0ca884a9f2c477a2125354af624e022c49e5bd0dfff4"}, - {file = "pandas-2.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b98bdd7c456a05eef7cd21fd6b29e3ca243591fe531c62be94a2cc987efb5ac2"}, - {file = "pandas-2.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d81573b3f7db40d020983f78721e9bfc425f411e616ef019a10ebf597aedb2e"}, - {file = "pandas-2.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e190b738675a73b581736cc8ec71ae113d6c3768d0bd18bffa5b9a0927b0b6ea"}, - {file = "pandas-2.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c253828cb08f47488d60f43c5fc95114c771bbfff085da54bfc79cb4f9e3a372"}, - {file = "pandas-2.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:9467697b8083f9667b212633ad6aa4ab32436dcbaf4cd57325debb0ddef2012f"}, - {file = "pandas-2.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fbb977f802156e7a3f829e9d1d5398f6192375a3e2d1a9ee0803e35fe70a2b9"}, - {file = "pandas-2.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b9b52693123dd234b7c985c68b709b0b009f4521000d0525f2b95c22f15944b"}, - {file = "pandas-2.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bd281310d4f412733f319a5bc552f86d62cddc5f51d2e392c8787335c994175"}, - {file = "pandas-2.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96d31a6b4354e3b9b8a2c848af75d31da390657e3ac6f30c05c82068b9ed79b9"}, - {file = "pandas-2.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:df4df0b9d02bb873a106971bb85d448378ef14b86ba96f035f50bbd3688456b4"}, - {file = "pandas-2.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:213a5adf93d020b74327cb2c1b842884dbdd37f895f42dcc2f09d451d949f811"}, - {file = "pandas-2.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c13b81a9347eb8c7548f53fd9a4f08d4dfe996836543f805c987bafa03317ae"}, - {file = "pandas-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0c6ecbac99a354a051ef21c5307601093cb9e0f4b1855984a084bfec9302699e"}, - {file = "pandas-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c6f048aa0fd080d6a06cc7e7537c09b53be6642d330ac6f54a600c3ace857ee9"}, - {file = "pandas-2.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0064187b80a5be6f2f9c9d6bdde29372468751dfa89f4211a3c5871854cfbf7a"}, - {file = "pandas-2.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac8c320bded4718b298281339c1a50fb00a6ba78cb2a63521c39bec95b0209b"}, - {file = "pandas-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:114c2fe4f4328cf98ce5716d1532f3ab79c5919f95a9cfee81d9140064a2e4d6"}, - {file = "pandas-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:48fa91c4dfb3b2b9bfdb5c24cd3567575f4e13f9636810462ffed8925352be5a"}, - {file = "pandas-2.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:12d039facec710f7ba305786837d0225a3444af7bbd9c15c32ca2d40d157ed8b"}, - {file = "pandas-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c624b615ce97864eb588779ed4046186f967374185c047070545253a52ab2d57"}, - {file = "pandas-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0cee69d583b9b128823d9514171cabb6861e09409af805b54459bd0c821a35c2"}, - {file = "pandas-2.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2319656ed81124982900b4c37f0e0c58c015af9a7bbc62342ba5ad07ace82ba9"}, - {file = "pandas-2.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b37205ad6f00d52f16b6d09f406434ba928c1a1966e2771006a9033c736d30d2"}, - {file = "pandas-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:837248b4fc3a9b83b9c6214699a13f069dc13510a6a6d7f9ba33145d2841a012"}, - {file = "pandas-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d2c3554bd31b731cd6490d94a28f3abb8dd770634a9e06eb6d2911b9827db370"}, - {file = "pandas-2.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88080a0ff8a55eac9c84e3ff3c7665b3b5476c6fbc484775ca1910ce1c3e0b87"}, - {file = "pandas-2.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d4a558c7620340a0931828d8065688b3cc5b4c8eb674bcaf33d18ff4a6870b4a"}, - {file = "pandas-2.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45178cf09d1858a1509dc73ec261bf5b25a625a389b65be2e47b559905f0ab6a"}, - {file = "pandas-2.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77cefe00e1b210f9c76c697fedd8fdb8d3dd86563e9c8adc9fa72b90f5e9e4c2"}, - {file = "pandas-2.3.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:13bd629c653856f00c53dc495191baa59bcafbbf54860a46ecc50d3a88421a96"}, - {file = "pandas-2.3.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:36d627906fd44b5fd63c943264e11e96e923f8de77d6016dc2f667b9ad193438"}, - {file = "pandas-2.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:a9d7ec92d71a420185dec44909c32e9a362248c4ae2238234b76d5be37f208cc"}, - {file = "pandas-2.3.2.tar.gz", hash = "sha256:ab7b58f8f82706890924ccdfb5f48002b83d2b5a3845976a9fb705d36c34dcdb"}, + {file = "pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c"}, + {file = "pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a"}, + {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1"}, + {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838"}, + {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250"}, + {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4"}, + {file = "pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826"}, + {file = "pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523"}, + {file = "pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45"}, + {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66"}, + {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b"}, + {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791"}, + {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151"}, + {file = "pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c"}, + {file = "pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53"}, + {file = "pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35"}, + {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908"}, + {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89"}, + {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98"}, + {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084"}, + {file = "pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b"}, + {file = "pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713"}, + {file = "pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8"}, + {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d"}, + {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac"}, + {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c"}, + {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493"}, + {file = "pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee"}, + {file = "pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5"}, + {file = "pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21"}, + {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78"}, + {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110"}, + {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86"}, + {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc"}, + {file = "pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0"}, + {file = "pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593"}, + {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c"}, + {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b"}, + {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6"}, + {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3"}, + {file = "pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5"}, + {file = "pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec"}, + {file = "pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7"}, + {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450"}, + {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5"}, + {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788"}, + {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87"}, + {file = "pandas-2.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2"}, + {file = "pandas-2.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8"}, + {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff"}, + {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29"}, + {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73"}, + {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9"}, + {file = "pandas-2.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa"}, + {file = "pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b"}, ] [package.dependencies] @@ -1130,14 +1143,14 @@ [[package]] name = "platformdirs" -version = "4.3.8" +version = "4.4.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, - {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, + {file = "platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85"}, + {file = "platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf"}, ] [package.extras] @@ -1147,27 +1160,26 @@ [[package]] name = "psutil" -version = "7.0.0" -description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." +version = "7.1.0" +description = "Cross-platform lib for process and system monitoring." optional = false python-versions = ">=3.6" groups = ["main"] files = [ - {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, - {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993"}, - {file = "psutil-7.0.0-cp36-cp36m-win32.whl", hash = "sha256:84df4eb63e16849689f76b1ffcb36db7b8de703d1bc1fe41773db487621b6c17"}, - {file = "psutil-7.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1e744154a6580bc968a0195fd25e80432d3afec619daf145b9e5ba16cc1d688e"}, - {file = "psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99"}, - {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, - {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, + {file = "psutil-7.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76168cef4397494250e9f4e73eb3752b146de1dd950040b29186d0cce1d5ca13"}, + {file = "psutil-7.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:5d007560c8c372efdff9e4579c2846d71de737e4605f611437255e81efcca2c5"}, + {file = "psutil-7.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22e4454970b32472ce7deaa45d045b34d3648ce478e26a04c7e858a0a6e75ff3"}, + {file = "psutil-7.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c70e113920d51e89f212dd7be06219a9b88014e63a4cec69b684c327bc474e3"}, + {file = "psutil-7.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d4a113425c037300de3ac8b331637293da9be9713855c4fc9d2d97436d7259d"}, + {file = "psutil-7.1.0-cp37-abi3-win32.whl", hash = "sha256:09ad740870c8d219ed8daae0ad3b726d3bf9a028a198e7f3080f6a1888b99bca"}, + {file = "psutil-7.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:57f5e987c36d3146c0dd2528cd42151cf96cd359b9d67cfff836995cc5df9a3d"}, + {file = "psutil-7.1.0-cp37-abi3-win_arm64.whl", hash = "sha256:6937cb68133e7c97b6cc9649a570c9a18ba0efebed46d8c5dae4c07fa1b67a07"}, + {file = "psutil-7.1.0.tar.gz", hash = "sha256:655708b3c069387c8b77b072fc429a57d0e214221d01c0a772df7dfedcb3bcd2"}, ] [package.extras] -dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] -test = ["pytest", "pytest-xdist", "setuptools"] +dev = ["abi3audit", "black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pyreadline ; os_name == \"nt\"", "pytest", "pytest-cov", "pytest-instafail", "pytest-subtests", "pytest-xdist", "pywin32 ; os_name == \"nt\" and platform_python_implementation != \"PyPy\"", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel", "wheel ; os_name == \"nt\" and platform_python_implementation != \"PyPy\"", "wmi ; os_name == \"nt\" and platform_python_implementation != \"PyPy\""] +test = ["pytest", "pytest-instafail", "pytest-subtests", "pytest-xdist", "pywin32 ; os_name == \"nt\" and platform_python_implementation != \"PyPy\"", "setuptools", "wheel ; os_name == \"nt\" and platform_python_implementation != \"PyPy\"", "wmi ; os_name == \"nt\" and platform_python_implementation != \"PyPy\""] [[package]] name = "python-dateutil" @@ -1186,181 +1198,222 @@ [[package]] name = "pytz" -version = "2024.1" +version = "2025.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" groups = ["main"] files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, + {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, + {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, ] [[package]] name = "pyyaml" -version = "6.0.2" +version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, - {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, - {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, - {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, + {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6"}, + {file = "PyYAML-6.0.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369"}, + {file = "PyYAML-6.0.3-cp38-cp38-win32.whl", hash = "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295"}, + {file = "PyYAML-6.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"}, + {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"}, + {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"}, + {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"}, + {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"}, + {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be"}, + {file = "pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7"}, + {file = "pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0"}, + {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"}, + {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, ] [[package]] name = "regex" -version = "2024.11.6" +version = "2025.9.18" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, - {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, - {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"}, - {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"}, - {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"}, - {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"}, - {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"}, - {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"}, - {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"}, - {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"}, - {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"}, - {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"}, - {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"}, - {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"}, - {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"}, - {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"}, - {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"}, - {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"}, - {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"}, - {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"}, - {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"}, - {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"}, - {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"}, - {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"}, - {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"}, - {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"}, - {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"}, - {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"}, - {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"}, - {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"}, - {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, + {file = "regex-2025.9.18-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:12296202480c201c98a84aecc4d210592b2f55e200a1d193235c4db92b9f6788"}, + {file = "regex-2025.9.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:220381f1464a581f2ea988f2220cf2a67927adcef107d47d6897ba5a2f6d51a4"}, + {file = "regex-2025.9.18-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87f681bfca84ebd265278b5daa1dcb57f4db315da3b5d044add7c30c10442e61"}, + {file = "regex-2025.9.18-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34d674cbba70c9398074c8a1fcc1a79739d65d1105de2a3c695e2b05ea728251"}, + {file = "regex-2025.9.18-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:385c9b769655cb65ea40b6eea6ff763cbb6d69b3ffef0b0db8208e1833d4e746"}, + {file = "regex-2025.9.18-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8900b3208e022570ae34328712bef6696de0804c122933414014bae791437ab2"}, + {file = "regex-2025.9.18-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c204e93bf32cd7a77151d44b05eb36f469d0898e3fba141c026a26b79d9914a0"}, + {file = "regex-2025.9.18-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3acc471d1dd7e5ff82e6cacb3b286750decd949ecd4ae258696d04f019817ef8"}, + {file = "regex-2025.9.18-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6479d5555122433728760e5f29edb4c2b79655a8deb681a141beb5c8a025baea"}, + {file = "regex-2025.9.18-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:431bd2a8726b000eb6f12429c9b438a24062a535d06783a93d2bcbad3698f8a8"}, + {file = "regex-2025.9.18-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0cc3521060162d02bd36927e20690129200e5ac9d2c6d32b70368870b122db25"}, + {file = "regex-2025.9.18-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a021217b01be2d51632ce056d7a837d3fa37c543ede36e39d14063176a26ae29"}, + {file = "regex-2025.9.18-cp310-cp310-win32.whl", hash = "sha256:4a12a06c268a629cb67cc1d009b7bb0be43e289d00d5111f86a2efd3b1949444"}, + {file = "regex-2025.9.18-cp310-cp310-win_amd64.whl", hash = "sha256:47acd811589301298c49db2c56bde4f9308d6396da92daf99cba781fa74aa450"}, + {file = "regex-2025.9.18-cp310-cp310-win_arm64.whl", hash = "sha256:16bd2944e77522275e5ee36f867e19995bcaa533dcb516753a26726ac7285442"}, + {file = "regex-2025.9.18-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:51076980cd08cd13c88eb7365427ae27f0d94e7cebe9ceb2bb9ffdae8fc4d82a"}, + {file = "regex-2025.9.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:828446870bd7dee4e0cbeed767f07961aa07f0ea3129f38b3ccecebc9742e0b8"}, + {file = "regex-2025.9.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c28821d5637866479ec4cc23b8c990f5bc6dd24e5e4384ba4a11d38a526e1414"}, + {file = "regex-2025.9.18-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:726177ade8e481db669e76bf99de0b278783be8acd11cef71165327abd1f170a"}, + {file = "regex-2025.9.18-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f5cca697da89b9f8ea44115ce3130f6c54c22f541943ac8e9900461edc2b8bd4"}, + {file = "regex-2025.9.18-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dfbde38f38004703c35666a1e1c088b778e35d55348da2b7b278914491698d6a"}, + {file = "regex-2025.9.18-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f2f422214a03fab16bfa495cfec72bee4aaa5731843b771860a471282f1bf74f"}, + {file = "regex-2025.9.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a295916890f4df0902e4286bc7223ee7f9e925daa6dcdec4192364255b70561a"}, + {file = "regex-2025.9.18-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5db95ff632dbabc8c38c4e82bf545ab78d902e81160e6e455598014f0abe66b9"}, + {file = "regex-2025.9.18-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb967eb441b0f15ae610b7069bdb760b929f267efbf522e814bbbfffdf125ce2"}, + {file = "regex-2025.9.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f04d2f20da4053d96c08f7fde6e1419b7ec9dbcee89c96e3d731fca77f411b95"}, + {file = "regex-2025.9.18-cp311-cp311-win32.whl", hash = "sha256:895197241fccf18c0cea7550c80e75f185b8bd55b6924fcae269a1a92c614a07"}, + {file = "regex-2025.9.18-cp311-cp311-win_amd64.whl", hash = "sha256:7e2b414deae99166e22c005e154a5513ac31493db178d8aec92b3269c9cce8c9"}, + {file = "regex-2025.9.18-cp311-cp311-win_arm64.whl", hash = "sha256:fb137ec7c5c54f34a25ff9b31f6b7b0c2757be80176435bf367111e3f71d72df"}, + {file = "regex-2025.9.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:436e1b31d7efd4dcd52091d076482031c611dde58bf9c46ca6d0a26e33053a7e"}, + {file = "regex-2025.9.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c190af81e5576b9c5fdc708f781a52ff20f8b96386c6e2e0557a78402b029f4a"}, + {file = "regex-2025.9.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e4121f1ce2b2b5eec4b397cc1b277686e577e658d8f5870b7eb2d726bd2300ab"}, + {file = "regex-2025.9.18-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:300e25dbbf8299d87205e821a201057f2ef9aa3deb29caa01cd2cac669e508d5"}, + {file = "regex-2025.9.18-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7b47fcf9f5316c0bdaf449e879407e1b9937a23c3b369135ca94ebc8d74b1742"}, + {file = "regex-2025.9.18-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:57a161bd3acaa4b513220b49949b07e252165e6b6dc910ee7617a37ff4f5b425"}, + {file = "regex-2025.9.18-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f130c3a7845ba42de42f380fff3c8aebe89a810747d91bcf56d40a069f15352"}, + {file = "regex-2025.9.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f96fa342b6f54dcba928dd452e8d8cb9f0d63e711d1721cd765bb9f73bb048d"}, + {file = "regex-2025.9.18-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0f0d676522d68c207828dcd01fb6f214f63f238c283d9f01d85fc664c7c85b56"}, + {file = "regex-2025.9.18-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:40532bff8a1a0621e7903ae57fce88feb2e8a9a9116d341701302c9302aef06e"}, + {file = "regex-2025.9.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:039f11b618ce8d71a1c364fdee37da1012f5a3e79b1b2819a9f389cd82fd6282"}, + {file = "regex-2025.9.18-cp312-cp312-win32.whl", hash = "sha256:e1dd06f981eb226edf87c55d523131ade7285137fbde837c34dc9d1bf309f459"}, + {file = "regex-2025.9.18-cp312-cp312-win_amd64.whl", hash = "sha256:3d86b5247bf25fa3715e385aa9ff272c307e0636ce0c9595f64568b41f0a9c77"}, + {file = "regex-2025.9.18-cp312-cp312-win_arm64.whl", hash = "sha256:032720248cbeeae6444c269b78cb15664458b7bb9ed02401d3da59fe4d68c3a5"}, + {file = "regex-2025.9.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2a40f929cd907c7e8ac7566ac76225a77701a6221bca937bdb70d56cb61f57b2"}, + {file = "regex-2025.9.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c90471671c2cdf914e58b6af62420ea9ecd06d1554d7474d50133ff26ae88feb"}, + {file = "regex-2025.9.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a351aff9e07a2dabb5022ead6380cff17a4f10e4feb15f9100ee56c4d6d06af"}, + {file = "regex-2025.9.18-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc4b8e9d16e20ddfe16430c23468a8707ccad3365b06d4536142e71823f3ca29"}, + {file = "regex-2025.9.18-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4b8cdbddf2db1c5e80338ba2daa3cfa3dec73a46fff2a7dda087c8efbf12d62f"}, + {file = "regex-2025.9.18-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a276937d9d75085b2c91fb48244349c6954f05ee97bba0963ce24a9d915b8b68"}, + {file = "regex-2025.9.18-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92a8e375ccdc1256401c90e9dc02b8642894443d549ff5e25e36d7cf8a80c783"}, + {file = "regex-2025.9.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0dc6893b1f502d73037cf807a321cdc9be29ef3d6219f7970f842475873712ac"}, + {file = "regex-2025.9.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a61e85bfc63d232ac14b015af1261f826260c8deb19401c0597dbb87a864361e"}, + {file = "regex-2025.9.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1ef86a9ebc53f379d921fb9a7e42b92059ad3ee800fcd9e0fe6181090e9f6c23"}, + {file = "regex-2025.9.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d3bc882119764ba3a119fbf2bd4f1b47bc56c1da5d42df4ed54ae1e8e66fdf8f"}, + {file = "regex-2025.9.18-cp313-cp313-win32.whl", hash = "sha256:3810a65675845c3bdfa58c3c7d88624356dd6ee2fc186628295e0969005f928d"}, + {file = "regex-2025.9.18-cp313-cp313-win_amd64.whl", hash = "sha256:16eaf74b3c4180ede88f620f299e474913ab6924d5c4b89b3833bc2345d83b3d"}, + {file = "regex-2025.9.18-cp313-cp313-win_arm64.whl", hash = "sha256:4dc98ba7dd66bd1261927a9f49bd5ee2bcb3660f7962f1ec02617280fc00f5eb"}, + {file = "regex-2025.9.18-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:fe5d50572bc885a0a799410a717c42b1a6b50e2f45872e2b40f4f288f9bce8a2"}, + {file = "regex-2025.9.18-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b9d9a2d6cda6621551ca8cf7a06f103adf72831153f3c0d982386110870c4d3"}, + {file = "regex-2025.9.18-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:13202e4c4ac0ef9a317fff817674b293c8f7e8c68d3190377d8d8b749f566e12"}, + {file = "regex-2025.9.18-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:874ff523b0fecffb090f80ae53dc93538f8db954c8bb5505f05b7787ab3402a0"}, + {file = "regex-2025.9.18-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d13ab0490128f2bb45d596f754148cd750411afc97e813e4b3a61cf278a23bb6"}, + {file = "regex-2025.9.18-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:05440bc172bc4b4b37fb9667e796597419404dbba62e171e1f826d7d2a9ebcef"}, + {file = "regex-2025.9.18-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5514b8e4031fdfaa3d27e92c75719cbe7f379e28cacd939807289bce76d0e35a"}, + {file = "regex-2025.9.18-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:65d3c38c39efce73e0d9dc019697b39903ba25b1ad45ebbd730d2cf32741f40d"}, + {file = "regex-2025.9.18-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ae77e447ebc144d5a26d50055c6ddba1d6ad4a865a560ec7200b8b06bc529368"}, + {file = "regex-2025.9.18-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e3ef8cf53dc8df49d7e28a356cf824e3623764e9833348b655cfed4524ab8a90"}, + {file = "regex-2025.9.18-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9feb29817df349c976da9a0debf775c5c33fc1c8ad7b9f025825da99374770b7"}, + {file = "regex-2025.9.18-cp313-cp313t-win32.whl", hash = "sha256:168be0d2f9b9d13076940b1ed774f98595b4e3c7fc54584bba81b3cc4181742e"}, + {file = "regex-2025.9.18-cp313-cp313t-win_amd64.whl", hash = "sha256:d59ecf3bb549e491c8104fea7313f3563c7b048e01287db0a90485734a70a730"}, + {file = "regex-2025.9.18-cp313-cp313t-win_arm64.whl", hash = "sha256:dbef80defe9fb21310948a2595420b36c6d641d9bea4c991175829b2cc4bc06a"}, + {file = "regex-2025.9.18-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c6db75b51acf277997f3adcd0ad89045d856190d13359f15ab5dda21581d9129"}, + {file = "regex-2025.9.18-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8f9698b6f6895d6db810e0bda5364f9ceb9e5b11328700a90cae573574f61eea"}, + {file = "regex-2025.9.18-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29cd86aa7cb13a37d0f0d7c21d8d949fe402ffa0ea697e635afedd97ab4b69f1"}, + {file = "regex-2025.9.18-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c9f285a071ee55cd9583ba24dde006e53e17780bb309baa8e4289cd472bcc47"}, + {file = "regex-2025.9.18-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5adf266f730431e3be9021d3e5b8d5ee65e563fec2883ea8093944d21863b379"}, + {file = "regex-2025.9.18-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1137cabc0f38807de79e28d3f6e3e3f2cc8cfb26bead754d02e6d1de5f679203"}, + {file = "regex-2025.9.18-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7cc9e5525cada99699ca9223cce2d52e88c52a3d2a0e842bd53de5497c604164"}, + {file = "regex-2025.9.18-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bbb9246568f72dce29bcd433517c2be22c7791784b223a810225af3b50d1aafb"}, + {file = "regex-2025.9.18-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6a52219a93dd3d92c675383efff6ae18c982e2d7651c792b1e6d121055808743"}, + {file = "regex-2025.9.18-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:ae9b3840c5bd456780e3ddf2f737ab55a79b790f6409182012718a35c6d43282"}, + {file = "regex-2025.9.18-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d488c236ac497c46a5ac2005a952c1a0e22a07be9f10c3e735bc7d1209a34773"}, + {file = "regex-2025.9.18-cp314-cp314-win32.whl", hash = "sha256:0c3506682ea19beefe627a38872d8da65cc01ffa25ed3f2e422dffa1474f0788"}, + {file = "regex-2025.9.18-cp314-cp314-win_amd64.whl", hash = "sha256:57929d0f92bebb2d1a83af372cd0ffba2263f13f376e19b1e4fa32aec4efddc3"}, + {file = "regex-2025.9.18-cp314-cp314-win_arm64.whl", hash = "sha256:6a4b44df31d34fa51aa5c995d3aa3c999cec4d69b9bd414a8be51984d859f06d"}, + {file = "regex-2025.9.18-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:b176326bcd544b5e9b17d6943f807697c0cb7351f6cfb45bf5637c95ff7e6306"}, + {file = "regex-2025.9.18-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:0ffd9e230b826b15b369391bec167baed57c7ce39efc35835448618860995946"}, + {file = "regex-2025.9.18-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec46332c41add73f2b57e2f5b642f991f6b15e50e9f86285e08ffe3a512ac39f"}, + {file = "regex-2025.9.18-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b80fa342ed1ea095168a3f116637bd1030d39c9ff38dc04e54ef7c521e01fc95"}, + {file = "regex-2025.9.18-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4d97071c0ba40f0cf2a93ed76e660654c399a0a04ab7d85472239460f3da84b"}, + {file = "regex-2025.9.18-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0ac936537ad87cef9e0e66c5144484206c1354224ee811ab1519a32373e411f3"}, + {file = "regex-2025.9.18-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dec57f96d4def58c422d212d414efe28218d58537b5445cf0c33afb1b4768571"}, + {file = "regex-2025.9.18-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:48317233294648bf7cd068857f248e3a57222259a5304d32c7552e2284a1b2ad"}, + {file = "regex-2025.9.18-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:274687e62ea3cf54846a9b25fc48a04459de50af30a7bd0b61a9e38015983494"}, + {file = "regex-2025.9.18-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a78722c86a3e7e6aadf9579e3b0ad78d955f2d1f1a8ca4f67d7ca258e8719d4b"}, + {file = "regex-2025.9.18-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:06104cd203cdef3ade989a1c45b6215bf42f8b9dd705ecc220c173233f7cba41"}, + {file = "regex-2025.9.18-cp314-cp314t-win32.whl", hash = "sha256:2e1eddc06eeaffd249c0adb6fafc19e2118e6308c60df9db27919e96b5656096"}, + {file = "regex-2025.9.18-cp314-cp314t-win_amd64.whl", hash = "sha256:8620d247fb8c0683ade51217b459cb4a1081c0405a3072235ba43a40d355c09a"}, + {file = "regex-2025.9.18-cp314-cp314t-win_arm64.whl", hash = "sha256:b7531a8ef61de2c647cdf68b3229b071e46ec326b3138b2180acb4275f470b01"}, + {file = "regex-2025.9.18-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3dbcfcaa18e9480669030d07371713c10b4f1a41f791ffa5cb1a99f24e777f40"}, + {file = "regex-2025.9.18-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1e85f73ef7095f0380208269055ae20524bfde3f27c5384126ddccf20382a638"}, + {file = "regex-2025.9.18-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9098e29b3ea4ffffeade423f6779665e2a4f8db64e699c0ed737ef0db6ba7b12"}, + {file = "regex-2025.9.18-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90b6b7a2d0f45b7ecaaee1aec6b362184d6596ba2092dd583ffba1b78dd0231c"}, + {file = "regex-2025.9.18-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c81b892af4a38286101502eae7aec69f7cd749a893d9987a92776954f3943408"}, + {file = "regex-2025.9.18-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3b524d010973f2e1929aeb635418d468d869a5f77b52084d9f74c272189c251d"}, + {file = "regex-2025.9.18-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b498437c026a3d5d0be0020023ff76d70ae4d77118e92f6f26c9d0423452446"}, + {file = "regex-2025.9.18-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0716e4d6e58853d83f6563f3cf25c281ff46cf7107e5f11879e32cb0b59797d9"}, + {file = "regex-2025.9.18-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:065b6956749379d41db2625f880b637d4acc14c0a4de0d25d609a62850e96d36"}, + {file = "regex-2025.9.18-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d4a691494439287c08ddb9b5793da605ee80299dd31e95fa3f323fac3c33d9d4"}, + {file = "regex-2025.9.18-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ef8d10cc0989565bcbe45fb4439f044594d5c2b8919d3d229ea2c4238f1d55b0"}, + {file = "regex-2025.9.18-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4baeb1b16735ac969a7eeecc216f1f8b7caf60431f38a2671ae601f716a32d25"}, + {file = "regex-2025.9.18-cp39-cp39-win32.whl", hash = "sha256:8e5f41ad24a1e0b5dfcf4c4e5d9f5bd54c895feb5708dd0c1d0d35693b24d478"}, + {file = "regex-2025.9.18-cp39-cp39-win_amd64.whl", hash = "sha256:50e8290707f2fb8e314ab3831e594da71e062f1d623b05266f8cfe4db4949afd"}, + {file = "regex-2025.9.18-cp39-cp39-win_arm64.whl", hash = "sha256:039a9d7195fd88c943d7c777d4941e8ef736731947becce773c31a1009cb3c35"}, + {file = "regex-2025.9.18.tar.gz", hash = "sha256:c5ba23274c61c6fef447ba6a39333297d0c247f53059dba0bca415cac511edc4"}, ] [[package]] @@ -1426,14 +1479,14 @@ [[package]] name = "scikit-base" -version = "0.12.4" +version = "0.12.6" description = "Base classes for sklearn-like parametric objects" optional = false python-versions = "<3.14,>=3.9" groups = ["main"] files = [ - {file = "scikit_base-0.12.4-py3-none-any.whl", hash = "sha256:ebb5338813433c86153f22e58d698061eb5442c94313ef4e6ab5c2732b6ab08f"}, - {file = "scikit_base-0.12.4.tar.gz", hash = "sha256:d452844cb898560dedc5116c5441f348c2b75312cdb8ff4a3d1310456c887591"}, + {file = "scikit_base-0.12.6-py3-none-any.whl", hash = "sha256:68369cf633502e7649c6e029a78e30063154ee2eaccad34a48e19e64272a820f"}, + {file = "scikit_base-0.12.6.tar.gz", hash = "sha256:553e2bafaf30cd91d873bf424a9d16772d7638ea02ded6fb649b5d4b4c236d14"}, ] [package.extras] @@ -1446,38 +1499,43 @@ [[package]] name = "scikit-learn" -version = "1.7.1" +version = "1.7.2" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "scikit_learn-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:406204dd4004f0517f0b23cf4b28c6245cbd51ab1b6b78153bc784def214946d"}, - {file = "scikit_learn-1.7.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:16af2e44164f05d04337fd1fc3ae7c4ea61fd9b0d527e22665346336920fe0e1"}, - {file = "scikit_learn-1.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2f2e78e56a40c7587dea9a28dc4a49500fa2ead366869418c66f0fd75b80885c"}, - {file = "scikit_learn-1.7.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b62b76ad408a821475b43b7bb90a9b1c9a4d8d125d505c2df0539f06d6e631b1"}, - {file = "scikit_learn-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:9963b065677a4ce295e8ccdee80a1dd62b37249e667095039adcd5bce6e90deb"}, - {file = "scikit_learn-1.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90c8494ea23e24c0fb371afc474618c1019dc152ce4a10e4607e62196113851b"}, - {file = "scikit_learn-1.7.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:bb870c0daf3bf3be145ec51df8ac84720d9972170786601039f024bf6d61a518"}, - {file = "scikit_learn-1.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:40daccd1b5623f39e8943ab39735cadf0bdce80e67cdca2adcb5426e987320a8"}, - {file = "scikit_learn-1.7.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:30d1f413cfc0aa5a99132a554f1d80517563c34a9d3e7c118fde2d273c6fe0f7"}, - {file = "scikit_learn-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c711d652829a1805a95d7fe96654604a8f16eab5a9e9ad87b3e60173415cb650"}, - {file = "scikit_learn-1.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3cee419b49b5bbae8796ecd690f97aa412ef1674410c23fc3257c6b8b85b8087"}, - {file = "scikit_learn-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2fd8b8d35817b0d9ebf0b576f7d5ffbbabdb55536b0655a8aaae629d7ffd2e1f"}, - {file = "scikit_learn-1.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:588410fa19a96a69763202f1d6b7b91d5d7a5d73be36e189bc6396bfb355bd87"}, - {file = "scikit_learn-1.7.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e3142f0abe1ad1d1c31a2ae987621e41f6b578144a911ff4ac94781a583adad7"}, - {file = "scikit_learn-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3ddd9092c1bd469acab337d87930067c87eac6bd544f8d5027430983f1e1ae88"}, - {file = "scikit_learn-1.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b7839687fa46d02e01035ad775982f2470be2668e13ddd151f0f55a5bf123bae"}, - {file = "scikit_learn-1.7.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a10f276639195a96c86aa572ee0698ad64ee939a7b042060b98bd1930c261d10"}, - {file = "scikit_learn-1.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:13679981fdaebc10cc4c13c43344416a86fcbc61449cb3e6517e1df9d12c8309"}, - {file = "scikit_learn-1.7.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f1262883c6a63f067a980a8cdd2d2e7f2513dddcef6a9eaada6416a7a7cbe43"}, - {file = "scikit_learn-1.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:ca6d31fb10e04d50bfd2b50d66744729dbb512d4efd0223b864e2fdbfc4cee11"}, - {file = "scikit_learn-1.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:781674d096303cfe3d351ae6963ff7c958db61cde3421cd490e3a5a58f2a94ae"}, - {file = "scikit_learn-1.7.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:10679f7f125fe7ecd5fad37dd1aa2daae7e3ad8df7f3eefa08901b8254b3e12c"}, - {file = "scikit_learn-1.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1f812729e38c8cb37f760dce71a9b83ccfb04f59b3dca7c6079dcdc60544fa9e"}, - {file = "scikit_learn-1.7.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88e1a20131cf741b84b89567e1717f27a2ced228e0f29103426102bc2e3b8ef7"}, - {file = "scikit_learn-1.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b1bd1d919210b6a10b7554b717c9000b5485aa95a1d0f177ae0d7ee8ec750da5"}, - {file = "scikit_learn-1.7.1.tar.gz", hash = "sha256:24b3f1e976a4665aa74ee0fcaac2b8fccc6ae77c8e07ab25da3ba6d3292b9802"}, + {file = "scikit_learn-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b33579c10a3081d076ab403df4a4190da4f4432d443521674637677dc91e61f"}, + {file = "scikit_learn-1.7.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:36749fb62b3d961b1ce4fedf08fa57a1986cd409eff2d783bca5d4b9b5fce51c"}, + {file = "scikit_learn-1.7.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7a58814265dfc52b3295b1900cfb5701589d30a8bb026c7540f1e9d3499d5ec8"}, + {file = "scikit_learn-1.7.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a847fea807e278f821a0406ca01e387f97653e284ecbd9750e3ee7c90347f18"}, + {file = "scikit_learn-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:ca250e6836d10e6f402436d6463d6c0e4d8e0234cfb6a9a47835bd392b852ce5"}, + {file = "scikit_learn-1.7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7509693451651cd7361d30ce4e86a1347493554f172b1c72a39300fa2aea79e"}, + {file = "scikit_learn-1.7.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:0486c8f827c2e7b64837c731c8feff72c0bd2b998067a8a9cbc10643c31f0fe1"}, + {file = "scikit_learn-1.7.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89877e19a80c7b11a2891a27c21c4894fb18e2c2e077815bcade10d34287b20d"}, + {file = "scikit_learn-1.7.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8da8bf89d4d79aaec192d2bda62f9b56ae4e5b4ef93b6a56b5de4977e375c1f1"}, + {file = "scikit_learn-1.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:9b7ed8d58725030568523e937c43e56bc01cadb478fc43c042a9aca1dacb3ba1"}, + {file = "scikit_learn-1.7.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8d91a97fa2b706943822398ab943cde71858a50245e31bc71dba62aab1d60a96"}, + {file = "scikit_learn-1.7.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:acbc0f5fd2edd3432a22c69bed78e837c70cf896cd7993d71d51ba6708507476"}, + {file = "scikit_learn-1.7.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5bf3d930aee75a65478df91ac1225ff89cd28e9ac7bd1196853a9229b6adb0b"}, + {file = "scikit_learn-1.7.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d6e9deed1a47aca9fe2f267ab8e8fe82ee20b4526b2c0cd9e135cea10feb44"}, + {file = "scikit_learn-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:6088aa475f0785e01bcf8529f55280a3d7d298679f50c0bb70a2364a82d0b290"}, + {file = "scikit_learn-1.7.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b7dacaa05e5d76759fb071558a8b5130f4845166d88654a0f9bdf3eb57851b7"}, + {file = "scikit_learn-1.7.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:abebbd61ad9e1deed54cca45caea8ad5f79e1b93173dece40bb8e0c658dbe6fe"}, + {file = "scikit_learn-1.7.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:502c18e39849c0ea1a5d681af1dbcf15f6cce601aebb657aabbfe84133c1907f"}, + {file = "scikit_learn-1.7.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a4c328a71785382fe3fe676a9ecf2c86189249beff90bf85e22bdb7efaf9ae0"}, + {file = "scikit_learn-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:63a9afd6f7b229aad94618c01c252ce9e6fa97918c5ca19c9a17a087d819440c"}, + {file = "scikit_learn-1.7.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9acb6c5e867447b4e1390930e3944a005e2cb115922e693c08a323421a6966e8"}, + {file = "scikit_learn-1.7.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:2a41e2a0ef45063e654152ec9d8bcfc39f7afce35b08902bfe290c2498a67a6a"}, + {file = "scikit_learn-1.7.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98335fb98509b73385b3ab2bd0639b1f610541d3988ee675c670371d6a87aa7c"}, + {file = "scikit_learn-1.7.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191e5550980d45449126e23ed1d5e9e24b2c68329ee1f691a3987476e115e09c"}, + {file = "scikit_learn-1.7.2-cp313-cp313t-win_amd64.whl", hash = "sha256:57dc4deb1d3762c75d685507fbd0bc17160144b2f2ba4ccea5dc285ab0d0e973"}, + {file = "scikit_learn-1.7.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fa8f63940e29c82d1e67a45d5297bdebbcb585f5a5a50c4914cc2e852ab77f33"}, + {file = "scikit_learn-1.7.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f95dc55b7902b91331fa4e5845dd5bde0580c9cd9612b1b2791b7e80c3d32615"}, + {file = "scikit_learn-1.7.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9656e4a53e54578ad10a434dc1f993330568cfee176dff07112b8785fb413106"}, + {file = "scikit_learn-1.7.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96dc05a854add0e50d3f47a1ef21a10a595016da5b007c7d9cd9d0bffd1fcc61"}, + {file = "scikit_learn-1.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:bb24510ed3f9f61476181e4db51ce801e2ba37541def12dc9333b946fc7a9cf8"}, + {file = "scikit_learn-1.7.2.tar.gz", hash = "sha256:20e9e49ecd130598f1ca38a1d85090e1a600147b9c02fa6f15d69cb53d968fda"}, ] [package.dependencies] @@ -1497,49 +1555,73 @@ [[package]] name = "scipy" -version = "1.16.0" +version = "1.16.2" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.11" groups = ["main"] files = [ - {file = "scipy-1.16.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:deec06d831b8f6b5fb0b652433be6a09db29e996368ce5911faf673e78d20085"}, - {file = "scipy-1.16.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d30c0fe579bb901c61ab4bb7f3eeb7281f0d4c4a7b52dbf563c89da4fd2949be"}, - {file = "scipy-1.16.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:b2243561b45257f7391d0f49972fca90d46b79b8dbcb9b2cb0f9df928d370ad4"}, - {file = "scipy-1.16.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:e6d7dfc148135e9712d87c5f7e4f2ddc1304d1582cb3a7d698bbadedb61c7afd"}, - {file = "scipy-1.16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:90452f6a9f3fe5a2cf3748e7be14f9cc7d9b124dce19667b54f5b429d680d539"}, - {file = "scipy-1.16.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a2f0bf2f58031c8701a8b601df41701d2a7be17c7ffac0a4816aeba89c4cdac8"}, - {file = "scipy-1.16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6c4abb4c11fc0b857474241b812ce69ffa6464b4bd8f4ecb786cf240367a36a7"}, - {file = "scipy-1.16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b370f8f6ac6ef99815b0d5c9f02e7ade77b33007d74802efc8316c8db98fd11e"}, - {file = "scipy-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:a16ba90847249bedce8aa404a83fb8334b825ec4a8e742ce6012a7a5e639f95c"}, - {file = "scipy-1.16.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:7eb6bd33cef4afb9fa5f1fb25df8feeb1e52d94f21a44f1d17805b41b1da3180"}, - {file = "scipy-1.16.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:1dbc8fdba23e4d80394ddfab7a56808e3e6489176d559c6c71935b11a2d59db1"}, - {file = "scipy-1.16.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:7dcf42c380e1e3737b343dec21095c9a9ad3f9cbe06f9c05830b44b1786c9e90"}, - {file = "scipy-1.16.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:26ec28675f4a9d41587266084c626b02899db373717d9312fa96ab17ca1ae94d"}, - {file = "scipy-1.16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:952358b7e58bd3197cfbd2f2f2ba829f258404bdf5db59514b515a8fe7a36c52"}, - {file = "scipy-1.16.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03931b4e870c6fef5b5c0970d52c9f6ddd8c8d3e934a98f09308377eba6f3824"}, - {file = "scipy-1.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:512c4f4f85912767c351a0306824ccca6fd91307a9f4318efe8fdbd9d30562ef"}, - {file = "scipy-1.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e69f798847e9add03d512eaf5081a9a5c9a98757d12e52e6186ed9681247a1ac"}, - {file = "scipy-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:adf9b1999323ba335adc5d1dc7add4781cb5a4b0ef1e98b79768c05c796c4e49"}, - {file = "scipy-1.16.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:e9f414cbe9ca289a73e0cc92e33a6a791469b6619c240aa32ee18abdce8ab451"}, - {file = "scipy-1.16.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:bbba55fb97ba3cdef9b1ee973f06b09d518c0c7c66a009c729c7d1592be1935e"}, - {file = "scipy-1.16.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:58e0d4354eacb6004e7aa1cd350e5514bd0270acaa8d5b36c0627bb3bb486974"}, - {file = "scipy-1.16.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:75b2094ec975c80efc273567436e16bb794660509c12c6a31eb5c195cbf4b6dc"}, - {file = "scipy-1.16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6b65d232157a380fdd11a560e7e21cde34fdb69d65c09cb87f6cc024ee376351"}, - {file = "scipy-1.16.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d8747f7736accd39289943f7fe53a8333be7f15a82eea08e4afe47d79568c32"}, - {file = "scipy-1.16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eb9f147a1b8529bb7fec2a85cf4cf42bdfadf9e83535c309a11fdae598c88e8b"}, - {file = "scipy-1.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d2b83c37edbfa837a8923d19c749c1935ad3d41cf196006a24ed44dba2ec4358"}, - {file = "scipy-1.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:79a3c13d43c95aa80b87328a46031cf52508cf5f4df2767602c984ed1d3c6bbe"}, - {file = "scipy-1.16.0-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:f91b87e1689f0370690e8470916fe1b2308e5b2061317ff76977c8f836452a47"}, - {file = "scipy-1.16.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:88a6ca658fb94640079e7a50b2ad3b67e33ef0f40e70bdb7dc22017dae73ac08"}, - {file = "scipy-1.16.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:ae902626972f1bd7e4e86f58fd72322d7f4ec7b0cfc17b15d4b7006efc385176"}, - {file = "scipy-1.16.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:8cb824c1fc75ef29893bc32b3ddd7b11cf9ab13c1127fe26413a05953b8c32ed"}, - {file = "scipy-1.16.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:de2db7250ff6514366a9709c2cba35cb6d08498e961cba20d7cff98a7ee88938"}, - {file = "scipy-1.16.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e85800274edf4db8dd2e4e93034f92d1b05c9421220e7ded9988b16976f849c1"}, - {file = "scipy-1.16.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4f720300a3024c237ace1cb11f9a84c38beb19616ba7c4cdcd771047a10a1706"}, - {file = "scipy-1.16.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:aad603e9339ddb676409b104c48a027e9916ce0d2838830691f39552b38a352e"}, - {file = "scipy-1.16.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f56296fefca67ba605fd74d12f7bd23636267731a72cb3947963e76b8c0a25db"}, - {file = "scipy-1.16.0.tar.gz", hash = "sha256:b5ef54021e832869c8cfb03bc3bf20366cbcd426e02a58e8a58d7584dfbb8f62"}, + {file = "scipy-1.16.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:6ab88ea43a57da1af33292ebd04b417e8e2eaf9d5aa05700be8d6e1b6501cd92"}, + {file = "scipy-1.16.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c95e96c7305c96ede73a7389f46ccd6c659c4da5ef1b2789466baeaed3622b6e"}, + {file = "scipy-1.16.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:87eb178db04ece7c698220d523c170125dbffebb7af0345e66c3554f6f60c173"}, + {file = "scipy-1.16.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:4e409eac067dcee96a57fbcf424c13f428037827ec7ee3cb671ff525ca4fc34d"}, + {file = "scipy-1.16.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e574be127bb760f0dad24ff6e217c80213d153058372362ccb9555a10fc5e8d2"}, + {file = "scipy-1.16.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f5db5ba6188d698ba7abab982ad6973265b74bb40a1efe1821b58c87f73892b9"}, + {file = "scipy-1.16.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec6e74c4e884104ae006d34110677bfe0098203a3fec2f3faf349f4cb05165e3"}, + {file = "scipy-1.16.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:912f46667d2d3834bc3d57361f854226475f695eb08c08a904aadb1c936b6a88"}, + {file = "scipy-1.16.2-cp311-cp311-win_amd64.whl", hash = "sha256:91e9e8a37befa5a69e9cacbe0bcb79ae5afb4a0b130fd6db6ee6cc0d491695fa"}, + {file = "scipy-1.16.2-cp311-cp311-win_arm64.whl", hash = "sha256:f3bf75a6dcecab62afde4d1f973f1692be013110cad5338007927db8da73249c"}, + {file = "scipy-1.16.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:89d6c100fa5c48472047632e06f0876b3c4931aac1f4291afc81a3644316bb0d"}, + {file = "scipy-1.16.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ca748936cd579d3f01928b30a17dc474550b01272d8046e3e1ee593f23620371"}, + {file = "scipy-1.16.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:fac4f8ce2ddb40e2e3d0f7ec36d2a1e7f92559a2471e59aec37bd8d9de01fec0"}, + {file = "scipy-1.16.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:033570f1dcefd79547a88e18bccacff025c8c647a330381064f561d43b821232"}, + {file = "scipy-1.16.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ea3421209bf00c8a5ef2227de496601087d8f638a2363ee09af059bd70976dc1"}, + {file = "scipy-1.16.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f66bd07ba6f84cd4a380b41d1bf3c59ea488b590a2ff96744845163309ee8e2f"}, + {file = "scipy-1.16.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e9feab931bd2aea4a23388c962df6468af3d808ddf2d40f94a81c5dc38f32ef"}, + {file = "scipy-1.16.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03dfc75e52f72cf23ec2ced468645321407faad8f0fe7b1f5b49264adbc29cb1"}, + {file = "scipy-1.16.2-cp312-cp312-win_amd64.whl", hash = "sha256:0ce54e07bbb394b417457409a64fd015be623f36e330ac49306433ffe04bc97e"}, + {file = "scipy-1.16.2-cp312-cp312-win_arm64.whl", hash = "sha256:2a8ffaa4ac0df81a0b94577b18ee079f13fecdb924df3328fc44a7dc5ac46851"}, + {file = "scipy-1.16.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:84f7bf944b43e20b8a894f5fe593976926744f6c185bacfcbdfbb62736b5cc70"}, + {file = "scipy-1.16.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5c39026d12edc826a1ef2ad35ad1e6d7f087f934bb868fc43fa3049c8b8508f9"}, + {file = "scipy-1.16.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e52729ffd45b68777c5319560014d6fd251294200625d9d70fd8626516fc49f5"}, + {file = "scipy-1.16.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:024dd4a118cccec09ca3209b7e8e614931a6ffb804b2a601839499cb88bdf925"}, + {file = "scipy-1.16.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7a5dc7ee9c33019973a470556081b0fd3c9f4c44019191039f9769183141a4d9"}, + {file = "scipy-1.16.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c2275ff105e508942f99d4e3bc56b6ef5e4b3c0af970386ca56b777608ce95b7"}, + {file = "scipy-1.16.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:af80196eaa84f033e48444d2e0786ec47d328ba00c71e4299b602235ffef9acb"}, + {file = "scipy-1.16.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9fb1eb735fe3d6ed1f89918224e3385fbf6f9e23757cacc35f9c78d3b712dd6e"}, + {file = "scipy-1.16.2-cp313-cp313-win_amd64.whl", hash = "sha256:fda714cf45ba43c9d3bae8f2585c777f64e3f89a2e073b668b32ede412d8f52c"}, + {file = "scipy-1.16.2-cp313-cp313-win_arm64.whl", hash = "sha256:2f5350da923ccfd0b00e07c3e5cfb316c1c0d6c1d864c07a72d092e9f20db104"}, + {file = "scipy-1.16.2-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:53d8d2ee29b925344c13bda64ab51785f016b1b9617849dac10897f0701b20c1"}, + {file = "scipy-1.16.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:9e05e33657efb4c6a9d23bd8300101536abd99c85cca82da0bffff8d8764d08a"}, + {file = "scipy-1.16.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:7fe65b36036357003b3ef9d37547abeefaa353b237e989c21027b8ed62b12d4f"}, + {file = "scipy-1.16.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6406d2ac6d40b861cccf57f49592f9779071655e9f75cd4f977fa0bdd09cb2e4"}, + {file = "scipy-1.16.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff4dc42bd321991fbf611c23fc35912d690f731c9914bf3af8f417e64aca0f21"}, + {file = "scipy-1.16.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:654324826654d4d9133e10675325708fb954bc84dae6e9ad0a52e75c6b1a01d7"}, + {file = "scipy-1.16.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63870a84cd15c44e65220eaed2dac0e8f8b26bbb991456a033c1d9abfe8a94f8"}, + {file = "scipy-1.16.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:fa01f0f6a3050fa6a9771a95d5faccc8e2f5a92b4a2e5440a0fa7264a2398472"}, + {file = "scipy-1.16.2-cp313-cp313t-win_amd64.whl", hash = "sha256:116296e89fba96f76353a8579820c2512f6e55835d3fad7780fece04367de351"}, + {file = "scipy-1.16.2-cp313-cp313t-win_arm64.whl", hash = "sha256:98e22834650be81d42982360382b43b17f7ba95e0e6993e2a4f5b9ad9283a94d"}, + {file = "scipy-1.16.2-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:567e77755019bb7461513c87f02bb73fb65b11f049aaaa8ca17cfaa5a5c45d77"}, + {file = "scipy-1.16.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:17d9bb346194e8967296621208fcdfd39b55498ef7d2f376884d5ac47cec1a70"}, + {file = "scipy-1.16.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:0a17541827a9b78b777d33b623a6dcfe2ef4a25806204d08ead0768f4e529a88"}, + {file = "scipy-1.16.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:d7d4c6ba016ffc0f9568d012f5f1eb77ddd99412aea121e6fa8b4c3b7cbad91f"}, + {file = "scipy-1.16.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9702c4c023227785c779cba2e1d6f7635dbb5b2e0936cdd3a4ecb98d78fd41eb"}, + {file = "scipy-1.16.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d1cdf0ac28948d225decdefcc45ad7dd91716c29ab56ef32f8e0d50657dffcc7"}, + {file = "scipy-1.16.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:70327d6aa572a17c2941cdfb20673f82e536e91850a2e4cb0c5b858b690e1548"}, + {file = "scipy-1.16.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5221c0b2a4b58aa7c4ed0387d360fd90ee9086d383bb34d9f2789fafddc8a936"}, + {file = "scipy-1.16.2-cp314-cp314-win_amd64.whl", hash = "sha256:f5a85d7b2b708025af08f060a496dd261055b617d776fc05a1a1cc69e09fe9ff"}, + {file = "scipy-1.16.2-cp314-cp314-win_arm64.whl", hash = "sha256:2cc73a33305b4b24556957d5857d6253ce1e2dcd67fa0ff46d87d1670b3e1e1d"}, + {file = "scipy-1.16.2-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:9ea2a3fed83065d77367775d689401a703d0f697420719ee10c0780bcab594d8"}, + {file = "scipy-1.16.2-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7280d926f11ca945c3ef92ba960fa924e1465f8d07ce3a9923080363390624c4"}, + {file = "scipy-1.16.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:8afae1756f6a1fe04636407ef7dbece33d826a5d462b74f3d0eb82deabefd831"}, + {file = "scipy-1.16.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:5c66511f29aa8d233388e7416a3f20d5cae7a2744d5cee2ecd38c081f4e861b3"}, + {file = "scipy-1.16.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efe6305aeaa0e96b0ccca5ff647a43737d9a092064a3894e46c414db84bc54ac"}, + {file = "scipy-1.16.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f3a337d9ae06a1e8d655ee9d8ecb835ea5ddcdcbd8d23012afa055ab014f374"}, + {file = "scipy-1.16.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bab3605795d269067d8ce78a910220262711b753de8913d3deeaedb5dded3bb6"}, + {file = "scipy-1.16.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b0348d8ddb55be2a844c518cd8cc8deeeb8aeba707cf834db5758fc89b476a2c"}, + {file = "scipy-1.16.2-cp314-cp314t-win_amd64.whl", hash = "sha256:26284797e38b8a75e14ea6631d29bda11e76ceaa6ddb6fdebbfe4c4d90faf2f9"}, + {file = "scipy-1.16.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d2a4472c231328d4de38d5f1f68fdd6d28a615138f842580a8a321b5845cf779"}, + {file = "scipy-1.16.2.tar.gz", hash = "sha256:af029b153d243a80afb6eabe40b0a07f8e35c9adc269c019f364ad747f826a6b"}, ] [package.dependencies] @@ -1548,39 +1630,39 @@ [package.extras] dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] -test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest (>=8.0.0)", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "setuptools" -version = "74.0.0" +version = "80.9.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "setuptools-74.0.0-py3-none-any.whl", hash = "sha256:0274581a0037b638b9fc1c6883cc71c0210865aaa76073f7882376b641b84e8f"}, - {file = "setuptools-74.0.0.tar.gz", hash = "sha256:a85e96b8be2b906f3e3e789adec6a9323abf79758ecfa3065bd740d81158b11e"}, + {file = "setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922"}, + {file = "setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.5.2) ; sys_platform != \"cygwin\""] -core = ["importlib-metadata (>=6) ; python_version < \"3.10\"", "importlib-resources (>=5.10.2) ; python_version < \"3.9\"", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib-metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.11.*)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" groups = ["main"] files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] @@ -1637,74 +1719,82 @@ [[package]] name = "sqlalchemy" -version = "2.0.32" +version = "2.0.43" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0c9045ecc2e4db59bfc97b20516dfdf8e41d910ac6fb667ebd3a79ea54084619"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1467940318e4a860afd546ef61fefb98a14d935cd6817ed07a228c7f7c62f389"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5954463675cb15db8d4b521f3566a017c8789222b8316b1e6934c811018ee08b"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:167e7497035c303ae50651b351c28dc22a40bb98fbdb8468cdc971821b1ae533"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b27dfb676ac02529fb6e343b3a482303f16e6bc3a4d868b73935b8792edb52d0"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bf2360a5e0f7bd75fa80431bf8ebcfb920c9f885e7956c7efde89031695cafb8"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-win32.whl", hash = "sha256:306fe44e754a91cd9d600a6b070c1f2fadbb4a1a257b8781ccf33c7067fd3e4d"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-win_amd64.whl", hash = "sha256:99db65e6f3ab42e06c318f15c98f59a436f1c78179e6a6f40f529c8cc7100b22"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21b053be28a8a414f2ddd401f1be8361e41032d2ef5884b2f31d31cb723e559f"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b178e875a7a25b5938b53b006598ee7645172fccafe1c291a706e93f48499ff5"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723a40ee2cc7ea653645bd4cf024326dea2076673fc9d3d33f20f6c81db83e1d"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:295ff8689544f7ee7e819529633d058bd458c1fd7f7e3eebd0f9268ebc56c2a0"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49496b68cd190a147118af585173ee624114dfb2e0297558c460ad7495f9dfe2"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:acd9b73c5c15f0ec5ce18128b1fe9157ddd0044abc373e6ecd5ba376a7e5d961"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-win32.whl", hash = "sha256:9365a3da32dabd3e69e06b972b1ffb0c89668994c7e8e75ce21d3e5e69ddef28"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-win_amd64.whl", hash = "sha256:8bd63d051f4f313b102a2af1cbc8b80f061bf78f3d5bd0843ff70b5859e27924"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bab3db192a0c35e3c9d1560eb8332463e29e5507dbd822e29a0a3c48c0a8d92"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:19d98f4f58b13900d8dec4ed09dd09ef292208ee44cc9c2fe01c1f0a2fe440e9"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd33c61513cb1b7371fd40cf221256456d26a56284e7d19d1f0b9f1eb7dd7e8"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6ba0497c1d066dd004e0f02a92426ca2df20fac08728d03f67f6960271feec"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2b6be53e4fde0065524f1a0a7929b10e9280987b320716c1509478b712a7688c"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:916a798f62f410c0b80b63683c8061f5ebe237b0f4ad778739304253353bc1cb"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-win32.whl", hash = "sha256:31983018b74908ebc6c996a16ad3690301a23befb643093fcfe85efd292e384d"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-win_amd64.whl", hash = "sha256:4363ed245a6231f2e2957cccdda3c776265a75851f4753c60f3004b90e69bfeb"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8afd5b26570bf41c35c0121801479958b4446751a3971fb9a480c1afd85558e"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c750987fc876813f27b60d619b987b057eb4896b81117f73bb8d9918c14f1cad"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada0102afff4890f651ed91120c1120065663506b760da4e7823913ebd3258be"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:78c03d0f8a5ab4f3034c0e8482cfcc415a3ec6193491cfa1c643ed707d476f16"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:3bd1cae7519283ff525e64645ebd7a3e0283f3c038f461ecc1c7b040a0c932a1"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-win32.whl", hash = "sha256:01438ebcdc566d58c93af0171c74ec28efe6a29184b773e378a385e6215389da"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-win_amd64.whl", hash = "sha256:4979dc80fbbc9d2ef569e71e0896990bc94df2b9fdbd878290bd129b65ab579c"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c742be912f57586ac43af38b3848f7688863a403dfb220193a882ea60e1ec3a"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:62e23d0ac103bcf1c5555b6c88c114089587bc64d048fef5bbdb58dfd26f96da"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:251f0d1108aab8ea7b9aadbd07fb47fb8e3a5838dde34aa95a3349876b5a1f1d"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef18a84e5116340e38eca3e7f9eeaaef62738891422e7c2a0b80feab165905f"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3eb6a97a1d39976f360b10ff208c73afb6a4de86dd2a6212ddf65c4a6a2347d5"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0c1c9b673d21477cec17ab10bc4decb1322843ba35b481585facd88203754fc5"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-win32.whl", hash = "sha256:c41a2b9ca80ee555decc605bd3c4520cc6fef9abde8fd66b1cf65126a6922d65"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-win_amd64.whl", hash = "sha256:8a37e4d265033c897892279e8adf505c8b6b4075f2b40d77afb31f7185cd6ecd"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:52fec964fba2ef46476312a03ec8c425956b05c20220a1a03703537824b5e8e1"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:328429aecaba2aee3d71e11f2477c14eec5990fb6d0e884107935f7fb6001632"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85a01b5599e790e76ac3fe3aa2f26e1feba56270023d6afd5550ed63c68552b3"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf04784797dcdf4c0aa952c8d234fa01974c4729db55c45732520ce12dd95b4"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4488120becf9b71b3ac718f4138269a6be99a42fe023ec457896ba4f80749525"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:14e09e083a5796d513918a66f3d6aedbc131e39e80875afe81d98a03312889e6"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-win32.whl", hash = "sha256:0d322cc9c9b2154ba7e82f7bf25ecc7c36fbe2d82e2933b3642fc095a52cfc78"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-win_amd64.whl", hash = "sha256:7dd8583df2f98dea28b5cd53a1beac963f4f9d087888d75f22fcc93a07cf8d84"}, - {file = "SQLAlchemy-2.0.32-py3-none-any.whl", hash = "sha256:e567a8793a692451f706b363ccf3c45e056b67d90ead58c3bc9471af5d212202"}, - {file = "SQLAlchemy-2.0.32.tar.gz", hash = "sha256:c1b88cc8b02b6a5f0efb0345a03672d4c897dc7d92585176f88c67346f565ea8"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:21ba7a08a4253c5825d1db389d4299f64a100ef9800e4624c8bf70d8f136e6ed"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11b9503fa6f8721bef9b8567730f664c5a5153d25e247aadc69247c4bc605227"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07097c0a1886c150ef2adba2ff7437e84d40c0f7dcb44a2c2b9c905ccfc6361c"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:cdeff998cb294896a34e5b2f00e383e7c5c4ef3b4bfa375d9104723f15186443"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:bcf0724a62a5670e5718957e05c56ec2d6850267ea859f8ad2481838f889b42c"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-win32.whl", hash = "sha256:c697575d0e2b0a5f0433f679bda22f63873821d991e95a90e9e52aae517b2e32"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-win_amd64.whl", hash = "sha256:d34c0f6dbefd2e816e8f341d0df7d4763d382e3f452423e752ffd1e213da2512"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:70322986c0c699dca241418fcf18e637a4369e0ec50540a2b907b184c8bca069"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87accdbba88f33efa7b592dc2e8b2a9c2cdbca73db2f9d5c510790428c09c154"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c00e7845d2f692ebfc7d5e4ec1a3fd87698e4337d09e58d6749a16aedfdf8612"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:022e436a1cb39b13756cf93b48ecce7aa95382b9cfacceb80a7d263129dfd019"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c5e73ba0d76eefc82ec0219d2301cb33bfe5205ed7a2602523111e2e56ccbd20"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9c2e02f06c68092b875d5cbe4824238ab93a7fa35d9c38052c033f7ca45daa18"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-win32.whl", hash = "sha256:e7a903b5b45b0d9fa03ac6a331e1c1d6b7e0ab41c63b6217b3d10357b83c8b00"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-win_amd64.whl", hash = "sha256:4bf0edb24c128b7be0c61cd17eef432e4bef507013292415f3fb7023f02b7d4b"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:52d9b73b8fb3e9da34c2b31e6d99d60f5f99fd8c1225c9dad24aeb74a91e1d29"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f42f23e152e4545157fa367b2435a1ace7571cab016ca26038867eb7df2c3631"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fb1a8c5438e0c5ea51afe9c6564f951525795cf432bed0c028c1cb081276685"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db691fa174e8f7036afefe3061bc40ac2b770718be2862bfb03aabae09051aca"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2b3b4927d0bc03d02ad883f402d5de201dbc8894ac87d2e981e7d87430e60d"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d3d9b904ad4a6b175a2de0738248822f5ac410f52c2fd389ada0b5262d6a1e3"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-win32.whl", hash = "sha256:5cda6b51faff2639296e276591808c1726c4a77929cfaa0f514f30a5f6156921"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-win_amd64.whl", hash = "sha256:c5d1730b25d9a07727d20ad74bc1039bbbb0a6ca24e6769861c1aa5bf2c4c4a8"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:20d81fc2736509d7a2bd33292e489b056cbae543661bb7de7ce9f1c0cd6e7f24"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b9fc27650ff5a2c9d490c13c14906b918b0de1f8fcbb4c992712d8caf40e83"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6772e3ca8a43a65a37c88e2f3e2adfd511b0b1da37ef11ed78dea16aeae85bd9"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a113da919c25f7f641ffbd07fbc9077abd4b3b75097c888ab818f962707eb48"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4286a1139f14b7d70141c67a8ae1582fc2b69105f1b09d9573494eb4bb4b2687"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:529064085be2f4d8a6e5fab12d36ad44f1909a18848fcfbdb59cc6d4bbe48efe"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-win32.whl", hash = "sha256:b535d35dea8bbb8195e7e2b40059e2253acb2b7579b73c1b432a35363694641d"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-win_amd64.whl", hash = "sha256:1c6d85327ca688dbae7e2b06d7d84cfe4f3fffa5b5f9e21bb6ce9d0e1a0e0e0a"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e7c08f57f75a2bb62d7ee80a89686a5e5669f199235c6d1dac75cd59374091c3"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:14111d22c29efad445cd5021a70a8b42f7d9152d8ba7f73304c4d82460946aaa"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21b27b56eb2f82653168cefe6cb8e970cdaf4f3a6cb2c5e3c3c1cf3158968ff9"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c5a9da957c56e43d72126a3f5845603da00e0293720b03bde0aacffcf2dc04f"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d79f9fdc9584ec83d1b3c75e9f4595c49017f5594fee1a2217117647225d738"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9df7126fd9db49e3a5a3999442cc67e9ee8971f3cb9644250107d7296cb2a164"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-win32.whl", hash = "sha256:7f1ac7828857fcedb0361b48b9ac4821469f7694089d15550bbcf9ab22564a1d"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-win_amd64.whl", hash = "sha256:971ba928fcde01869361f504fcff3b7143b47d30de188b11c6357c0505824197"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4e6aeb2e0932f32950cf56a8b4813cb15ff792fc0c9b3752eaf067cfe298496a"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:61f964a05356f4bca4112e6334ed7c208174511bd56e6b8fc86dad4d024d4185"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46293c39252f93ea0910aababa8752ad628bcce3a10d3f260648dd472256983f"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:136063a68644eca9339d02e6693932116f6a8591ac013b0014479a1de664e40a"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6e2bf13d9256398d037fef09fd8bf9b0bf77876e22647d10761d35593b9ac547"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:44337823462291f17f994d64282a71c51d738fc9ef561bf265f1d0fd9116a782"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-win32.whl", hash = "sha256:13194276e69bb2af56198fef7909d48fd34820de01d9c92711a5fa45497cc7ed"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-win_amd64.whl", hash = "sha256:334f41fa28de9f9be4b78445e68530da3c5fa054c907176460c81494f4ae1f5e"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ceb5c832cc30663aeaf5e39657712f4c4241ad1f638d487ef7216258f6d41fe7"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11f43c39b4b2ec755573952bbcc58d976779d482f6f832d7f33a8d869ae891bf"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:413391b2239db55be14fa4223034d7e13325a1812c8396ecd4f2c08696d5ccad"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c379e37b08c6c527181a397212346be39319fb64323741d23e46abd97a400d34"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:03d73ab2a37d9e40dec4984d1813d7878e01dbdc742448d44a7341b7a9f408c7"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8cee08f15d9e238ede42e9bbc1d6e7158d0ca4f176e4eab21f88ac819ae3bd7b"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-win32.whl", hash = "sha256:b3edaec7e8b6dc5cd94523c6df4f294014df67097c8217a89929c99975811414"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-win_amd64.whl", hash = "sha256:227119ce0a89e762ecd882dc661e0aa677a690c914e358f0dd8932a2e8b2765b"}, + {file = "sqlalchemy-2.0.43-py3-none-any.whl", hash = "sha256:1681c21dd2ccee222c2fe0bef671d1aef7c504087c9c4e800371cfcc8ac966fc"}, + {file = "sqlalchemy-2.0.43.tar.gz", hash = "sha256:788bfcef6787a7764169cfe9859fe425bf44559619e1d9f56f5bddf2ebf6f417"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +greenlet = {version = ">=1", markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} typing-extensions = ">=4.6.0" [package.extras] -aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] -aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] -asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (>=1)"] +aioodbc = ["aioodbc", "greenlet (>=1)"] +aiosqlite = ["aiosqlite", "greenlet (>=1)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (>=1)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (>=1)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"] mssql = ["pyodbc"] mssql-pymssql = ["pymssql"] mssql-pyodbc = ["pyodbc"] @@ -1714,7 +1804,7 @@ oracle = ["cx_oracle (>=8)"] oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] -postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-asyncpg = ["asyncpg", "greenlet (>=1)"] postgresql-pg8000 = ["pg8000 (>=1.29.1)"] postgresql-psycopg = ["psycopg (>=3.0.7)"] postgresql-psycopg2binary = ["psycopg2-binary"] @@ -1795,14 +1885,14 @@ [[package]] name = "threadpoolctl" -version = "3.5.0" +version = "3.6.0" description = "threadpoolctl" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "threadpoolctl-3.5.0-py3-none-any.whl", hash = "sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467"}, - {file = "threadpoolctl-3.5.0.tar.gz", hash = "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107"}, + {file = "threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb"}, + {file = "threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e"}, ] [[package]] @@ -1823,154 +1913,69 @@ [[package]] name = "tokenizers" -version = "0.19.1" +version = "0.22.1" description = "" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, - {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"}, - {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"}, - {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"}, - {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"}, - {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"}, - {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, - {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, - {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, - {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, - {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, - {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, - {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"}, - {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"}, - {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"}, - {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"}, - {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"}, - {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"}, - {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"}, - {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"}, - {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"}, - {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"}, - {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"}, - {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"}, - {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"}, - {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"}, - {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"}, - {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"}, - {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"}, - {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"}, - {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"}, - {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"}, - {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"}, - {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"}, - {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"}, - {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"}, - {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, + {file = "tokenizers-0.22.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:59fdb013df17455e5f950b4b834a7b3ee2e0271e6378ccb33aa74d178b513c73"}, + {file = "tokenizers-0.22.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:8d4e484f7b0827021ac5f9f71d4794aaef62b979ab7608593da22b1d2e3c4edc"}, + {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d2962dd28bc67c1f205ab180578a78eef89ac60ca7ef7cbe9635a46a56422a"}, + {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:38201f15cdb1f8a6843e6563e6e79f4abd053394992b9bbdf5213ea3469b4ae7"}, + {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1cbe5454c9a15df1b3443c726063d930c16f047a3cc724b9e6e1a91140e5a21"}, + {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7d094ae6312d69cc2a872b54b91b309f4f6fbce871ef28eb27b52a98e4d0214"}, + {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afd7594a56656ace95cdd6df4cca2e4059d294c5cfb1679c57824b605556cb2f"}, + {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2ef6063d7a84994129732b47e7915e8710f27f99f3a3260b8a38fc7ccd083f4"}, + {file = "tokenizers-0.22.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ba0a64f450b9ef412c98f6bcd2a50c6df6e2443b560024a09fa6a03189726879"}, + {file = "tokenizers-0.22.1-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:331d6d149fa9c7d632cde4490fb8bbb12337fa3a0232e77892be656464f4b446"}, + {file = "tokenizers-0.22.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:607989f2ea68a46cb1dfbaf3e3aabdf3f21d8748312dbeb6263d1b3b66c5010a"}, + {file = "tokenizers-0.22.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a0f307d490295717726598ef6fa4f24af9d484809223bbc253b201c740a06390"}, + {file = "tokenizers-0.22.1-cp39-abi3-win32.whl", hash = "sha256:b5120eed1442765cd90b903bb6cfef781fd8fe64e34ccaecbae4c619b7b12a82"}, + {file = "tokenizers-0.22.1-cp39-abi3-win_amd64.whl", hash = "sha256:65fd6e3fb11ca1e78a6a93602490f134d1fdeb13bcef99389d5102ea318ed138"}, + {file = "tokenizers-0.22.1.tar.gz", hash = "sha256:61de6522785310a309b3407bac22d99c4db5dba349935e99e4d15ea2226af2d9"}, ] [package.dependencies] -huggingface-hub = ">=0.16.4,<1.0" +huggingface-hub = ">=0.16.4,<2.0" [package.extras] dev = ["tokenizers[testing]"] docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] -testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "pytest-asyncio", "requests", "ruff"] [[package]] name = "torch" -version = "2.7.1" +version = "2.8.0" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false python-versions = ">=3.9.0" groups = ["main"] files = [ - {file = "torch-2.7.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:a103b5d782af5bd119b81dbcc7ffc6fa09904c423ff8db397a1e6ea8fd71508f"}, - {file = "torch-2.7.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:fe955951bdf32d182ee8ead6c3186ad54781492bf03d547d31771a01b3d6fb7d"}, - {file = "torch-2.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:885453d6fba67d9991132143bf7fa06b79b24352f4506fd4d10b309f53454162"}, - {file = "torch-2.7.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:d72acfdb86cee2a32c0ce0101606f3758f0d8bb5f8f31e7920dc2809e963aa7c"}, - {file = "torch-2.7.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:236f501f2e383f1cb861337bdf057712182f910f10aeaf509065d54d339e49b2"}, - {file = "torch-2.7.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:06eea61f859436622e78dd0cdd51dbc8f8c6d76917a9cf0555a333f9eac31ec1"}, - {file = "torch-2.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:8273145a2e0a3c6f9fd2ac36762d6ee89c26d430e612b95a99885df083b04e52"}, - {file = "torch-2.7.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:aea4fc1bf433d12843eb2c6b2204861f43d8364597697074c8d38ae2507f8730"}, - {file = "torch-2.7.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:27ea1e518df4c9de73af7e8a720770f3628e7f667280bce2be7a16292697e3fa"}, - {file = "torch-2.7.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:c33360cfc2edd976c2633b3b66c769bdcbbf0e0b6550606d188431c81e7dd1fc"}, - {file = "torch-2.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:d8bf6e1856ddd1807e79dc57e54d3335f2b62e6f316ed13ed3ecfe1fc1df3d8b"}, - {file = "torch-2.7.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:787687087412c4bd68d315e39bc1223f08aae1d16a9e9771d95eabbb04ae98fb"}, - {file = "torch-2.7.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:03563603d931e70722dce0e11999d53aa80a375a3d78e6b39b9f6805ea0a8d28"}, - {file = "torch-2.7.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:d632f5417b6980f61404a125b999ca6ebd0b8b4bbdbb5fbbba44374ab619a412"}, - {file = "torch-2.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:23660443e13995ee93e3d844786701ea4ca69f337027b05182f5ba053ce43b38"}, - {file = "torch-2.7.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:0da4f4dba9f65d0d203794e619fe7ca3247a55ffdcbd17ae8fb83c8b2dc9b585"}, - {file = "torch-2.7.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:e08d7e6f21a617fe38eeb46dd2213ded43f27c072e9165dc27300c9ef9570934"}, - {file = "torch-2.7.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:30207f672328a42df4f2174b8f426f354b2baa0b7cca3a0adb3d6ab5daf00dc8"}, - {file = "torch-2.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:79042feca1c634aaf6603fe6feea8c6b30dfa140a6bbc0b973e2260c7e79a22e"}, - {file = "torch-2.7.1-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:988b0cbc4333618a1056d2ebad9eb10089637b659eb645434d0809d8d937b946"}, - {file = "torch-2.7.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:e0d81e9a12764b6f3879a866607c8ae93113cbcad57ce01ebde63eb48a576369"}, - {file = "torch-2.7.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:8394833c44484547ed4a47162318337b88c97acdb3273d85ea06e03ffff44998"}, - {file = "torch-2.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:df41989d9300e6e3c19ec9f56f856187a6ef060c3662fe54f4b6baf1fc90bd19"}, - {file = "torch-2.7.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:a737b5edd1c44a5c1ece2e9f3d00df9d1b3fb9541138bee56d83d38293fb6c9d"}, + {file = "torch-2.8.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:0be92c08b44009d4131d1ff7a8060d10bafdb7ddcb7359ef8d8c5169007ea905"}, + {file = "torch-2.8.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:89aa9ee820bb39d4d72b794345cccef106b574508dd17dbec457949678c76011"}, + {file = "torch-2.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e8e5bf982e87e2b59d932769938b698858c64cc53753894be25629bdf5cf2f46"}, + {file = "torch-2.8.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:a3f16a58a9a800f589b26d47ee15aca3acf065546137fc2af039876135f4c760"}, + {file = "torch-2.8.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:220a06fd7af8b653c35d359dfe1aaf32f65aa85befa342629f716acb134b9710"}, + {file = "torch-2.8.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:c12fa219f51a933d5f80eeb3a7a5d0cbe9168c0a14bbb4055f1979431660879b"}, + {file = "torch-2.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:8c7ef765e27551b2fbfc0f41bcf270e1292d9bf79f8e0724848b1682be6e80aa"}, + {file = "torch-2.8.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:5ae0524688fb6707c57a530c2325e13bb0090b745ba7b4a2cd6a3ce262572916"}, + {file = "torch-2.8.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e2fab4153768d433f8ed9279c8133a114a034a61e77a3a104dcdf54388838705"}, + {file = "torch-2.8.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2aca0939fb7e4d842561febbd4ffda67a8e958ff725c1c27e244e85e982173c"}, + {file = "torch-2.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:2f4ac52f0130275d7517b03a33d2493bab3693c83dcfadf4f81688ea82147d2e"}, + {file = "torch-2.8.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:619c2869db3ada2c0105487ba21b5008defcc472d23f8b80ed91ac4a380283b0"}, + {file = "torch-2.8.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:2b2f96814e0345f5a5aed9bf9734efa913678ed19caf6dc2cddb7930672d6128"}, + {file = "torch-2.8.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:65616ca8ec6f43245e1f5f296603e33923f4c30f93d65e103d9e50c25b35150b"}, + {file = "torch-2.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:659df54119ae03e83a800addc125856effda88b016dfc54d9f65215c3975be16"}, + {file = "torch-2.8.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:1a62a1ec4b0498930e2543535cf70b1bef8c777713de7ceb84cd79115f553767"}, + {file = "torch-2.8.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:83c13411a26fac3d101fe8035a6b0476ae606deb8688e904e796a3534c197def"}, + {file = "torch-2.8.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:8f0a9d617a66509ded240add3754e462430a6c1fc5589f86c17b433dd808f97a"}, + {file = "torch-2.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:a7242b86f42be98ac674b88a4988643b9bc6145437ec8f048fea23f72feb5eca"}, + {file = "torch-2.8.0-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:7b677e17f5a3e69fdef7eb3b9da72622f8d322692930297e4ccb52fefc6c8211"}, + {file = "torch-2.8.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:da6afa31c13b669d4ba49d8a2169f0db2c3ec6bec4af898aa714f401d4c38904"}, + {file = "torch-2.8.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:06fcee8000e5c62a9f3e52a688b9c5abb7c6228d0e56e3452983416025c41381"}, + {file = "torch-2.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:5128fe752a355d9308e56af1ad28b15266fe2da5948660fad44de9e3a9e36e8c"}, + {file = "torch-2.8.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:e9f071f5b52a9f6970dc8a919694b27a91ae9dc08898b2b988abbef5eddfd1ae"}, ] [package.dependencies] @@ -1978,28 +1983,29 @@ fsspec = "*" jinja2 = "*" networkx = "*" -nvidia-cublas-cu12 = {version = "12.6.4.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cuda-cupti-cu12 = {version = "12.6.80", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cuda-nvrtc-cu12 = {version = "12.6.77", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cuda-runtime-cu12 = {version = "12.6.77", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cudnn-cu12 = {version = "9.5.1.17", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cufft-cu12 = {version = "11.3.0.4", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cufile-cu12 = {version = "1.11.1.6", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-curand-cu12 = {version = "10.3.7.77", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cusolver-cu12 = {version = "11.7.1.2", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cusparse-cu12 = {version = "12.5.4.2", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cusparselt-cu12 = {version = "0.6.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-nccl-cu12 = {version = "2.26.2", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-nvjitlink-cu12 = {version = "12.6.85", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-nvtx-cu12 = {version = "12.6.77", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cublas-cu12 = {version = "12.8.4.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu12 = {version = "12.8.90", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu12 = {version = "12.8.93", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu12 = {version = "12.8.90", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "9.10.2.21", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu12 = {version = "11.3.3.83", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufile-cu12 = {version = "1.13.1.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu12 = {version = "10.3.9.90", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu12 = {version = "11.7.3.90", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu12 = {version = "12.5.8.93", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparselt-cu12 = {version = "0.7.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.27.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvjitlink-cu12 = {version = "12.8.93", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu12 = {version = "12.8.90", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} setuptools = {version = "*", markers = "python_version >= \"3.12\""} sympy = ">=1.13.3" -triton = {version = "3.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +triton = {version = "3.4.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} typing-extensions = ">=4.10.0" [package.extras] opt-einsum = ["opt-einsum (>=3.3)"] optree = ["optree (>=0.13.0)"] +pyyaml = ["pyyaml"] [[package]] name = "torchmetrics" @@ -2034,129 +2040,136 @@ [[package]] name = "tqdm" -version = "4.66.5" +version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, - {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] [[package]] name = "transformers" -version = "4.40.1" +version = "4.56.2" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.9.0" groups = ["main"] files = [ - {file = "transformers-4.40.1-py3-none-any.whl", hash = "sha256:9d5ee0c8142a60501faf9e49a0b42f8e9cb8611823bce4f195a9325a6816337e"}, - {file = "transformers-4.40.1.tar.gz", hash = "sha256:55e1697e6f18b58273e7117bb469cdffc11be28995462d8d5e422fef38d2de36"}, + {file = "transformers-4.56.2-py3-none-any.whl", hash = "sha256:79c03d0e85b26cb573c109ff9eafa96f3c8d4febfd8a0774e8bba32702dd6dde"}, + {file = "transformers-4.56.2.tar.gz", hash = "sha256:5e7c623e2d7494105c726dd10f6f90c2c99a55ebe86eef7233765abd0cb1c529"}, ] [package.dependencies] filelock = "*" -huggingface-hub = ">=0.19.3,<1.0" +huggingface-hub = ">=0.34.0,<1.0" numpy = ">=1.17" packaging = ">=20.0" pyyaml = ">=5.1" regex = "!=2019.12.17" requests = "*" -safetensors = ">=0.4.1" -tokenizers = ">=0.19,<0.20" +safetensors = ">=0.4.3" +tokenizers = ">=0.22.0,<=0.23.0" tqdm = ">=4.27" [package.extras] -accelerate = ["accelerate (>=0.21.0)"] -agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] -all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] +accelerate = ["accelerate (>=0.26.0)"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av", "codecarbon (>=2.8.1)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "jinja2 (>=3.1.0)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "kernels (>=0.6.1,<=0.9)", "librosa", "mistral-common[opencv] (>=1.6.3)", "num2words", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (!=1.0.18,<=1.0.19)", "tokenizers (>=0.22.0,<=0.23.0)", "torch (>=2.2)", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] -codecarbon = ["codecarbon (==1.2.0)"] -deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -docs = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "hf-doc-builder", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] -docs-specific = ["hf-doc-builder"] -flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)"] +benchmark = ["optimum-benchmark (>=0.3.0)"] +chat-template = ["jinja2 (>=3.1.0)"] +codecarbon = ["codecarbon (>=2.8.1)"] +deepspeed = ["accelerate (>=0.26.0)", "deepspeed (>=0.9.3)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.26.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (>=2.15.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "libcst", "mistral-common[opencv] (>=1.6.3)", "nltk (<=3.8.1)", "optuna", "parameterized (>=0.9)", "protobuf", "psutil", "pydantic (>=2)", "pytest (>=7.2.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av", "beautifulsoup4", "codecarbon (>=2.8.1)", "cookiecutter (==1.7.3)", "datasets (>=2.15.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "jinja2 (>=3.1.0)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "kernels (>=0.6.1,<=0.9)", "libcst", "librosa", "mistral-common[opencv] (>=1.6.3)", "nltk (<=3.8.1)", "num2words", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "pandas (<2.3.0)", "parameterized (>=0.9)", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic (>=2)", "pytest (>=7.2.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (!=1.0.18,<=1.0.19)", "tokenizers (>=0.22.0,<=0.23.0)", "torch (>=2.2)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (>=2.15.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "mistral-common[opencv] (>=1.6.3)", "nltk (<=3.8.1)", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "pandas (<2.3.0)", "parameterized (>=0.9)", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic (>=2)", "pytest (>=7.2.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.22.0,<=0.23.0)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "beautifulsoup4", "codecarbon (>=2.8.1)", "cookiecutter (==1.7.3)", "datasets (>=2.15.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "kenlm", "kernels (>=0.6.1,<=0.9)", "libcst", "librosa", "mistral-common[opencv] (>=1.6.3)", "nltk (<=3.8.1)", "num2words", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "pandas (<2.3.0)", "parameterized (>=0.9)", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic (>=2)", "pytest (>=7.2.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (!=1.0.18,<=1.0.19)", "tokenizers (>=0.22.0,<=0.23.0)", "torch (>=2.2)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] ftfy = ["ftfy"] -integrations = ["optuna", "ray[tune] (>=2.7.0)", "sigopt"] +hf-xet = ["hf-xet"] +hub-kernels = ["kernels (>=0.6.1,<=0.9)"] +integrations = ["kernels (>=0.6.1,<=0.9)", "optuna", "ray[tune] (>=2.7.0)", "sigopt"] ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "rhoknp (>=1.1.0,<1.3.1)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"] +mistral-common = ["mistral-common[opencv] (>=1.6.3)"] modelcreation = ["cookiecutter (==1.7.3)"] natten = ["natten (>=0.14.6,<0.15.0)"] +num2words = ["num2words"] onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] +open-telemetry = ["opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk"] optuna = ["optuna"] -quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "ruff (==0.1.5)", "urllib3 (<2.0.0)"] +quality = ["GitPython (<3.1.19)", "datasets (>=2.15.0)", "libcst", "pandas (<2.3.0)", "rich", "ruff (==0.11.2)", "urllib3 (<2.0.0)"] ray = ["ray[tune] (>=2.7.0)"] -retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] +retrieval = ["datasets (>=2.15.0)", "faiss-cpu"] +ruff = ["ruff (==0.11.2)"] sagemaker = ["sagemaker (>=2.31.0)"] sentencepiece = ["protobuf", "sentencepiece (>=0.1.91,!=0.1.92)"] -serving = ["fastapi", "pydantic", "starlette", "uvicorn"] +serving = ["accelerate (>=0.26.0)", "fastapi", "openai (>=1.98.0)", "pydantic (>=2)", "starlette", "torch (>=2.2)", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] -tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (>=2.15.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "libcst", "mistral-common[opencv] (>=1.6.3)", "nltk (<=3.8.1)", "parameterized (>=0.9)", "psutil", "pydantic (>=2)", "pytest (>=7.2.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +tf = ["keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] -timm = ["timm"] -tokenizers = ["tokenizers (>=0.19,<0.20)"] -torch = ["accelerate (>=0.21.0)", "torch"] +tiktoken = ["blobfile", "tiktoken"] +timm = ["timm (!=1.0.18,<=1.0.19)"] +tokenizers = ["tokenizers (>=0.22.0,<=0.23.0)"] +torch = ["accelerate (>=0.26.0)", "torch (>=2.2)"] torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.19.3,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] -video = ["av (==9.2.0)", "decord (==0.6.0)"] +torchhub = ["filelock", "huggingface-hub (>=0.34.0,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.22.0,<=0.23.0)", "torch (>=2.2)", "tqdm (>=4.27)"] +video = ["av"] vision = ["Pillow (>=10.0.1,<=15.0)"] [[package]] name = "triton" -version = "3.3.1" +version = "3.4.0" description = "A language and compiler for custom Deep Learning operations" optional = false -python-versions = "*" +python-versions = "<3.14,>=3.9" groups = ["main"] markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" files = [ - {file = "triton-3.3.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b74db445b1c562844d3cfad6e9679c72e93fdfb1a90a24052b03bb5c49d1242e"}, - {file = "triton-3.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b31e3aa26f8cb3cc5bf4e187bf737cbacf17311e1112b781d4a059353dfd731b"}, - {file = "triton-3.3.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9999e83aba21e1a78c1f36f21bce621b77bcaa530277a50484a7cb4a822f6e43"}, - {file = "triton-3.3.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b89d846b5a4198317fec27a5d3a609ea96b6d557ff44b56c23176546023c4240"}, - {file = "triton-3.3.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3198adb9d78b77818a5388bff89fa72ff36f9da0bc689db2f0a651a67ce6a42"}, - {file = "triton-3.3.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f6139aeb04a146b0b8e0fbbd89ad1e65861c57cfed881f21d62d3cb94a36bab7"}, + {file = "triton-3.4.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ff2785de9bc02f500e085420273bb5cc9c9bb767584a4aa28d6e360cec70128"}, + {file = "triton-3.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b70f5e6a41e52e48cfc087436c8a28c17ff98db369447bcaff3b887a3ab4467"}, + {file = "triton-3.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31c1d84a5c0ec2c0f8e8a072d7fd150cab84a9c239eaddc6706c081bfae4eb04"}, + {file = "triton-3.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00be2964616f4c619193cb0d1b29a99bd4b001d7dc333816073f92cf2a8ccdeb"}, + {file = "triton-3.4.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7936b18a3499ed62059414d7df563e6c163c5e16c3773678a3ee3d417865035d"}, + {file = "triton-3.4.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98e5c1442eaeabae2e2452ae765801bd53cd4ce873cab0d1bdd59a32ab2d9397"}, ] [package.dependencies] setuptools = ">=40.8.0" [package.extras] -build = ["cmake (>=3.20)", "lit"] +build = ["cmake (>=3.20,<4.0)", "lit"] tests = ["autopep8", "isort", "llnl-hatchet", "numpy", "pytest", "pytest-forked", "pytest-xdist", "scipy (>=1.7.1)"] tutorials = ["matplotlib", "pandas", "tabulate"] [[package]] name = "typing-extensions" -version = "4.12.2" -description = "Backported and Experimental Type Hints for Python 3.8+" +version = "4.15.0" +description = "Backported and Experimental Type Hints for Python 3.9+" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, - {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, + {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, + {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] [[package]] @@ -2191,14 +2204,14 @@ [[package]] name = "urllib3" -version = "2.2.2" +version = "2.5.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, + {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, ] [package.extras] @@ -2210,4 +2223,4 @@ [metadata] lock-version = "2.1" python-versions = ">=3.11,<=3.13.5" -content-hash = "8d55de66fc1204d82ecb4e7cfecf0b0d1828c9a939ee015e9a28bbd6e2592d28" +content-hash = "08746b5f45ee9836e2d4368f8e394d55d27f556789fb1254e7584b9eedd49d5b"
diff --git a/iotdb-core/ainode/pyproject.toml b/iotdb-core/ainode/pyproject.toml index 2450c2f..634f3e0 100644 --- a/iotdb-core/ainode/pyproject.toml +++ b/iotdb-core/ainode/pyproject.toml
@@ -98,8 +98,8 @@ # ---- DL / HF stack ---- torch = ">=2.7.0" torchmetrics = "^1.8.0" -transformers = "==4.40.1" -tokenizers = ">=0.19,<0.20" +transformers = "==4.56.2" +tokenizers = ">=0.22.0,<=0.23.0" huggingface_hub = "^0.34.4" safetensors = "^0.6.2" einops = "^0.8.1" @@ -118,6 +118,9 @@ # ---- Tooling ---- black = "25.1.0" isort = "6.0.1" +setuptools = ">=75.3.0" +joblib = ">=1.4.2" +urllib3 = ">=2.2.3" [tool.poetry.scripts] ainode = "iotdb.ainode.core.script:main"
diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java index 8f1a488..eb6d370 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java
@@ -301,6 +301,7 @@ case UpdateUser: case UpdateUserV2: case CreateUserWithRawPassword: + case RenameUser: plan = new AuthorTreePlan(configPhysicalPlanType); break; case RCreateUser: @@ -332,6 +333,7 @@ case RGrantRoleSysPri: case RRevokeUserSysPri: case RRevokeRoleSysPri: + case RRenameUser: plan = new AuthorRelationalPlan(configPhysicalPlanType); break; case ApplyConfigNode:
diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java index dee820d..77ad500 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java
@@ -135,6 +135,7 @@ CreateUserWithRawPassword((short) 638), UpdateUserMaxSession((short) 639), UpdateUserMinSession((short) 640), + AccountUnlock((short) 641), /** Table Author */ RCreateUser((short) 641), @@ -172,6 +173,7 @@ RListRolePrivilege((short) 672), RUpdateUserMaxSession((short) 673), RUpdateUserMinSession((short) 674), + RAccountUnlock((short) 675), /** Function. */ CreateFunction((short) 700),
diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java index e7921d7..e8083b7 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
@@ -178,6 +178,7 @@ globalConfig.setTimestampPrecision(commonConfig.getTimestampPrecision()); globalConfig.setSchemaEngineMode(commonConfig.getSchemaEngineMode()); globalConfig.setTagAttributeTotalSize(commonConfig.getTagAttributeTotalSize()); + globalConfig.setEnableGrantOption(commonConfig.getEnableGrantOption()); dataSet.setGlobalConfig(globalConfig); }
diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java index 0e49b86..a8c90c6 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java
@@ -595,51 +595,57 @@ ConfigNodeDescriptor.getInstance().getConf().getDefaultDataRegionGroupNumPerDatabase()); schema.setMaxSchemaRegionGroupNum(schema.getMinSchemaRegionGroupNum()); schema.setMaxDataRegionGroupNum(schema.getMinDataRegionGroupNum()); - return configManager.getClusterSchemaManager().setDatabase((DatabaseSchemaPlan) plan, true); + return configManager + .getClusterSchemaManager() + .setDatabase((DatabaseSchemaPlan) plan, shouldMarkAsPipeRequest.get()); case AlterDatabase: return configManager .getClusterSchemaManager() - .alterDatabase((DatabaseSchemaPlan) plan, true); + .alterDatabase((DatabaseSchemaPlan) plan, shouldMarkAsPipeRequest.get()); case DeleteDatabase: return configManager.deleteDatabases( new TDeleteDatabasesReq( Collections.singletonList(((DeleteDatabasePlan) plan).getName())) - .setIsGeneratedByPipe(true) + .setIsGeneratedByPipe(shouldMarkAsPipeRequest.get()) .setIsTableModel( PathUtils.isTableModelDatabase(((DeleteDatabasePlan) plan).getName()))); case ExtendSchemaTemplate: return configManager .getClusterSchemaManager() - .extendSchemaTemplate(((ExtendSchemaTemplatePlan) plan).getTemplateExtendInfo(), true); + .extendSchemaTemplate( + ((ExtendSchemaTemplatePlan) plan).getTemplateExtendInfo(), + shouldMarkAsPipeRequest.get()); case CommitSetSchemaTemplate: return configManager.setSchemaTemplate( new TSetSchemaTemplateReq( queryId, ((CommitSetSchemaTemplatePlan) plan).getName(), ((CommitSetSchemaTemplatePlan) plan).getPath()) - .setIsGeneratedByPipe(true)); + .setIsGeneratedByPipe(shouldMarkAsPipeRequest.get())); case PipeUnsetTemplate: return configManager.unsetSchemaTemplate( new TUnsetSchemaTemplateReq( queryId, ((PipeUnsetSchemaTemplatePlan) plan).getName(), ((PipeUnsetSchemaTemplatePlan) plan).getPath()) - .setIsGeneratedByPipe(true)); + .setIsGeneratedByPipe(shouldMarkAsPipeRequest.get())); case PipeDeleteTimeSeries: return configManager.deleteTimeSeries( new TDeleteTimeSeriesReq( queryId, ((PipeDeleteTimeSeriesPlan) plan).getPatternTreeBytes()) - .setIsGeneratedByPipe(true)); + .setIsGeneratedByPipe(shouldMarkAsPipeRequest.get())); case PipeDeleteLogicalView: return configManager.deleteLogicalView( new TDeleteLogicalViewReq( queryId, ((PipeDeleteLogicalViewPlan) plan).getPatternTreeBytes()) - .setIsGeneratedByPipe(true)); + .setIsGeneratedByPipe(shouldMarkAsPipeRequest.get())); case PipeDeactivateTemplate: return configManager .getProcedureManager() .deactivateTemplate( - queryId, ((PipeDeactivateTemplatePlan) plan).getTemplateSetInfo(), true); + queryId, + ((PipeDeactivateTemplatePlan) plan).getTemplateSetInfo(), + shouldMarkAsPipeRequest.get()); case UpdateTriggerStateInTable: // TODO: Record complete message in trigger return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()); @@ -649,8 +655,12 @@ .setIsGeneratedByPipe(true)); case SetTTL: return ((SetTTLPlan) plan).getTTL() == TTLCache.NULL_TTL - ? configManager.getTTLManager().unsetTTL((SetTTLPlan) plan, true) - : configManager.getTTLManager().setTTL((SetTTLPlan) plan, true); + ? configManager + .getTTLManager() + .unsetTTL((SetTTLPlan) plan, shouldMarkAsPipeRequest.get()) + : configManager + .getTTLManager() + .setTTL((SetTTLPlan) plan, shouldMarkAsPipeRequest.get()); case PipeCreateTableOrView: return executeIdempotentCreateTableOrView((PipeCreateTableOrViewPlan) plan, queryId); case AddTableColumn: @@ -667,7 +677,7 @@ ((AddTableColumnPlan) plan).getTableName(), queryId, ((AddTableColumnPlan) plan).getColumnSchemaList(), - true)); + shouldMarkAsPipeRequest.get())); case AddViewColumn: return configManager .getProcedureManager() @@ -682,7 +692,7 @@ ((AddTableViewColumnPlan) plan).getTableName(), queryId, ((AddTableViewColumnPlan) plan).getColumnSchemaList(), - true)); + shouldMarkAsPipeRequest.get())); case SetTableProperties: return configManager .getProcedureManager() @@ -697,7 +707,7 @@ ((SetTablePropertiesPlan) plan).getTableName(), queryId, ((SetTablePropertiesPlan) plan).getProperties(), - true)); + shouldMarkAsPipeRequest.get())); case SetViewProperties: return configManager .getProcedureManager() @@ -712,7 +722,7 @@ ((SetViewPropertiesPlan) plan).getTableName(), queryId, ((SetViewPropertiesPlan) plan).getProperties(), - true)); + shouldMarkAsPipeRequest.get())); case CommitDeleteColumn: return configManager .getProcedureManager() @@ -727,7 +737,7 @@ ((CommitDeleteColumnPlan) plan).getTableName(), queryId, ((CommitDeleteColumnPlan) plan).getColumnName(), - true)); + shouldMarkAsPipeRequest.get())); case CommitDeleteViewColumn: return configManager .getProcedureManager() @@ -742,7 +752,7 @@ ((CommitDeleteViewColumnPlan) plan).getTableName(), queryId, ((CommitDeleteViewColumnPlan) plan).getColumnName(), - true)); + shouldMarkAsPipeRequest.get())); case RenameTableColumn: return configManager .getProcedureManager() @@ -758,7 +768,7 @@ queryId, ((RenameTableColumnPlan) plan).getOldName(), ((RenameTableColumnPlan) plan).getNewName(), - true)); + shouldMarkAsPipeRequest.get())); case RenameViewColumn: return configManager .getProcedureManager() @@ -774,7 +784,7 @@ queryId, ((RenameViewColumnPlan) plan).getOldName(), ((RenameViewColumnPlan) plan).getNewName(), - true)); + shouldMarkAsPipeRequest.get())); case CommitDeleteTable: return configManager .getProcedureManager() @@ -788,7 +798,7 @@ ((CommitDeleteTablePlan) plan).getDatabase(), ((CommitDeleteTablePlan) plan).getTableName(), queryId, - true)); + shouldMarkAsPipeRequest.get())); case CommitDeleteView: return configManager .getProcedureManager() @@ -802,7 +812,7 @@ ((CommitDeleteViewPlan) plan).getDatabase(), ((CommitDeleteViewPlan) plan).getTableName(), queryId, - true)); + shouldMarkAsPipeRequest.get())); case SetTableComment: return configManager .getClusterSchemaManager() @@ -811,7 +821,7 @@ ((SetTableCommentPlan) plan).getTableName(), ((SetTableCommentPlan) plan).getComment(), false, - true); + shouldMarkAsPipeRequest.get()); case SetViewComment: return configManager .getClusterSchemaManager() @@ -820,7 +830,7 @@ ((SetViewCommentPlan) plan).getTableName(), ((SetViewCommentPlan) plan).getComment(), true, - true); + shouldMarkAsPipeRequest.get()); case SetTableColumnComment: return configManager .getClusterSchemaManager() @@ -829,7 +839,7 @@ ((SetTableColumnCommentPlan) plan).getTableName(), ((SetTableColumnCommentPlan) plan).getColumnName(), ((SetTableColumnCommentPlan) plan).getComment(), - true); + shouldMarkAsPipeRequest.get()); case PipeDeleteDevices: return configManager .getProcedureManager() @@ -841,7 +851,7 @@ ByteBuffer.wrap(((PipeDeleteDevicesPlan) plan).getPatternBytes()), ByteBuffer.wrap(((PipeDeleteDevicesPlan) plan).getFilterBytes()), ByteBuffer.wrap(((PipeDeleteDevicesPlan) plan).getModBytes())), - true) + shouldMarkAsPipeRequest.get()) .getStatus(); case RenameTable: return configManager @@ -858,7 +868,7 @@ ((RenameTablePlan) plan).getTableName(), queryId, ((RenameTablePlan) plan).getNewName(), - true)); + shouldMarkAsPipeRequest.get())); case RenameView: return configManager .getProcedureManager() @@ -873,7 +883,7 @@ ((RenameViewPlan) plan).getTableName(), queryId, ((RenameViewPlan) plan).getNewName(), - true)); + shouldMarkAsPipeRequest.get())); case CreateUser: case CreateUserWithRawPassword: case CreateRole: @@ -917,10 +927,14 @@ case RRevokeUserSysPri: case RGrantUserRole: case RRevokeUserRole: - return configManager.getPermissionManager().operatePermission((AuthorPlan) plan, true); + return configManager + .getPermissionManager() + .operatePermission((AuthorPlan) plan, shouldMarkAsPipeRequest.get()); case CreateSchemaTemplate: default: - return configManager.getConsensusManager().write(new PipeEnrichedPlan(plan)); + return configManager + .getConsensusManager() + .write(shouldMarkAsPipeRequest.get() ? new PipeEnrichedPlan(plan) : plan); } }
diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/ConfigRegionListeningQueue.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/ConfigRegionListeningQueue.java index b70a039..988ead4 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/ConfigRegionListeningQueue.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/ConfigRegionListeningQueue.java
@@ -157,15 +157,21 @@ : null, snapshotPathInfo.getRight()); if (type == CNSnapshotFileType.USER_ROLE) { - long userId = Long.parseLong(snapshotPath.toFile().getName().split("_")[0]); - try { - curEvent.setAuthUserName( - ConfigNode.getInstance() - .getConfigManager() - .getPermissionManager() - .getUserName(userId)); - } catch (AuthException e) { - LOGGER.warn("Failed to collect user name for user id {}", userId, e); + String userName = snapshotPath.toFile().getName().split("_")[0]; + long userId; + if (userName.matches("\\d+")) { + userId = Long.parseLong(userName); + try { + curEvent.setAuthUserName( + ConfigNode.getInstance() + .getConfigManager() + .getPermissionManager() + .getUserName(userId)); + } catch (AuthException e) { + LOGGER.warn("Failed to collect user name for user id {}", userId, e); + } + } else { + curEvent.setAuthUserName(userName); } } events.add(curEvent);
diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorInfo.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorInfo.java index 57133e6..06c564f 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorInfo.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorInfo.java
@@ -67,9 +67,22 @@ } public static ConfigPhysicalPlanType getConfigPhysicalPlanTypeFromAuthorType(int authorType) { + if (authorType < 0) { + throw new IndexOutOfBoundsException("Invalid Author Type ordinal"); + } ConfigPhysicalPlanType configPhysicalPlanType; - if (authorType == AuthorType.RENAME_USER.ordinal()) { - configPhysicalPlanType = ConfigPhysicalPlanType.RenameUser; + if (authorType >= AuthorType.RENAME_USER.ordinal()) { + AuthorType type = AuthorType.values()[authorType]; + switch (type) { + case RENAME_USER: + return ConfigPhysicalPlanType.RenameUser; + case UPDATE_USER_MAX_SESSION: + return ConfigPhysicalPlanType.UpdateUserMaxSession; + case UPDATE_USER_MIN_SESSION: + return ConfigPhysicalPlanType.UpdateUserMinSession; + default: + throw new IndexOutOfBoundsException("Invalid Author Type ordinal"); + } } else { configPhysicalPlanType = ConfigPhysicalPlanType.values()[authorType + ConfigPhysicalPlanType.CreateUser.ordinal()];
diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorPlanExecutor.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorPlanExecutor.java index 6eee248..1056ad7 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorPlanExecutor.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/auth/AuthorPlanExecutor.java
@@ -146,6 +146,8 @@ case DropRole: authorizer.deleteRole(roleName); break; + case AccountUnlock: + break; case GrantRole: for (int permission : permissions) { PrivilegeType priv = PrivilegeType.values()[permission]; @@ -246,6 +248,8 @@ case RRenameUser: authorizer.renameUser(userName, newUsername); break; + case RAccountUnlock: + break; case RDropRole: authorizer.deleteRole(roleName); break;
diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java index aa3504a..d86169e 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
@@ -461,6 +461,7 @@ case DropUser: case DropUserV2: case DropRole: + case AccountUnlock: case GrantRole: case GrantUser: case GrantRoleToUser: @@ -493,6 +494,7 @@ case RUpdateUserV2: case RUpdateUserMaxSession: case RUpdateUserMinSession: + case RAccountUnlock: case RGrantUserRole: case RGrantRoleAny: case RGrantUserAny:
diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java index 0f4a164..2269f22 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
@@ -234,7 +234,6 @@ import org.apache.iotdb.confignode.service.ConfigNode; import org.apache.iotdb.consensus.exception.ConsensusException; import org.apache.iotdb.db.queryengine.plan.relational.type.AuthorRType; -import org.apache.iotdb.db.queryengine.plan.statement.AuthorType; import org.apache.iotdb.rpc.RpcUtils; import org.apache.iotdb.rpc.TSStatusCode; @@ -633,9 +632,6 @@ @Override public TSStatus operatePermission(final TAuthorizerReq req) { - if (req.getAuthorType() < 0 || req.getAuthorType() >= AuthorType.values().length) { - throw new IndexOutOfBoundsException("Invalid Author Type ordinal"); - } ConfigPhysicalPlanType configPhysicalPlanType = AuthorInfo.getConfigPhysicalPlanTypeFromAuthorType(req.getAuthorType()); return configManager.operatePermission( @@ -654,9 +650,6 @@ @Override public TAuthorizerResp queryPermission(final TAuthorizerReq req) { - if (req.getAuthorType() < 0 || req.getAuthorType() >= AuthorType.values().length) { - throw new IndexOutOfBoundsException("Invalid Author Type ordinal"); - } final PermissionInfoResp dataSet = (PermissionInfoResp) configManager.queryPermission(
diff --git a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java index 6925fef..4381c12 100644 --- a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java +++ b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
@@ -65,6 +65,7 @@ import org.apache.iotdb.commons.udf.UDFType; import org.apache.iotdb.commons.utils.TimePartitionUtils; import org.apache.iotdb.confignode.consensus.request.write.auth.AuthorPlan; +import org.apache.iotdb.confignode.consensus.request.write.auth.AuthorRelationalPlan; import org.apache.iotdb.confignode.consensus.request.write.auth.AuthorTreePlan; import org.apache.iotdb.confignode.consensus.request.write.confignode.ApplyConfigNodePlan; import org.apache.iotdb.confignode.consensus.request.write.confignode.RemoveConfigNodePlan; @@ -644,6 +645,36 @@ new ArrayList<>()); req1 = (AuthorTreePlan) ConfigPhysicalPlan.Factory.create(req0.serializeToByteBuffer()); Assert.assertEquals(req0, req1); + + // rename user + req0 = + new AuthorTreePlan( + ConfigPhysicalPlanType.RenameUser, + "oldUserName", + "", + "", + "", + new HashSet<>(), + false, + new ArrayList<>(), + 233, + "newUserName"); + req1 = (AuthorTreePlan) ConfigPhysicalPlan.Factory.create(req0.serializeToByteBuffer()); + Assert.assertEquals(req0, req1); + req0 = + new AuthorRelationalPlan( + ConfigPhysicalPlanType.RRenameUser, + "oldUserName", + "", + "", + "", + new HashSet<>(), + false, + "", + 666, + "newUserName"); + req1 = (AuthorRelationalPlan) ConfigPhysicalPlan.Factory.create(req0.serializeToByteBuffer()); + Assert.assertEquals(req0, req1); } @Test
diff --git a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/ratis/utils/Utils.java b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/ratis/utils/Utils.java index 1a62743..adaf820 100644 --- a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/ratis/utils/Utils.java +++ b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/ratis/utils/Utils.java
@@ -58,8 +58,10 @@ import javax.net.ssl.X509TrustManager; import java.io.File; +import java.io.FileNotFoundException; import java.io.InputStream; import java.nio.ByteBuffer; +import java.nio.file.AccessDeniedException; import java.nio.file.Files; import java.nio.file.Paths; import java.security.KeyStore; @@ -394,6 +396,10 @@ TrustManager trustManager = new NoHostnameVerificationTrustManager((X509TrustManager) originalTrustManager); GrpcConfigKeys.TLS.setConf(parameters, new GrpcTlsConfig(keyManager, trustManager, true)); + } catch (AccessDeniedException e) { + LOGGER.error("Failed or truststore to load keystore file"); + } catch (FileNotFoundException e) { + LOGGER.error("keystore or truststore file not found"); } catch (Exception e) { LOGGER.error("Failed to read key store or trust store.", e); }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/audit/DNAuditLogger.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/audit/DNAuditLogger.java index a8a5280..713d79f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/audit/DNAuditLogger.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/audit/DNAuditLogger.java
@@ -86,9 +86,10 @@ public static final String PREFIX_PASSWORD_HISTORY = "root.__audit.password_history"; private static final Logger logger = LoggerFactory.getLogger(DNAuditLogger.class); - // TODO: @zhujt20 Optimize the following stupid retry + // TODO: @zhujt20 Optimize the following stupid intervals private static final int INSERT_RETRY_COUNT = 5; private static final int INSERT_RETRY_INTERVAL_MS = 2000; + private static final int INSERT_INTERVAL_MS = 50; private static final IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig(); @@ -354,49 +355,46 @@ } @Override - public void log(IAuditEntity auditLogFields, Supplier<String> log) { + public synchronized void log(IAuditEntity auditLogFields, Supplier<String> log) { if (!IS_AUDIT_LOG_ENABLED) { return; } - createViewIfNecessary(); - if (noNeedInsertAuditLog(auditLogFields)) { - return; - } - long userId = auditLogFields.getUserId(); - String user = String.valueOf(userId); - if (userId == -1) { - user = "none"; - } - String dataNodeId = String.valueOf(config.getDataNodeId()); - InsertRowStatement statement; try { - statement = + createViewIfNecessary(); + if (noNeedInsertAuditLog(auditLogFields)) { + return; + } + long userId = auditLogFields.getUserId(); + String user = String.valueOf(userId); + if (userId == -1) { + user = "none"; + } + String dataNodeId = String.valueOf(config.getDataNodeId()); + InsertRowStatement statement = generateInsertStatement( auditLogFields, log.get(), DEVICE_PATH_CACHE.getPartialPath(String.format(AUDIT_LOG_DEVICE, dataNodeId, user))); - } catch (IllegalPathException e) { - logger.error("Failed to log audit events because ", e); - return; - } - for (int retry = 0; retry < INSERT_RETRY_COUNT; retry++) { - ExecutionResult insertResult = - coordinator.executeForTreeModel( - statement, - SESSION_MANAGER.requestQueryId(), - sessionInfo, - "", - ClusterPartitionFetcher.getInstance(), - SCHEMA_FETCHER); - if (insertResult.status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - return; - } - try { + for (int retry = 0; retry < INSERT_RETRY_COUNT; retry++) { + ExecutionResult insertResult = + coordinator.executeForTreeModel( + statement, + SESSION_MANAGER.requestQueryId(), + sessionInfo, + "", + ClusterPartitionFetcher.getInstance(), + SCHEMA_FETCHER); + if (insertResult.status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { + TimeUnit.MILLISECONDS.sleep(INSERT_INTERVAL_MS); + return; + } TimeUnit.MILLISECONDS.sleep(INSERT_RETRY_INTERVAL_MS); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - logger.error("Audit log insertion retry sleep was interrupted", e); } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + logger.warn("[AUDIT] Audit log insertion retry sleep was interrupted because", e); + } catch (Exception e) { + logger.warn("[AUDIT] Failed to log audit events because", e); } AuditEventType type = auditLogFields.getAuditEventType(); if (isLoginEvent(type)) {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/LoginLockManager.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/LoginLockManager.java index 66dbc8a..05e80cc 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/LoginLockManager.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/LoginLockManager.java
@@ -68,30 +68,27 @@ public LoginLockManager( int failedLoginAttempts, int failedLoginAttemptsPerUser, int passwordLockTimeMinutes) { // Set and validate failedLoginAttempts (IP level) - if (failedLoginAttempts == -1) { + if (failedLoginAttempts <= 0) { this.failedLoginAttempts = -1; // Completely disable IP-level restrictions + LOGGER.info("IP-level login attempts disabled (set to {})", failedLoginAttempts); } else { - this.failedLoginAttempts = failedLoginAttempts >= 1 ? failedLoginAttempts : 5; + this.failedLoginAttempts = failedLoginAttempts; } // Set and validate failedLoginAttemptsPerUser (user level) - if (failedLoginAttemptsPerUser == -1) { - // If IP-level is enabled, user-level cannot be disabled - if (this.failedLoginAttempts != -1) { - this.failedLoginAttemptsPerUser = 1000; // Default user-level value - LOGGER.error( - "User-level login attempts cannot be disabled when IP-level is enabled. " - + "Setting user-level attempts to default (1000)"); - } else { - this.failedLoginAttemptsPerUser = -1; // Both are disabled - } + if (failedLoginAttemptsPerUser <= 0) { + this.failedLoginAttemptsPerUser = -1; // Disable user-level restrictions + LOGGER.info("User-level login attempts disabled (set to {})", failedLoginAttemptsPerUser); } else { - this.failedLoginAttemptsPerUser = - failedLoginAttemptsPerUser >= 1 ? failedLoginAttemptsPerUser : 1000; + this.failedLoginAttemptsPerUser = failedLoginAttemptsPerUser; } // Set and validate passwordLockTimeMinutes (default 10, minimum 1) this.passwordLockTimeMinutes = passwordLockTimeMinutes >= 1 ? passwordLockTimeMinutes : 10; + if (passwordLockTimeMinutes < 1) { + LOGGER.warn( + "Invalid lock time value ({}), reset to default (10 minutes)", passwordLockTimeMinutes); + } // Log final effective configuration LOGGER.info( @@ -112,9 +109,7 @@ void removeOldFailures(long cutoffTime) { // Remove timestamps older than cutoffTime - while (!failureTimestamps.isEmpty() && failureTimestamps.peekFirst() < cutoffTime) { - failureTimestamps.pollFirst(); - } + failureTimestamps.removeIf(timestamp -> timestamp < cutoffTime); } int getFailureCount() {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java index 11e3610..b786f7d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -49,6 +49,7 @@ import org.apache.tsfile.common.conf.TSFileDescriptor; import org.apache.tsfile.common.constant.TsFileConstant; +import org.apache.tsfile.encrypt.EncryptParameter; import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.file.metadata.enums.CompressionType; import org.apache.tsfile.file.metadata.enums.TSEncoding; @@ -62,9 +63,11 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; @@ -1147,6 +1150,8 @@ private String loadDiskSelectStrategyForIoTV2AndPipe = LoadDiskSelectorType.INHERIT_LOAD.getValue(); + private boolean skipFailedTableSchemaCheck = false; + /** Pipe related */ /** initialized as empty, updated based on the latest `systemDir` during querying */ private String[] pipeReceiverFileDirs = new String[0]; @@ -1176,8 +1181,13 @@ private boolean includeNullValueInWriteThroughputMetric = false; + private boolean keepSameDiskWhenLoadingSnapshot = false; + private ConcurrentHashMap<String, EncryptParameter> tsFileDBToEncryptMap = + new ConcurrentHashMap<>( + Collections.singletonMap("root.__audit", new EncryptParameter("UNENCRYPTED", null))); + IoTDBConfig() {} public int getMaxLogEntriesNumPerBatch() { @@ -3927,6 +3937,18 @@ this.loadDiskSelectStrategyForIoTV2AndPipe = loadDiskSelectStrategyForIoTV2AndPipe; } + public boolean isSkipFailedTableSchemaCheck() { + return skipFailedTableSchemaCheck; + } + + public void setSkipFailedTableSchemaCheck(boolean skipFailedTableSchemaCheck) { + if (this.skipFailedTableSchemaCheck == skipFailedTableSchemaCheck) { + return; + } + this.skipFailedTableSchemaCheck = skipFailedTableSchemaCheck; + logger.info("skipFailedTableSchemaCheck is set to {}.", skipFailedTableSchemaCheck); + } + public long getLoadActiveListeningCheckIntervalSeconds() { return loadActiveListeningCheckIntervalSeconds; } @@ -4228,6 +4250,7 @@ this.passwordLockTimeMinutes = passwordLockTimeMinutes; } + public boolean isKeepSameDiskWhenLoadingSnapshot() { return keepSameDiskWhenLoadingSnapshot; } @@ -4235,4 +4258,8 @@ public void setKeepSameDiskWhenLoadingSnapshot(boolean keepSameDiskWhenLoadingSnapshot) { this.keepSameDiskWhenLoadingSnapshot = keepSameDiskWhenLoadingSnapshot; } + + public ConcurrentHashMap<String, EncryptParameter> getTSFileDBToEncryptMap() { + return tsFileDBToEncryptMap; + } }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java index cbb92d2..1f9cc67 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
@@ -2235,7 +2235,7 @@ } } - private void loadLoadTsFileProps(TrimProperties properties) throws IOException { + private void loadLoadTsFileProps(TrimProperties properties) { conf.setMaxAllocateMemoryRatioForLoad( Double.parseDouble( properties.getProperty( @@ -2386,6 +2386,12 @@ properties.getProperty( "cache_last_values_memory_budget_in_byte", String.valueOf(conf.getCacheLastValuesMemoryBudgetInByte())))); + + conf.setSkipFailedTableSchemaCheck( + Boolean.parseBoolean( + properties.getProperty( + "skip_failed_table_schema_check", + String.valueOf(conf.isSkipFailedTableSchemaCheck())))); } private void loadLoadTsFileHotModifiedProp(TrimProperties properties) throws IOException { @@ -2433,6 +2439,12 @@ properties.getProperty( "load_tsfile_split_partition_max_size", Integer.toString(conf.getLoadTsFileSpiltPartitionMaxSize())))); + + conf.setSkipFailedTableSchemaCheck( + Boolean.parseBoolean( + properties.getProperty( + "skip_failed_table_schema_check", + String.valueOf(conf.isSkipFailedTableSchemaCheck())))); } private void loadPipeHotModifiedProp(TrimProperties properties) throws IOException { @@ -2462,27 +2474,31 @@ String readerTransformerCollectorMemoryProportion = properties.getProperty("udf_reader_transformer_collector_memory_proportion"); + String[] proportions; if (readerTransformerCollectorMemoryProportion != null) { - String[] proportions = readerTransformerCollectorMemoryProportion.split(":"); - int proportionSum = 0; - for (String proportion : proportions) { - proportionSum += Integer.parseInt(proportion.trim()); - } - float maxMemoryAvailable = conf.getUdfMemoryBudgetInMB(); - try { - conf.setUdfReaderMemoryBudgetInMB( - maxMemoryAvailable * Integer.parseInt(proportions[0].trim()) / proportionSum); - conf.setUdfTransformerMemoryBudgetInMB( - maxMemoryAvailable * Integer.parseInt(proportions[1].trim()) / proportionSum); - conf.setUdfCollectorMemoryBudgetInMB( - maxMemoryAvailable * Integer.parseInt(proportions[2].trim()) / proportionSum); - } catch (Exception e) { - throw new RuntimeException( - "Each subsection of configuration item udf_reader_transformer_collector_memory_proportion" - + " should be an integer, which is " - + readerTransformerCollectorMemoryProportion, - e); - } + proportions = readerTransformerCollectorMemoryProportion.split(":"); + } else { + // Make the default proportion is 1:1:1 + proportions = new String[] {"1", "1", "1"}; + } + int proportionSum = 0; + for (String proportion : proportions) { + proportionSum += Integer.parseInt(proportion.trim()); + } + float maxMemoryAvailable = conf.getUdfMemoryBudgetInMB(); + try { + conf.setUdfReaderMemoryBudgetInMB( + maxMemoryAvailable * Integer.parseInt(proportions[0].trim()) / proportionSum); + conf.setUdfTransformerMemoryBudgetInMB( + maxMemoryAvailable * Integer.parseInt(proportions[1].trim()) / proportionSum); + conf.setUdfCollectorMemoryBudgetInMB( + maxMemoryAvailable * Integer.parseInt(proportions[2].trim()) / proportionSum); + } catch (Exception e) { + throw new RuntimeException( + "Each subsection of configuration item udf_reader_transformer_collector_memory_proportion" + + " should be an integer, which is " + + readerTransformerCollectorMemoryProportion, + e); } }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/agent/task/PipeDataNodeTaskAgent.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/agent/task/PipeDataNodeTaskAgent.java index c4044a7..c51d881 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/agent/task/PipeDataNodeTaskAgent.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/agent/task/PipeDataNodeTaskAgent.java
@@ -786,12 +786,12 @@ final long remainingMemory = PipeDataNodeResourceManager.memory().getTotalFloatingMemorySizeInBytes() - allocatedMemorySizeInBytes; - if (remainingMemory < PipeConfig.getInstance().PipeInsertNodeQueueMemory()) { + if (remainingMemory < PipeConfig.getInstance().getPipeInsertNodeQueueMemory()) { final String message = String.format( "%s Need Floating memory: %d bytes, free Floating memory: %d bytes", MESSAGE_PIPE_NOT_ENOUGH_MEMORY, - PipeConfig.getInstance().PipeInsertNodeQueueMemory(), + PipeConfig.getInstance().getPipeInsertNodeQueueMemory(), remainingMemory); LOGGER.warn(message); throw new PipeException(message);
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/agent/task/subtask/sink/PipeSinkSubtask.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/agent/task/subtask/sink/PipeSinkSubtask.java index d3c9417..308ddfb 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/agent/task/subtask/sink/PipeSinkSubtask.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/agent/task/subtask/sink/PipeSinkSubtask.java
@@ -19,6 +19,7 @@ package org.apache.iotdb.db.pipe.agent.task.subtask.sink; +import org.apache.iotdb.commons.exception.pipe.PipeNonReportException; import org.apache.iotdb.commons.exception.pipe.PipeRuntimeException; import org.apache.iotdb.commons.pipe.agent.task.connection.UnboundedBlockingPendingQueue; import org.apache.iotdb.commons.pipe.agent.task.subtask.PipeAbstractSinkSubtask; @@ -131,6 +132,8 @@ } decreaseReferenceCountAndReleaseLastEvent(event, true); + } catch (final PipeNonReportException e) { + // Ignore, go directly next round } catch (final PipeException e) { if (!isClosed.get()) { setLastExceptionEvent(event);
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/scan/TsFileInsertionEventScanParser.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/scan/TsFileInsertionEventScanParser.java index 47aba94..44941e3 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/scan/TsFileInsertionEventScanParser.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/scan/TsFileInsertionEventScanParser.java
@@ -110,8 +110,7 @@ PipeConfig.getInstance().getPipeDataStructureTabletSizeInBytes()); this.allocatedMemoryBlockForChunk = PipeDataNodeResourceManager.memory() - .forceAllocateForTabletWithRetry( - PipeConfig.getInstance().getPipeMaxAlignedSeriesChunkSizeInOneBatch()); + .forceAllocateForTabletWithRetry(PipeConfig.getInstance().getPipeMaxReaderChunkSize()); try { tsFileSequenceReader = new TsFileSequenceReader(tsFile.getAbsolutePath(), false, false);
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/table/TsFileInsertionEventTableParser.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/table/TsFileInsertionEventTableParser.java index 7a5d869..76cc32e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/table/TsFileInsertionEventTableParser.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/table/TsFileInsertionEventTableParser.java
@@ -77,7 +77,7 @@ this.allocatedMemoryBlockForChunk = PipeDataNodeResourceManager.memory() .forceAllocateForTabletWithRetry( - PipeConfig.getInstance().getPipeMaxAlignedSeriesChunkSizeInOneBatch()); + PipeConfig.getInstance().getPipeMaxReaderChunkSize()); this.allocatedMemoryBlockForBatchData = PipeDataNodeResourceManager.memory().forceAllocateForTabletWithRetry(tableSize); this.allocatedMemoryBlockForChunkMeta =
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/visitor/PipeStatementTSStatusVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/visitor/PipeStatementTSStatusVisitor.java index 8d7a567..882485a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/visitor/PipeStatementTSStatusVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/visitor/PipeStatementTSStatusVisitor.java
@@ -133,7 +133,6 @@ return new TSStatus(TSStatusCode.PIPE_RECEIVER_IDEMPOTENT_CONFLICT_EXCEPTION.getStatusCode()) .setMessage(context.getMessage()); } else if (context.getCode() == TSStatusCode.PATH_ALREADY_EXIST.getStatusCode() - || context.getCode() == TSStatusCode.ALIGNED_TIMESERIES_ERROR.getStatusCode() || context.getCode() == TSStatusCode.SCHEMA_QUOTA_EXCEEDED.getStatusCode()) { return new TSStatus(TSStatusCode.PIPE_RECEIVER_USER_CONFLICT_EXCEPTION.getStatusCode()) .setMessage(context.getMessage()); @@ -168,10 +167,6 @@ if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode() && status.getCode() != TSStatusCode.TIMESERIES_ALREADY_EXIST.getStatusCode() && status.getCode() != TSStatusCode.ALIAS_ALREADY_EXIST.getStatusCode()) { - if (status.getCode() == TSStatusCode.ALIGNED_TIMESERIES_ERROR.getStatusCode()) { - return new TSStatus(TSStatusCode.PIPE_RECEIVER_USER_CONFLICT_EXCEPTION.getStatusCode()) - .setMessage(context.getMessage()); - } return visitStatement(statement, context); } }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/resource/memory/PipeMemoryManager.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/resource/memory/PipeMemoryManager.java index 6e43d4b..ada7883 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/resource/memory/PipeMemoryManager.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/resource/memory/PipeMemoryManager.java
@@ -638,12 +638,6 @@ return usedMemorySizeInBytesOfTsFiles; } - public long getAllocatedMemorySizeInBytesOfBatch() { - return (long) - (PipeConfig.getInstance().getPipeDataStructureBatchMemoryProportion() - * getTotalNonFloatingMemorySizeInBytes()); - } - public long getFreeMemorySizeInBytes() { return memoryBlock.getFreeMemoryInBytes(); }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/source/dataregion/historical/PipeHistoricalDataRegionTsFileAndDeletionSource.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/source/dataregion/historical/PipeHistoricalDataRegionTsFileAndDeletionSource.java index 868bb03..09fcabaa 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/source/dataregion/historical/PipeHistoricalDataRegionTsFileAndDeletionSource.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/source/dataregion/historical/PipeHistoricalDataRegionTsFileAndDeletionSource.java
@@ -374,8 +374,11 @@ } userId = - parameters.getStringByKeys( - PipeSourceConstant.EXTRACTOR_IOTDB_USER_ID, PipeSourceConstant.SOURCE_IOTDB_USER_ID); + parameters.getStringOrDefault( + Arrays.asList( + PipeSourceConstant.EXTRACTOR_IOTDB_USER_ID, + PipeSourceConstant.SOURCE_IOTDB_USER_ID), + "-1"); userName = parameters.getStringByKeys( PipeSourceConstant.EXTRACTOR_IOTDB_USER_KEY,
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/source/schemaregion/IoTDBSchemaRegionSource.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/source/schemaregion/IoTDBSchemaRegionSource.java index 6dbb8e1..f096616 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/source/schemaregion/IoTDBSchemaRegionSource.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/source/schemaregion/IoTDBSchemaRegionSource.java
@@ -115,9 +115,14 @@ == 1) { SchemaRegionConsensusImpl.getInstance() .write(schemaRegionId, new PipeOperateSchemaQueueNode(new PlanNodeId(""), true)); - database = SchemaEngine.getInstance().getSchemaRegion(schemaRegionId).getDatabaseFullPath(); + } else if (!PipeDataNodeAgent.runtime().schemaListener(schemaRegionId).isOpened()) { + // This may be being concurrently opened, we should not continue to start or else the snapshot + // may not be listened + PipeDataNodeAgent.runtime().decreaseAndGetSchemaListenerReferenceCount(schemaRegionId); + return; } + database = SchemaEngine.getInstance().getSchemaRegion(schemaRegionId).getDatabaseFullPath(); super.start(); }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/SessionManager.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/SessionManager.java index 570e533..91adb0b 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/SessionManager.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/SessionManager.java
@@ -31,6 +31,7 @@ import org.apache.iotdb.commons.service.metric.MetricService; import org.apache.iotdb.commons.service.metric.enums.Metric; import org.apache.iotdb.commons.service.metric.enums.Tag; +import org.apache.iotdb.commons.utils.AuthUtils; import org.apache.iotdb.commons.utils.CommonDateTimeUtils; import org.apache.iotdb.db.audit.DNAuditLogger; import org.apache.iotdb.db.auth.AuthorityChecker; @@ -175,7 +176,8 @@ username); long currentTime = CommonDateTimeUtils.currentTime(); TSStatus tsStatus = - DataNodeAuthUtils.recordPasswordHistory(userId, password, password, currentTime); + DataNodeAuthUtils.recordPasswordHistory( + userId, password, AuthUtils.encryptPassword(password), currentTime); if (tsStatus.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { openSessionResp .sessionId(-1)
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/window/SessionWindow.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/window/SessionWindow.java index 5c28c05..4c5e004 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/window/SessionWindow.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/window/SessionWindow.java
@@ -21,7 +21,6 @@ import org.apache.tsfile.block.column.Column; import org.apache.tsfile.read.common.block.TsBlock; -import org.apache.tsfile.read.common.block.column.TimeColumn; public class SessionWindow implements IWindow { @@ -87,19 +86,19 @@ @Override public boolean contains(Column column) { - TimeColumn timeColumn = (TimeColumn) column; - - long minTime = Math.min(timeColumn.getStartTime(), timeColumn.getEndTime()); - long maxTime = Math.max(timeColumn.getStartTime(), timeColumn.getEndTime()); + long columnStartTime = column.getLong(0); + long columnEndTime = column.getLong(column.getPositionCount() - 1); + long minTime = Math.min(columnStartTime, columnEndTime); + long maxTime = Math.max(columnStartTime, columnEndTime); boolean contains = - Math.abs(column.getLong(0) - lastTsBlockTime) < timeInterval + Math.abs(columnStartTime - lastTsBlockTime) < timeInterval && maxTime - minTime <= timeInterval; if (contains) { if (!initializedTimeValue) { startTime = Long.MAX_VALUE; endTime = Long.MIN_VALUE; - lastTsBlockTime = column.getLong(0); + lastTsBlockTime = columnStartTime; timeValue = ascending ? maxTime : minTime; initializedTimeValue = true; }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/window/TimeWindow.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/window/TimeWindow.java index 0a867e6..5500d23 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/window/TimeWindow.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/window/TimeWindow.java
@@ -22,7 +22,6 @@ import org.apache.tsfile.block.column.Column; import org.apache.tsfile.read.common.TimeRange; import org.apache.tsfile.read.common.block.TsBlock; -import org.apache.tsfile.read.common.block.column.TimeColumn; public class TimeWindow implements IWindow { @@ -62,10 +61,10 @@ @Override public boolean contains(Column column) { - TimeColumn timeColumn = (TimeColumn) column; - - long minTime = Math.min(timeColumn.getStartTime(), timeColumn.getEndTime()); - long maxTime = Math.max(timeColumn.getStartTime(), timeColumn.getEndTime()); + long startTime = column.getLong(0); + long endTime = column.getLong(column.getPositionCount() - 1); + long minTime = Math.min(startTime, endTime); + long maxTime = Math.max(startTime, endTime); return curTimeRange.contains(minTime, maxTime); }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/load/LoadTsFileTableSchemaCache.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/load/LoadTsFileTableSchemaCache.java index 18b5d4c..690a18d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/load/LoadTsFileTableSchemaCache.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/load/LoadTsFileTableSchemaCache.java
@@ -21,7 +21,6 @@ import org.apache.iotdb.commons.exception.IllegalPathException; import org.apache.iotdb.commons.path.PatternTreeMap; -import org.apache.iotdb.commons.pipe.config.PipeConfig; import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory; import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema; import org.apache.iotdb.db.auth.AuthorityChecker; @@ -150,7 +149,7 @@ try { createTableAndDatabaseIfNecessary(device.getTableName()); } catch (final Exception e) { - if (PipeConfig.getInstance().isSkipFailedTableSchemaCheck()) { + if (IoTDBDescriptor.getInstance().getConfig().isSkipFailedTableSchemaCheck()) { LOGGER.info( "Failed to check table schema, will skip because skipFailedTableSchemaCheck is set to true, message: {}", e.getMessage());
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java index 71b6b30..ca02ee1 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@ -2105,10 +2105,10 @@ // Syntactic sugar: if full-sync mode is detected (i.e. not snapshot mode, or both realtime // and history are true), the pipe is split into history-only and realtime–only modes. - final PipeParameters extractorPipeParameters = + final PipeParameters sourcePipeParameters = new PipeParameters(createPipeStatement.getExtractorAttributes()); if (PipeConfig.getInstance().getPipeAutoSplitFullEnabled() - && PipeDataNodeAgent.task().isFullSync(extractorPipeParameters)) { + && PipeDataNodeAgent.task().isFullSync(sourcePipeParameters)) { try (final ConfigNodeClient configNodeClient = CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) { // 1. Send request to create the real-time data synchronization pipeline @@ -2120,7 +2120,7 @@ .setIfNotExistsCondition(true) // Use extractor parameters for real-time data .setExtractorAttributes( - extractorPipeParameters + sourcePipeParameters .addOrReplaceEquivalentAttributesWithClone( new PipeParameters( ImmutableMap.of( @@ -2145,16 +2145,23 @@ // Append suffix to the pipeline name for historical data .setPipeName(createPipeStatement.getPipeName() + "_history") .setIfNotExistsCondition(createPipeStatement.hasIfNotExistsCondition()) - // Use extractor parameters for historical data + // Use source parameters for historical data .setExtractorAttributes( - extractorPipeParameters + sourcePipeParameters .addOrReplaceEquivalentAttributesWithClone( new PipeParameters( ImmutableMap.of( PipeSourceConstant.EXTRACTOR_REALTIME_ENABLE_KEY, Boolean.toString(false), PipeSourceConstant.EXTRACTOR_HISTORY_ENABLE_KEY, - Boolean.toString(true)))) + Boolean.toString(true), + // We force the historical pipe to transfer data only + // Thus we can transfer schema only once + // And may drop the historical pipe on successfully transferred + PipeSourceConstant.SOURCE_INCLUSION_KEY, + PipeSourceConstant.EXTRACTOR_INCLUSION_DEFAULT_VALUE, + PipeSourceConstant.SOURCE_EXCLUSION_KEY, + PipeSourceConstant.EXTRACTOR_EXCLUSION_DEFAULT_VALUE))) .getAttribute()) .setProcessorAttributes(createPipeStatement.getProcessorAttributes()) .setConnectorAttributes(createPipeStatement.getConnectorAttributes());
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/AccessControlImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/AccessControlImpl.java index d7a35f3..4d720bc 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/AccessControlImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/AccessControlImpl.java
@@ -284,23 +284,31 @@ authChecker.checkGlobalPrivilege(userName, TableModelPrivilege.MANAGE_USER, auditEntity); return; case LIST_USER_PRIV: - auditEntity - .setAuditLogOperation(AuditLogOperation.QUERY) - .setPrivilegeType(PrivilegeType.SECURITY); - if (AuthorityChecker.SUPER_USER_ID == auditEntity.getUserId() - || statement.getUserName().equals(userName)) { + auditEntity.setAuditLogOperation(AuditLogOperation.QUERY); + if (statement.getUserName().equals(userName)) { + // No need any privilege to list him/herself ITableAuthCheckerImpl.recordAuditLog(auditEntity.setResult(true), statement::getUserName); return; } + // Require SECURITY privilege to list other users' privileges + if (AuthorityChecker.SUPER_USER_ID == auditEntity.getUserId()) { + ITableAuthCheckerImpl.recordAuditLog( + auditEntity.setPrivilegeType(PrivilegeType.SECURITY).setResult(true), + statement::getUserName); + return; + } authChecker.checkGlobalPrivilege(userName, TableModelPrivilege.MANAGE_USER, auditEntity); return; case LIST_USER: - auditEntity.setAuditLogOperation(AuditLogOperation.QUERY); + auditEntity.setAuditLogOperation(AuditLogOperation.QUERY).setResult(true); if (!hasGlobalPrivilege(auditEntity, PrivilegeType.MANAGE_USER)) { + // No need to check privilege to list himself/herself statement.setUserName(userName); + ITableAuthCheckerImpl.recordAuditLog(auditEntity, statement::getUserName); } else { - auditEntity.setPrivilegeType(PrivilegeType.SECURITY); - ITableAuthCheckerImpl.recordAuditLog(auditEntity.setResult(true), statement::getUserName); + // Require SECURITY privilege to list other users + ITableAuthCheckerImpl.recordAuditLog( + auditEntity.setPrivilegeType(PrivilegeType.SECURITY), statement::getUserName); } return; case CREATE_ROLE: @@ -328,29 +336,37 @@ authChecker.checkGlobalPrivilege(userName, TableModelPrivilege.MANAGE_ROLE, auditEntity); return; case LIST_ROLE: - auditEntity - .setAuditLogOperation(AuditLogOperation.QUERY) - .setPrivilegeType(PrivilegeType.SECURITY); + auditEntity.setAuditLogOperation(AuditLogOperation.QUERY); if (statement.getUserName() != null && !statement.getUserName().equals(userName)) { + // Require SECURITY privilege to list other users' roles authChecker.checkGlobalPrivilege(userName, TableModelPrivilege.MANAGE_ROLE, auditEntity); - ITableAuthCheckerImpl.recordAuditLog(auditEntity.setResult(true), statement::getRoleName); return; } if (!hasGlobalPrivilege(auditEntity, PrivilegeType.MANAGE_ROLE)) { + // No need to check privilege to list his/hers own role statement.setUserName(userName); - } else { ITableAuthCheckerImpl.recordAuditLog(auditEntity.setResult(true), statement::getRoleName); + } else { + // Require SECURITY privilege to list all roles + ITableAuthCheckerImpl.recordAuditLog( + auditEntity.setPrivilegeType(PrivilegeType.SECURITY).setResult(true), + statement::getRoleName); } return; case LIST_ROLE_PRIV: - auditEntity - .setAuditLogOperation(AuditLogOperation.QUERY) - .setPrivilegeType(PrivilegeType.SECURITY); - if (AuthorityChecker.SUPER_USER_ID == auditEntity.getUserId() - || AuthorityChecker.checkRole(userName, statement.getRoleName())) { + auditEntity.setAuditLogOperation(AuditLogOperation.QUERY); + if (AuthorityChecker.checkRole(userName, statement.getRoleName())) { + // No need any privilege to list his/hers own role ITableAuthCheckerImpl.recordAuditLog(auditEntity.setResult(true), statement::getRoleName); return; } + // Require SECURITY privilege to list other roles' privileges + if (AuthorityChecker.SUPER_USER_ID == auditEntity.getUserId()) { + ITableAuthCheckerImpl.recordAuditLog( + auditEntity.setPrivilegeType(PrivilegeType.SECURITY).setResult(true), + statement::getRoleName); + return; + } authChecker.checkGlobalPrivilege(userName, TableModelPrivilege.MANAGE_ROLE, auditEntity); return; case GRANT_ROLE_ANY:
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/ITableAuthCheckerImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/ITableAuthCheckerImpl.java index 29fc704..d1f6044 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/ITableAuthCheckerImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/ITableAuthCheckerImpl.java
@@ -66,23 +66,19 @@ } if (TABLE_MODEL_AUDIT_DATABASE.equalsIgnoreCase(databaseName)) { - if (AuthorityChecker.checkSystemPermission(userName, PrivilegeType.AUDIT)) { - recordAuditLog( - auditEntity - .setAuditLogOperation(AuditLogOperation.QUERY) - .setPrivilegeType(PrivilegeType.READ_SCHEMA) - .setResult(true), - () -> databaseName); + // The audit database only requires audit privilege + boolean hasAuditPrivilege = + AuthorityChecker.checkSystemPermission(userName, PrivilegeType.AUDIT); + recordAuditLog( + auditEntity + .setAuditLogOperation(AuditLogOperation.QUERY) + .setPrivilegeType(PrivilegeType.AUDIT) + .setResult(hasAuditPrivilege), + () -> databaseName); + if (hasAuditPrivilege) { return; - } else { - recordAuditLog( - auditEntity - .setAuditLogOperation(AuditLogOperation.QUERY) - .setPrivilegeType(PrivilegeType.READ_SCHEMA) - .setResult(false), - () -> databaseName); - throw new AccessDeniedException("DATABASE " + databaseName); } + throw new AccessDeniedException("DATABASE " + databaseName); } if (AuthorityChecker.checkSystemPermission(userName, PrivilegeType.SYSTEM)) { @@ -341,14 +337,19 @@ } String databaseName = tableName.getDatabaseName(); - if (TABLE_MODEL_AUDIT_DATABASE.equalsIgnoreCase(databaseName) - && !AuthorityChecker.checkSystemPermission(userName, PrivilegeType.AUDIT)) { + if (TABLE_MODEL_AUDIT_DATABASE.equalsIgnoreCase(databaseName)) { + // The audit table only requires audit privilege + boolean hasAuditPrivilege = + AuthorityChecker.checkSystemPermission(userName, PrivilegeType.AUDIT); recordAuditLog( auditEntity .setAuditLogOperation(AuditLogOperation.QUERY) - .setPrivilegeType(PrivilegeType.READ_SCHEMA) - .setResult(false), + .setPrivilegeType(PrivilegeType.AUDIT) + .setResult(hasAuditPrivilege), tableName::getObjectName); + if (hasAuditPrivilege) { + return; + } throw new AccessDeniedException("TABLE " + tableName); }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java index cd6cbe3..d939a85 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java
@@ -540,47 +540,45 @@ PrivilegeType.MANAGE_USER, statement::getUserName); case LIST_USER: - context - .setAuditLogOperation(AuditLogOperation.QUERY) - .setPrivilegeType(PrivilegeType.SECURITY); + context.setAuditLogOperation(AuditLogOperation.QUERY).setResult(true); if (checkHasGlobalAuth( context.setAuditLogOperation(AuditLogOperation.QUERY), PrivilegeType.MANAGE_USER, statement::getUserName)) { + // MANAGE_USER privilege can list all users return RpcUtils.SUCCESS_STATUS; } + // Can only list him/herself without MANAGE_USER privilege statement.setUserName(context.getUsername()); + recordObjectAuthenticationAuditLog( + context.setPrivilegeType(null).setResult(true), context::getUsername); return RpcUtils.SUCCESS_STATUS; - case LIST_USER_PRIVILEGE: - context - .setAuditLogOperation(AuditLogOperation.QUERY) - .setPrivilegeType(PrivilegeType.SECURITY); + context.setAuditLogOperation(AuditLogOperation.QUERY); if (context.getUsername().equals(statement.getUserName())) { + // No need any privilege to list his/her own privileges + recordObjectAuthenticationAuditLog(context.setResult(true), context::getUsername); return RpcUtils.SUCCESS_STATUS; } + // Require MANAGE_USER privilege to list other users' privileges return checkGlobalAuth( context.setAuditLogOperation(AuditLogOperation.QUERY), PrivilegeType.MANAGE_USER, statement::getUserName); - case LIST_ROLE_PRIVILEGE: - context - .setAuditLogOperation(AuditLogOperation.QUERY) - .setPrivilegeType(PrivilegeType.SECURITY); + context.setAuditLogOperation(AuditLogOperation.QUERY); if (!AuthorityChecker.checkRole(context.getUsername(), statement.getRoleName())) { return checkGlobalAuth( context.setAuditLogOperation(AuditLogOperation.QUERY), PrivilegeType.MANAGE_ROLE, statement::getRoleName); } else { + // No need any privilege to list his/her own role's privileges + recordObjectAuthenticationAuditLog(context.setResult(true), context::getUsername); return SUCCEED; } - case LIST_ROLE: - context - .setAuditLogOperation(AuditLogOperation.QUERY) - .setPrivilegeType(PrivilegeType.SECURITY); + context.setAuditLogOperation(AuditLogOperation.QUERY); if (checkHasGlobalAuth( context.setAuditLogOperation(AuditLogOperation.QUERY), PrivilegeType.MANAGE_ROLE, @@ -590,8 +588,13 @@ // list roles of other user is not allowed if (statement.getUserName() != null && !statement.getUserName().equals(context.getUsername())) { + recordObjectAuthenticationAuditLog( + context.setPrivilegeType(PrivilegeType.MANAGE_ROLE).setResult(false), + context::getUsername); return AuthorityChecker.getTSStatus(false, PrivilegeType.MANAGE_ROLE); } + recordObjectAuthenticationAuditLog( + context.setPrivilegeType(null).setResult(true), context::getUsername); statement.setUserName(context.getUsername()); return RpcUtils.SUCCESS_STATUS; @@ -940,11 +943,10 @@ showDatabaseStatement.getPaths().stream() .distinct() .collect(Collectors.toList()) - .toString()) - .setPrivilegeType(PrivilegeType.MANAGE_DATABASE); + .toString()); if (AuthorityChecker.SUPER_USER.equals(context.getUsername())) { recordObjectAuthenticationAuditLog( - context.setResult(true), () -> showDatabaseStatement.getPathPattern().toString()); + context.setPrivilegeType(PrivilegeType.SYSTEM).setResult(true), context::getDatabase); return SUCCEED; } setCanSeeAuditDB(showDatabaseStatement, context); @@ -954,7 +956,16 @@ @Override public TSStatus visitCountStorageGroup( CountDatabaseStatement countDatabaseStatement, TreeAccessCheckContext context) { + context + .setAuditLogOperation(AuditLogOperation.QUERY) + .setDatabase( + countDatabaseStatement.getPaths().stream() + .distinct() + .collect(Collectors.toList()) + .toString()); if (AuthorityChecker.SUPER_USER.equals(context.getUsername())) { + recordObjectAuthenticationAuditLog( + context.setPrivilegeType(PrivilegeType.SYSTEM).setResult(true), context::getDatabase); return SUCCEED; } setCanSeeAuditDB(countDatabaseStatement, context); @@ -1149,8 +1160,10 @@ checkedPaths, permission); if (!AuthorityChecker.INTERNAL_AUDIT_USER.equals(context.getUsername())) { - // Skip internal auditor - recordObjectAuthenticationAuditLog(context.setResult(true), checkedPaths::toString); + // Internal auditor no needs audit log + recordObjectAuthenticationAuditLog( + context.setResult(result.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()), + checkedPaths::toString); } return result; } @@ -1895,7 +1908,7 @@ return AuthorityChecker.getTSStatus(false, "Only the admin user can perform this operation"); } - private static void recordObjectAuthenticationAuditLog( + protected static void recordObjectAuthenticationAuditLog( IAuditEntity auditEntity, Supplier<String> auditObject) { AUDIT_LOGGER.log( auditEntity.setAuditEventType(AuditEventType.OBJECT_AUTHENTICATION),
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/type/AuthorRType.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/type/AuthorRType.java index ea0d649..4f399f6 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/type/AuthorRType.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/type/AuthorRType.java
@@ -18,6 +18,9 @@ */ package org.apache.iotdb.db.queryengine.plan.relational.type; +// When adding new types that need to be converted to ConfigPhysicalPlanType, you can refer to this +// document: +// https://docs.google.com/document/d/1WvAyuLn1y988svLl8rGUEcesMkAyH6UTT597KQAVm1A/edit?usp=sharing public enum AuthorRType { CREATE_USER, CREATE_ROLE, @@ -50,6 +53,8 @@ LIST_ROLE, LIST_USER_PRIV, LIST_ROLE_PRIV, + UPDATE_MAX_USER_SESSION, + UPDATE_MIN_USER_SESSION, // Remind to renew the convert codes in ConfigNodeRPCServiceProcessor RENAME_USER, ACCOUNT_UNLOCK
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/AuthorType.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/AuthorType.java index 5994944..53b8d1d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/AuthorType.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/AuthorType.java
@@ -19,7 +19,14 @@ package org.apache.iotdb.db.queryengine.plan.statement; +// If you need to add a new type, you need to add it to the end because the ordinal will be used as +// offset to calculate ConfigPhysicalPlanType +// When adding new types that need to be converted to ConfigPhysicalPlanType, you can refer to this +// document: +// https://docs.google.com/document/d/1WvAyuLn1y988svLl8rGUEcesMkAyH6UTT597KQAVm1A/edit?usp=sharing public enum AuthorType { + // The ConfigPhysicalPlanType in this part can be automatically converted according to the offset + // in this class CREATE_USER, CREATE_ROLE, DROP_USER, @@ -35,101 +42,14 @@ LIST_ROLE, LIST_USER_PRIVILEGE, LIST_ROLE_PRIVILEGE, + ACCOUNT_UNLOCK, + // Remind to renew the convert codes in ConfigNodeRPCServiceProcessor + // If the config node plan is involved, the type defined in following lines needs to manually add + // conversion logic RENAME_USER, + UPDATE_USER_MAX_SESSION, + UPDATE_USER_MIN_SESSION, ; - - /** - * deserialize short number. - * - * @param i short number - * @return NamespaceType - */ - public static AuthorType deserialize(short i) { - switch (i) { - case 0: - return CREATE_USER; - case 1: - return CREATE_ROLE; - case 2: - return DROP_USER; - case 3: - return DROP_ROLE; - case 4: - return GRANT_ROLE; - case 5: - return GRANT_USER; - case 6: - return GRANT_USER_ROLE; - case 7: - return REVOKE_USER; - case 8: - return REVOKE_ROLE; - case 9: - return REVOKE_USER_ROLE; - case 10: - return UPDATE_USER; - case 11: - return LIST_USER; - case 12: - return LIST_ROLE; - case 13: - return LIST_USER_PRIVILEGE; - case 14: - return LIST_ROLE_PRIVILEGE; - case 15: - return RENAME_USER; - case 16: - return ACCOUNT_UNLOCK; - default: - return null; - } - } - - /** - * serialize. - * - * @return short number - */ - public short serialize() { - switch (this) { - case CREATE_USER: - return 0; - case CREATE_ROLE: - return 1; - case DROP_USER: - return 2; - case DROP_ROLE: - return 3; - case GRANT_ROLE: - return 4; - case GRANT_USER: - return 5; - case GRANT_USER_ROLE: - return 6; - case REVOKE_USER: - return 7; - case REVOKE_ROLE: - return 8; - case REVOKE_USER_ROLE: - return 9; - case UPDATE_USER: - return 10; - case LIST_USER: - return 11; - case LIST_ROLE: - return 12; - case LIST_USER_PRIVILEGE: - return 13; - case LIST_ROLE_PRIVILEGE: - return 14; - case RENAME_USER: - return 15; - case ACCOUNT_UNLOCK: - return 16; - default: - return -1; - } - } }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/intermediate/MultiInputLayer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/intermediate/MultiInputLayer.java index 930d7d6..78e0c74 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/intermediate/MultiInputLayer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/intermediate/MultiInputLayer.java
@@ -42,7 +42,6 @@ import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.read.common.block.TsBlock; import org.apache.tsfile.read.common.block.TsBlockBuilder; -import org.apache.tsfile.read.common.block.column.TimeColumn; import org.apache.tsfile.read.common.block.column.TimeColumnBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -143,8 +142,8 @@ if (layerReaders[i].isConstantPointReader()) { inputTVColumnsList[i] = new TVColumns(columns[0]); } else { - inputTVColumnsList[i] = new TVColumns((TimeColumn) columns[1], columns[0]); - timeHeap.add(((TimeColumn) columns[1]).getStartTime()); + inputTVColumnsList[i] = new TVColumns(columns[1], columns[0]); + timeHeap.add(columns[1].getLong(0)); } currentConsumedIndexes[i] = 0; @@ -354,10 +353,10 @@ private long currentEndTime = Long.MAX_VALUE; private final RowListForwardIterator beginIterator = rowRecordList.constructIterator(); - private TimeColumn cachedBeginTimeColumn; + private Column cachedBeginTimeColumn; private int cachedBeginConsumed; - private TimeColumn cachedEndTimeColumn; + private Column cachedEndTimeColumn; private int cachedEndConsumed; @Override @@ -370,7 +369,7 @@ } Column[] columns = udfInputDataSet.currentBlock(); - TimeColumn times = (TimeColumn) columns[columns.length - 1]; + Column times = columns[columns.length - 1]; rowRecordList.put(columns); @@ -379,11 +378,12 @@ if (nextWindowTimeBegin == Long.MIN_VALUE) { // display window begin should be set to the same as the min timestamp of the query // result set - nextWindowTimeBegin = cachedEndTimeColumn.getStartTime(); + nextWindowTimeBegin = cachedEndTimeColumn.getLong(0); } hasAtLeastOneRow = rowRecordList.size() != 0; if (hasAtLeastOneRow) { - currentEndTime = cachedEndTimeColumn.getEndTime(); + currentEndTime = + cachedEndTimeColumn.getLong(cachedEndTimeColumn.getPositionCount() - 1); } isFirstIteration = false; } @@ -407,10 +407,10 @@ } // Generate data Column[] columns = udfInputDataSet.currentBlock(); - TimeColumn times = (TimeColumn) columns[columns.length - 1]; + Column times = columns[columns.length - 1]; // Put data into container rowRecordList.put(columns); - currentEndTime = times.getEndTime(); + currentEndTime = times.getLong(times.getPositionCount() - 1); // Increase nextIndexEnd nextIndexEnd += cachedEndTimeColumn.getPositionCount() - cachedEndConsumed; // Update cache @@ -446,7 +446,7 @@ cachedBeginConsumed = 0; Column[] columns = beginIterator.currentBlock(); - cachedBeginTimeColumn = (TimeColumn) columns[columns.length - 1]; + cachedBeginTimeColumn = columns[columns.length - 1]; } else { // No more data // Set nextIndexBegin to list's size @@ -456,7 +456,8 @@ } if ((nextIndexEnd == nextIndexBegin) - && nextWindowTimeEnd < cachedEndTimeColumn.getEndTime()) { + && nextWindowTimeEnd + < cachedEndTimeColumn.getLong(cachedEndTimeColumn.getPositionCount() - 1)) { window.setEmptyWindow(nextWindowTimeBegin, nextWindowTimeEnd); return YieldableState.YIELDABLE; } @@ -514,7 +515,7 @@ private int nextIndexBegin = 0; private int nextIndexEnd = 0; - private TimeColumn cachedTimes; + private Column cachedTimes; private int cachedConsumed; @Override @@ -557,7 +558,7 @@ } if (!findWindow) { - if (cachedTimes.getEndTime() < displayWindowEnd) { + if (cachedTimes.getLong(cachedTimes.getPositionCount() - 1) < displayWindowEnd) { YieldableState state = yieldAndCache(); if (state == YieldableState.NOT_YIELDABLE_WAITING_FOR_DATA) { return YieldableState.NOT_YIELDABLE_WAITING_FOR_DATA; @@ -586,12 +587,12 @@ } } // Initialize essential information - nextWindowTimeBegin = Math.max(displayWindowBegin, cachedTimes.getStartTime()); + nextWindowTimeBegin = Math.max(displayWindowBegin, cachedTimes.getLong(0)); hasAtLeastOneRow = rowRecordList.size() != 0; isFirstIteration = false; // Set initial nextIndexBegin - long currentEndTime = cachedTimes.getEndTime(); + long currentEndTime = cachedTimes.getLong(cachedTimes.getPositionCount() - 1); // Find corresponding block while (currentEndTime < nextWindowTimeBegin) { // Consume all data @@ -625,7 +626,7 @@ return state; } Column[] columns = udfInputDataSet.currentBlock(); - TimeColumn times = (TimeColumn) columns[columns.length - 1]; + Column times = columns[columns.length - 1]; rowRecordList.put(columns);
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/intermediate/SingleInputMultiReferenceLayer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/intermediate/SingleInputMultiReferenceLayer.java index 9981483..2bf5f2b 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/intermediate/SingleInputMultiReferenceLayer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/intermediate/SingleInputMultiReferenceLayer.java
@@ -39,7 +39,6 @@ import org.apache.tsfile.block.column.Column; import org.apache.tsfile.enums.TSDataType; -import org.apache.tsfile.read.common.block.column.TimeColumn; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -258,7 +257,7 @@ } Column[] columns = parentLayerReader.current(); - TimeColumn times = (TimeColumn) columns[1]; + Column times = columns[1]; Column values = columns[0]; tvList.putColumn(times, values); @@ -298,12 +297,12 @@ } // Generate data Column[] columns = parentLayerReader.current(); - TimeColumn times = (TimeColumn) columns[1]; + Column times = columns[1]; Column values = columns[0]; // Put data into container tvList.putColumn(times, values); parentLayerReader.consumedAll(); - currentEndTime = times.getEndTime(); + currentEndTime = times.getLong(times.getPositionCount() - 1); // Increase nextIndexEnd nextIndexEnd += cachedEndTimeColumn.getPositionCount() - cachedEndConsumed; // Update cache @@ -406,7 +405,7 @@ private int nextIndexBegin = 0; private int nextIndexEnd = 0; - private TimeColumn cachedTimes; + private Column cachedTimes; private int cachedConsumed; @Override @@ -449,7 +448,7 @@ } if (!findWindow) { - if (cachedTimes.getEndTime() < displayWindowEnd) { + if (cachedTimes.getLong(cachedTimes.getPositionCount() - 1) < displayWindowEnd) { YieldableState state = yieldAndCache(); if (state == YieldableState.NOT_YIELDABLE_WAITING_FOR_DATA) { return YieldableState.NOT_YIELDABLE_WAITING_FOR_DATA; @@ -478,12 +477,12 @@ } } // Initialize essential information - nextWindowTimeBegin = Math.max(displayWindowBegin, cachedTimes.getStartTime()); + nextWindowTimeBegin = Math.max(displayWindowBegin, cachedTimes.getLong(0)); hasAtLeastOneRow = tvList.size() != 0; isFirstIteration = false; // Set initial nextIndexBegin - long currentEndTime = cachedTimes.getEndTime(); + long currentEndTime = cachedTimes.getLong(cachedTimes.getPositionCount() - 1); // Find corresponding block while (currentEndTime < nextWindowTimeBegin) { // Consume all data @@ -517,7 +516,7 @@ return state; } Column[] columns = parentLayerReader.current(); - TimeColumn times = (TimeColumn) columns[1]; + Column times = columns[1]; Column values = columns[0]; tvList.putColumn(times, values); @@ -572,7 +571,7 @@ private int nextIndexBegin = 0; private int nextIndexEnd = 0; - private TimeColumn cachedTimes; + private Column cachedTimes; private Column cachedValues; private int cachedConsumed; @@ -617,7 +616,7 @@ } if (!findWindow) { - if (cachedTimes.getEndTime() < displayWindowEnd) { + if (cachedTimes.getLong(cachedTimes.getPositionCount() - 1) < displayWindowEnd) { YieldableState state = yieldAndCache(); if (state == YieldableState.NOT_YIELDABLE_WAITING_FOR_DATA) { return YieldableState.NOT_YIELDABLE_WAITING_FOR_DATA; @@ -646,12 +645,12 @@ } } // Initialize essential information - nextWindowTimeBegin = Math.max(displayWindowBegin, cachedTimes.getStartTime()); + nextWindowTimeBegin = Math.max(displayWindowBegin, cachedTimes.getLong(0)); hasAtLeastOneRow = tvList.size() != 0; isFirstIteration = false; // Set initial nextIndexBegin - long currentEndTime = cachedTimes.getEndTime(); + long currentEndTime = cachedTimes.getLong(cachedTimes.getPositionCount() - 1); // Find corresponding block while (currentEndTime < nextWindowTimeBegin) { // Consume all data @@ -685,7 +684,7 @@ return state; } Column[] columns = parentLayerReader.current(); - TimeColumn times = (TimeColumn) columns[1]; + Column times = columns[1]; Column values = columns[0]; tvList.putColumn(times, values);
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/intermediate/SingleInputSingleReferenceLayer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/intermediate/SingleInputSingleReferenceLayer.java index dadcb8a..e7d67c3 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/intermediate/SingleInputSingleReferenceLayer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/intermediate/SingleInputSingleReferenceLayer.java
@@ -37,7 +37,6 @@ import org.apache.tsfile.block.column.Column; import org.apache.tsfile.enums.TSDataType; -import org.apache.tsfile.read.common.block.column.TimeColumn; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -181,7 +180,7 @@ } Column[] columns = parentLayerReader.current(); - TimeColumn times = (TimeColumn) columns[1]; + Column times = columns[1]; Column values = columns[0]; tvList.putColumn(times, values); @@ -221,12 +220,12 @@ } // Generate data Column[] columns = parentLayerReader.current(); - TimeColumn times = (TimeColumn) columns[1]; + Column times = columns[1]; Column values = columns[0]; // Put data into container tvList.putColumn(times, values); parentLayerReader.consumedAll(); - currentEndTime = times.getEndTime(); + currentEndTime = times.getLong(times.getPositionCount() - 1); // Increase nextIndexEnd nextIndexEnd += cachedEndTimeColumn.getPositionCount() - cachedEndConsumed; // Update cache @@ -330,7 +329,7 @@ private int nextIndexBegin = 0; private int nextIndexEnd = 0; - private TimeColumn cachedTimes; + private Column cachedTimes; private int cachedConsumed; @Override @@ -373,7 +372,7 @@ } if (!findWindow) { - if (cachedTimes.getEndTime() < displayWindowEnd) { + if (cachedTimes.getLong(cachedTimes.getPositionCount() - 1) < displayWindowEnd) { YieldableState state = yieldAndCache(); if (state == YieldableState.NOT_YIELDABLE_WAITING_FOR_DATA) { return YieldableState.NOT_YIELDABLE_WAITING_FOR_DATA; @@ -402,12 +401,12 @@ } } // Initialize essential information - nextWindowTimeBegin = Math.max(displayWindowBegin, cachedTimes.getStartTime()); + nextWindowTimeBegin = Math.max(displayWindowBegin, cachedTimes.getLong(0)); hasAtLeastOneRow = tvList.size() != 0; isFirstIteration = false; // Set initial nextIndexBegin - long currentEndTime = cachedTimes.getEndTime(); + long currentEndTime = cachedTimes.getLong(cachedTimes.getPositionCount() - 1); // Find corresponding block while (currentEndTime < nextWindowTimeBegin) { // Consume all data @@ -441,7 +440,7 @@ return state; } Column[] columns = parentLayerReader.current(); - TimeColumn times = (TimeColumn) columns[1]; + Column times = columns[1]; Column values = columns[0]; tvList.putColumn(times, values); @@ -497,7 +496,7 @@ private int nextIndexBegin = 0; private int nextIndexEnd = 0; - private TimeColumn cachedTimes; + private Column cachedTimes; private Column cachedValues; private int cachedConsumed; @@ -542,7 +541,7 @@ } if (!findWindow) { - if (cachedTimes.getEndTime() < displayWindowEnd) { + if (cachedTimes.getLong(cachedTimes.getPositionCount() - 1) < displayWindowEnd) { YieldableState state = yieldAndCache(); if (state == YieldableState.NOT_YIELDABLE_WAITING_FOR_DATA) { return YieldableState.NOT_YIELDABLE_WAITING_FOR_DATA; @@ -571,12 +570,12 @@ } } // Initialize essential information - nextWindowTimeBegin = Math.max(displayWindowBegin, cachedTimes.getStartTime()); + nextWindowTimeBegin = Math.max(displayWindowBegin, cachedTimes.getLong(0)); hasAtLeastOneRow = tvList.size() != 0; isFirstIteration = false; // Set initial nextIndexBegin - long currentEndTime = cachedTimes.getEndTime(); + long currentEndTime = cachedTimes.getLong(cachedTimes.getPositionCount() - 1); // Find corresponding block while (currentEndTime < nextWindowTimeBegin) { // Consume all data @@ -610,7 +609,7 @@ return state; } Column[] columns = parentLayerReader.current(); - TimeColumn times = (TimeColumn) columns[1]; + Column times = columns[1]; Column values = columns[0]; tvList.putColumn(times, values);
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/udf/UDTFExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/udf/UDTFExecutor.java index 00d91cc..f7a31fc 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/udf/UDTFExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/udf/UDTFExecutor.java
@@ -217,7 +217,7 @@ // Some UDTF only generate data in terminate method if (timeColumn.getPositionCount() != 0) { cachedColumns = new Column[] {valueColumn, timeColumn}; - outputStorage.putColumn((TimeColumn) timeColumn, valueColumn); + outputStorage.putColumn(timeColumn, valueColumn); } else { cachedColumns = null; }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/util/LayerCacheUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/util/LayerCacheUtils.java index 56b2a81..e63b014 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/util/LayerCacheUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/util/LayerCacheUtils.java
@@ -26,7 +26,6 @@ import org.apache.iotdb.db.queryengine.transformation.datastructure.tv.ElasticSerializableTVList; import org.apache.tsfile.block.column.Column; -import org.apache.tsfile.read.common.block.column.TimeColumn; public class LayerCacheUtils { @@ -43,7 +42,7 @@ // First column is the value column; // Second column is always the time column. Column[] columns = source.current(); - target.putColumn((TimeColumn) columns[1], columns[0]); + target.putColumn(columns[1], columns[0]); source.consumedAll(); return YieldableState.YIELDABLE; @@ -58,7 +57,7 @@ } Column[] columns = source.current(); - target.putColumn((TimeColumn) columns[1], columns[0]); + target.putColumn(columns[1], columns[0]); source.consumedAll(); int size = columns[0].getPositionCount();
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/datastructure/TVColumns.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/datastructure/TVColumns.java index 7d1ef5b..b4e2d21 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/datastructure/TVColumns.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/datastructure/TVColumns.java
@@ -20,14 +20,13 @@ package org.apache.iotdb.db.queryengine.transformation.datastructure; import org.apache.tsfile.block.column.Column; -import org.apache.tsfile.read.common.block.column.TimeColumn; public class TVColumns { private boolean isConstant; - private TimeColumn timeColumn; + private Column timeColumn; private Column valueColumn; - public TVColumns(TimeColumn timeColumn, Column valueColumn) { + public TVColumns(Column timeColumn, Column valueColumn) { this.timeColumn = timeColumn; this.valueColumn = valueColumn; isConstant = false; @@ -54,7 +53,7 @@ if (isConstant) { throw new UnsupportedOperationException(); } - return timeColumn.getEndTime(); + return timeColumn.getLong(timeColumn.getPositionCount() - 1); } public Column getValueColumn() {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/datastructure/tv/ElasticSerializableBinaryTVList.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/datastructure/tv/ElasticSerializableBinaryTVList.java index e596a36..098997f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/datastructure/tv/ElasticSerializableBinaryTVList.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/datastructure/tv/ElasticSerializableBinaryTVList.java
@@ -27,7 +27,6 @@ import org.apache.tsfile.block.column.ColumnBuilder; import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.read.common.block.column.BinaryColumnBuilder; -import org.apache.tsfile.read.common.block.column.TimeColumn; import org.apache.tsfile.read.common.block.column.TimeColumnBuilder; import org.apache.tsfile.utils.Binary; import org.apache.tsfile.utils.BytesUtils; @@ -140,7 +139,7 @@ timeColumnBuilder.writeLong(i); valueColumnBuilder.writeBinary(empty); } - TimeColumn timeColumn = (TimeColumn) timeColumnBuilder.build(); + Column timeColumn = timeColumnBuilder.build(); Column valueColumn = valueColumnBuilder.build(); newESTVList.putColumn(timeColumn, valueColumn); }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/datastructure/tv/SerializableTVList.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/datastructure/tv/SerializableTVList.java index d299269..5f76cd4 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/datastructure/tv/SerializableTVList.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/datastructure/tv/SerializableTVList.java
@@ -23,7 +23,6 @@ import org.apache.iotdb.db.queryengine.transformation.datastructure.SerializableList; import org.apache.tsfile.block.column.Column; -import org.apache.tsfile.common.conf.TSFileConfig; import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.read.common.block.TsBlock; import org.apache.tsfile.read.common.block.column.TsBlockSerde; @@ -103,10 +102,7 @@ } rowLength += ReadWriteIOUtils.BIT_LEN; - int capacity = - TSFileConfig.ARRAY_CAPACITY_THRESHOLD - * (int) - (memoryLimitInMB * MB / 2 / (rowLength * TSFileConfig.ARRAY_CAPACITY_THRESHOLD)); + int capacity = (int) (memoryLimitInMB * MB / 2 / (rowLength)); if (capacity <= 0) { throw new RuntimeException("Memory is not enough for current query."); }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/RestService.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/RestService.java index fa8df0c..7fc4d78 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/RestService.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/RestService.java
@@ -67,7 +67,7 @@ if (clientAuth) { sslContextFactory.setTrustStorePath(trustStorePath); sslContextFactory.setTrustStorePassword(trustStorePwd); - sslContextFactory.setNeedClientAuth(clientAuth); + sslContextFactory.setNeedClientAuth(true); } ServerConnector httpsConnector =
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java index 133f878..dfe5e4e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
@@ -153,6 +153,7 @@ import org.apache.iotdb.db.tools.settle.TsFileAndModSettleTool; import org.apache.iotdb.db.utils.CommonUtils; import org.apache.iotdb.db.utils.DateTimeUtils; +import org.apache.iotdb.db.utils.EncryptDBUtils; import org.apache.iotdb.db.utils.ModificationUtils; import org.apache.iotdb.metrics.utils.MetricLevel; import org.apache.iotdb.rpc.RpcUtils; @@ -3087,7 +3088,9 @@ if (!isCompactionSelecting.compareAndSet(false, true)) { return 0; } - CompactionScheduleContext context = new CompactionScheduleContext(); + CompactionScheduleContext context = + new CompactionScheduleContext( + EncryptDBUtils.getFirstEncryptParamFromDatabase(databaseName)); try { List<Long> timePartitions = new ArrayList<>(tsFileManager.getTimePartitions()); // Sort the time partition from largest to smallest @@ -3140,7 +3143,9 @@ return 0; } logger.info("[TTL] {}-{} Start ttl and modification checking.", databaseName, dataRegionId); - CompactionScheduleContext context = new CompactionScheduleContext(); + CompactionScheduleContext context = + new CompactionScheduleContext( + EncryptDBUtils.getFirstEncryptParamFromDatabase(databaseName)); List<Long> timePartitions = new ArrayList<>(tsFileManager.getTimePartitions()); // Sort the time partition from smallest to largest Collections.sort(timePartitions);
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/CrossCompactionPerformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/CrossCompactionPerformer.java index 5528951..2e5ff20 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/CrossCompactionPerformer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/CrossCompactionPerformer.java
@@ -19,11 +19,14 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.constant; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.exception.IllegalCompactionPerformerException; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.ICrossCompactionPerformer; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.FastCompactionPerformer; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.ReadPointCompactionPerformer; +import org.apache.tsfile.encrypt.EncryptParameter; + public enum CrossCompactionPerformer { READ_POINT, FAST; @@ -38,6 +41,7 @@ "Illegal compaction performer for cross compaction " + name); } + @TestOnly public ICrossCompactionPerformer createInstance() { switch (this) { case READ_POINT: @@ -49,4 +53,16 @@ "Illegal compaction performer for cross compaction " + this); } } + + public ICrossCompactionPerformer createInstance(EncryptParameter encryptParameter) { + switch (this) { + case READ_POINT: + return new ReadPointCompactionPerformer(encryptParameter); + case FAST: + return new FastCompactionPerformer(true, encryptParameter); + default: + throw new IllegalCompactionPerformerException( + "Illegal compaction performer for cross compaction " + this); + } + } }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/InnerSeqCompactionPerformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/InnerSeqCompactionPerformer.java index 21215d9..f64597e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/InnerSeqCompactionPerformer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/InnerSeqCompactionPerformer.java
@@ -19,11 +19,14 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.constant; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.exception.IllegalCompactionPerformerException; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.ISeqCompactionPerformer; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.FastCompactionPerformer; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.ReadChunkCompactionPerformer; +import org.apache.tsfile.encrypt.EncryptParameter; + public enum InnerSeqCompactionPerformer { READ_CHUNK, FAST; @@ -38,6 +41,7 @@ "Illegal compaction performer for seq inner compaction " + name); } + @TestOnly public ISeqCompactionPerformer createInstance() { switch (this) { case READ_CHUNK: @@ -49,4 +53,16 @@ "Illegal compaction performer for seq inner compaction " + this); } } + + public ISeqCompactionPerformer createInstance(EncryptParameter encryptParameter) { + switch (this) { + case READ_CHUNK: + return new ReadChunkCompactionPerformer(encryptParameter); + case FAST: + return new FastCompactionPerformer(false, encryptParameter); + default: + throw new IllegalCompactionPerformerException( + "Illegal compaction performer for seq inner compaction " + this); + } + } }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/InnerUnseqCompactionPerformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/InnerUnseqCompactionPerformer.java index bf6956d..857a5f6 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/InnerUnseqCompactionPerformer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/InnerUnseqCompactionPerformer.java
@@ -19,11 +19,14 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.constant; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.exception.IllegalCompactionPerformerException; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.IUnseqCompactionPerformer; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.FastCompactionPerformer; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.ReadPointCompactionPerformer; +import org.apache.tsfile.encrypt.EncryptParameter; + public enum InnerUnseqCompactionPerformer { READ_POINT, FAST; @@ -38,6 +41,7 @@ "Illegal compaction performer for unseq inner compaction " + name); } + @TestOnly public IUnseqCompactionPerformer createInstance() { switch (this) { case READ_POINT: @@ -49,4 +53,16 @@ "Illegal compaction performer for unseq inner compaction " + this); } } + + public IUnseqCompactionPerformer createInstance(EncryptParameter encryptParameter) { + switch (this) { + case READ_POINT: + return new ReadPointCompactionPerformer(encryptParameter); + case FAST: + return new FastCompactionPerformer(false, encryptParameter); + default: + throw new IllegalCompactionPerformerException( + "Illegal compaction performer for unseq inner compaction " + this); + } + } }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java index fafba7a..91184aa 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java
@@ -22,6 +22,7 @@ import org.apache.iotdb.commons.conf.IoTDBConstant; import org.apache.iotdb.commons.exception.IllegalPathException; import org.apache.iotdb.commons.path.PatternTreeMap; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.exception.WriteProcessException; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.exception.CompactionLastTimeCheckFailedException; @@ -47,6 +48,8 @@ import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; import org.apache.iotdb.db.utils.datastructure.PatternTreeMapFactory; +import org.apache.tsfile.common.conf.TSFileDescriptor; +import org.apache.tsfile.encrypt.EncryptParameter; import org.apache.tsfile.exception.StopReadTsFileByInterruptException; import org.apache.tsfile.exception.write.PageException; import org.apache.tsfile.file.metadata.IDeviceID; @@ -96,6 +99,9 @@ private final boolean isCrossCompaction; + private EncryptParameter encryptParameter; + + @TestOnly public FastCompactionPerformer( List<TsFileResource> seqFiles, List<TsFileResource> unseqFiles, @@ -109,10 +115,41 @@ } else { isCrossCompaction = true; } + this.encryptParameter = + new EncryptParameter( + TSFileDescriptor.getInstance().getConfig().getEncryptType(), + TSFileDescriptor.getInstance().getConfig().getEncryptKey()); } + public FastCompactionPerformer( + List<TsFileResource> seqFiles, + List<TsFileResource> unseqFiles, + List<TsFileResource> targetFiles, + EncryptParameter encryptParameter) { + this.seqFiles = seqFiles; + this.unseqFiles = unseqFiles; + this.targetFiles = targetFiles; + if (seqFiles.isEmpty() || unseqFiles.isEmpty()) { + // inner space compaction + isCrossCompaction = false; + } else { + isCrossCompaction = true; + } + this.encryptParameter = encryptParameter; + } + + @TestOnly public FastCompactionPerformer(boolean isCrossCompaction) { this.isCrossCompaction = isCrossCompaction; + this.encryptParameter = + new EncryptParameter( + TSFileDescriptor.getInstance().getConfig().getEncryptType(), + TSFileDescriptor.getInstance().getConfig().getEncryptKey()); + } + + public FastCompactionPerformer(boolean isCrossCompaction, EncryptParameter encryptParameter) { + this.isCrossCompaction = isCrossCompaction; + this.encryptParameter = encryptParameter; } @Override @@ -122,8 +159,9 @@ new MultiTsFileDeviceIterator(seqFiles, unseqFiles, readerCacheMap); AbstractCompactionWriter compactionWriter = isCrossCompaction - ? new FastCrossCompactionWriter(targetFiles, seqFiles, readerCacheMap) - : new FastInnerCompactionWriter(targetFiles)) { + ? new FastCrossCompactionWriter( + targetFiles, seqFiles, readerCacheMap, encryptParameter) + : new FastInnerCompactionWriter(targetFiles, encryptParameter)) { List<Schema> schemas = CompactionTableSchemaCollector.collectSchema( seqFiles, unseqFiles, readerCacheMap, deviceIterator.getDeprecatedTableSchemaMap());
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadChunkCompactionPerformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadChunkCompactionPerformer.java index 837978b..eaed8a7 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadChunkCompactionPerformer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadChunkCompactionPerformer.java
@@ -21,6 +21,7 @@ import org.apache.iotdb.commons.exception.IllegalPathException; import org.apache.iotdb.commons.exception.MetadataException; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.exception.StorageEngineException; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.ISeqCompactionPerformer; @@ -35,7 +36,10 @@ import org.apache.iotdb.db.storageengine.dataregion.compaction.selector.estimator.ReadChunkInnerCompactionEstimator; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo; +import org.apache.iotdb.db.utils.EncryptDBUtils; +import org.apache.tsfile.common.conf.TSFileDescriptor; +import org.apache.tsfile.encrypt.EncryptParameter; import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.exception.write.PageException; import org.apache.tsfile.file.metadata.AbstractAlignedChunkMetadata; @@ -66,21 +70,60 @@ * IoTDBDescriptor.getInstance().getConfig().getChunkMetadataSizeProportion()); private Schema schema = null; + private EncryptParameter firstEncryptParameter; + + @TestOnly public ReadChunkCompactionPerformer(List<TsFileResource> sourceFiles, TsFileResource targetFile) { this(sourceFiles, Collections.singletonList(targetFile)); } public ReadChunkCompactionPerformer( + List<TsFileResource> sourceFiles, + TsFileResource targetFile, + EncryptParameter encryptParameter) { + this(sourceFiles, Collections.singletonList(targetFile), encryptParameter); + } + + @TestOnly + public ReadChunkCompactionPerformer( List<TsFileResource> sourceFiles, List<TsFileResource> targetFiles) { setSourceFiles(sourceFiles); setTargetFiles(targetFiles); + this.firstEncryptParameter = EncryptDBUtils.getDefaultFirstEncryptParam(); } + public ReadChunkCompactionPerformer( + List<TsFileResource> sourceFiles, + List<TsFileResource> targetFiles, + EncryptParameter encryptParameter) { + setSourceFiles(sourceFiles); + setTargetFiles(targetFiles); + this.firstEncryptParameter = encryptParameter; + } + + @TestOnly public ReadChunkCompactionPerformer(List<TsFileResource> sourceFiles) { setSourceFiles(sourceFiles); + this.firstEncryptParameter = EncryptDBUtils.getDefaultFirstEncryptParam(); } - public ReadChunkCompactionPerformer() {} + public ReadChunkCompactionPerformer( + List<TsFileResource> sourceFiles, EncryptParameter encryptParameter) { + setSourceFiles(sourceFiles); + this.firstEncryptParameter = encryptParameter; + } + + @TestOnly + public ReadChunkCompactionPerformer() { + this.firstEncryptParameter = + new EncryptParameter( + TSFileDescriptor.getInstance().getConfig().getEncryptType(), + TSFileDescriptor.getInstance().getConfig().getEncryptKey()); + } + + public ReadChunkCompactionPerformer(EncryptParameter encryptParameter) { + this.firstEncryptParameter = encryptParameter; + } @Override public void perform() @@ -164,7 +207,8 @@ new CompactionTsFileWriter( targetResources.get(currentTargetFileIndex).getTsFile(), memoryBudgetForFileWriter, - CompactionType.INNER_SEQ_COMPACTION); + CompactionType.INNER_SEQ_COMPACTION, + firstEncryptParameter); currentWriter.setSchema(CompactionTableSchemaCollector.copySchema(schema)); }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadPointCompactionPerformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadPointCompactionPerformer.java index ca650f2..c588703 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadPointCompactionPerformer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadPointCompactionPerformer.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.commons.path.AlignedFullPath; import org.apache.iotdb.commons.path.IFullPath; import org.apache.iotdb.commons.path.NonAlignedFullPath; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.queryengine.execution.fragment.FragmentInstanceContext; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.ICrossCompactionPerformer; @@ -43,8 +44,11 @@ import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource; import org.apache.iotdb.db.storageengine.dataregion.read.control.QueryResourceManager; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; +import org.apache.iotdb.db.utils.EncryptDBUtils; import org.apache.tsfile.common.constant.TsFileConstant; +import org.apache.tsfile.encrypt.EncryptParameter; +import org.apache.tsfile.encrypt.EncryptUtils; import org.apache.tsfile.file.metadata.IDeviceID; import org.apache.tsfile.read.common.block.TsBlock; import org.apache.tsfile.read.reader.IPointReader; @@ -83,6 +87,9 @@ protected List<TsFileResource> targetFiles = Collections.emptyList(); + private EncryptParameter encryptParameter; + + @TestOnly public ReadPointCompactionPerformer( List<TsFileResource> seqFiles, List<TsFileResource> unseqFiles, @@ -90,15 +97,45 @@ this.seqFiles = seqFiles; this.unseqFiles = unseqFiles; this.targetFiles = targetFiles; + this.encryptParameter = EncryptDBUtils.getDefaultFirstEncryptParam(); } public ReadPointCompactionPerformer( + List<TsFileResource> seqFiles, + List<TsFileResource> unseqFiles, + List<TsFileResource> targetFiles, + EncryptParameter encryptParameter) { + this.seqFiles = seqFiles; + this.unseqFiles = unseqFiles; + this.targetFiles = targetFiles; + this.encryptParameter = encryptParameter; + } + + @TestOnly + public ReadPointCompactionPerformer( List<TsFileResource> seqFiles, List<TsFileResource> unseqFiles) { this.seqFiles = seqFiles; this.unseqFiles = unseqFiles; + this.encryptParameter = EncryptDBUtils.getDefaultFirstEncryptParam(); } - public ReadPointCompactionPerformer() {} + public ReadPointCompactionPerformer( + List<TsFileResource> seqFiles, + List<TsFileResource> unseqFiles, + EncryptParameter encryptParameter) { + this.seqFiles = seqFiles; + this.unseqFiles = unseqFiles; + this.encryptParameter = encryptParameter; + } + + @TestOnly + public ReadPointCompactionPerformer() { + this.encryptParameter = EncryptDBUtils.getDefaultFirstEncryptParam(); + } + + public ReadPointCompactionPerformer(EncryptParameter encryptParameter) { + this.encryptParameter = encryptParameter; + } @SuppressWarnings("squid:S2095") // Do not close device iterator @Override @@ -162,6 +199,10 @@ this.summary = summary; } + public EncryptParameter getEncryptParameter() { + return encryptParameter; + } + private void compactAlignedSeries( IDeviceID device, MultiTsFileDeviceIterator deviceIterator, @@ -197,7 +238,10 @@ measurementSchemas.add(0, timeSchema); compactionWriter.startMeasurement( TsFileConstant.TIME_COLUMN_ID, - new AlignedChunkWriterImpl(measurementSchemas.remove(0), measurementSchemas), + new AlignedChunkWriterImpl( + measurementSchemas.remove(0), + measurementSchemas, + EncryptUtils.getEncryptParameter(getEncryptParameter())), 0); writeWithReader(compactionWriter, dataBlockReader, device, 0, true); compactionWriter.endMeasurement(0); @@ -307,10 +351,11 @@ throws IOException { if (!seqFileResources.isEmpty() && !unseqFileResources.isEmpty()) { // cross space - return new ReadPointCrossCompactionWriter(targetFileResources, seqFileResources); + return new ReadPointCrossCompactionWriter( + targetFileResources, seqFileResources, encryptParameter); } else { // inner space - return new ReadPointInnerCompactionWriter(targetFileResources); + return new ReadPointInnerCompactionWriter(targetFileResources, encryptParameter); } }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/RepairUnsortedFileCompactionPerformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/RepairUnsortedFileCompactionPerformer.java index 3bdfefb..962957f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/RepairUnsortedFileCompactionPerformer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/RepairUnsortedFileCompactionPerformer.java
@@ -19,6 +19,7 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionUtils; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer.AbstractCompactionWriter; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer.RepairUnsortedFileCompactionWriter; @@ -28,6 +29,9 @@ import org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ArrayDeviceTimeIndex; import org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ITimeIndex; import org.apache.iotdb.db.storageengine.rescon.memory.TsFileResourceManager; +import org.apache.iotdb.db.utils.EncryptDBUtils; + +import org.apache.tsfile.encrypt.EncryptParameter; import java.io.IOException; import java.nio.file.Files; @@ -37,8 +41,13 @@ /** Used for fixing files which contains internal unsorted data */ public class RepairUnsortedFileCompactionPerformer extends ReadPointCompactionPerformer { + @TestOnly public RepairUnsortedFileCompactionPerformer() { - super(); + super(EncryptDBUtils.getDefaultFirstEncryptParam()); + } + + public RepairUnsortedFileCompactionPerformer(EncryptParameter encryptParameter) { + super(encryptParameter); } @Override @@ -47,7 +56,8 @@ List<TsFileResource> unseqFileResources, List<TsFileResource> targetFileResources) throws IOException { - return new RepairUnsortedFileCompactionWriter(targetFileResources.get(0)); + return new RepairUnsortedFileCompactionWriter( + targetFileResources.get(0), getEncryptParameter()); } @Override
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/RepairUnsortedFileCompactionTask.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/RepairUnsortedFileCompactionTask.java index 8619c4c..fe19579 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/RepairUnsortedFileCompactionTask.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/RepairUnsortedFileCompactionTask.java
@@ -32,6 +32,7 @@ import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResourceStatus; import org.apache.iotdb.db.storageengine.dataregion.tsfile.generator.TsFileNameGenerator; import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo; +import org.apache.iotdb.db.utils.EncryptDBUtils; import java.io.File; import java.io.IOException; @@ -72,7 +73,8 @@ tsFileManager, Collections.singletonList(sourceFile), sequence, - new RepairUnsortedFileCompactionPerformer(), + new RepairUnsortedFileCompactionPerformer( + EncryptDBUtils.getFirstEncryptParamFromDatabase(tsFileManager.getStorageGroupName())), serialId); this.sourceFile = sourceFile; if (this.sourceFile.getTsFileRepairStatus() != TsFileRepairStatus.NEED_TO_REPAIR_BY_MOVE) { @@ -93,7 +95,8 @@ tsFileManager, Collections.singletonList(sourceFile), sequence, - new RepairUnsortedFileCompactionPerformer(), + new RepairUnsortedFileCompactionPerformer( + EncryptDBUtils.getFirstEncryptParamFromDatabase(tsFileManager.getStorageGroupName())), serialId); this.sourceFile = sourceFile; if (this.sourceFile.getTsFileRepairStatus() != TsFileRepairStatus.NEED_TO_REPAIR_BY_MOVE) {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/subtask/ReadPointPerformerSubTask.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/subtask/ReadPointPerformerSubTask.java index 6ab56e68..74f7259 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/subtask/ReadPointPerformerSubTask.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/subtask/ReadPointPerformerSubTask.java
@@ -26,6 +26,7 @@ import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer.AbstractCompactionWriter; import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource; +import org.apache.tsfile.encrypt.EncryptUtils; import org.apache.tsfile.file.metadata.IDeviceID; import org.apache.tsfile.write.chunk.ChunkWriterImpl; import org.apache.tsfile.write.schema.IMeasurementSchema; @@ -91,7 +92,12 @@ if (dataBlockReader.hasNextBatch()) { compactionWriter.startMeasurement( - measurement, new ChunkWriterImpl(measurementSchemas.get(0), true), taskId); + measurement, + new ChunkWriterImpl( + measurementSchemas.get(0), + true, + EncryptUtils.getEncryptParameter(compactionWriter.getEncryptParameter())), + taskId); ReadPointCompactionPerformer.writeWithReader( compactionWriter, dataBlockReader, device, taskId, false); compactionWriter.endMeasurement(taskId);
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/MultiTsFileDeviceIterator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/MultiTsFileDeviceIterator.java index e662e8e..1889182 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/MultiTsFileDeviceIterator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/MultiTsFileDeviceIterator.java
@@ -32,6 +32,7 @@ import org.apache.iotdb.db.storageengine.dataregion.modification.TreeDeletionEntry; import org.apache.iotdb.db.storageengine.dataregion.read.control.FileReaderManager; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; +import org.apache.iotdb.db.utils.EncryptDBUtils; import org.apache.iotdb.db.utils.ModificationUtils; import org.apache.iotdb.db.utils.datastructure.PatternTreeMapFactory; @@ -98,7 +99,9 @@ for (TsFileResource tsFileResource : this.tsFileResourcesSortedByDesc) { CompactionTsFileReader reader = new CompactionTsFileReader( - tsFileResource.getTsFilePath(), CompactionType.INNER_SEQ_COMPACTION); + tsFileResource.getTsFilePath(), + CompactionType.INNER_SEQ_COMPACTION, + EncryptDBUtils.getFirstEncryptParamFromTSFilePath(tsFileResource.getTsFilePath())); readerMap.put(tsFileResource, reader); deviceIteratorMap.put(tsFileResource, reader.getAllDevicesIteratorWithIsAligned()); } @@ -163,7 +166,10 @@ for (TsFileResource tsFileResource : tsFileResourcesSortedByDesc) { TsFileSequenceReader reader = - new CompactionTsFileReader(tsFileResource.getTsFilePath(), type); + new CompactionTsFileReader( + tsFileResource.getTsFilePath(), + type, + EncryptDBUtils.getFirstEncryptParamFromTSFilePath(tsFileResource.getTsFilePath())); readerMap.put(tsFileResource, reader); deviceIteratorMap.put(tsFileResource, reader.getAllDevicesIteratorWithIsAligned()); }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/BatchedFastAlignedSeriesCompactionExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/BatchedFastAlignedSeriesCompactionExecutor.java index 636fba8..0c1f12e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/BatchedFastAlignedSeriesCompactionExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/BatchedFastAlignedSeriesCompactionExecutor.java
@@ -42,6 +42,7 @@ import org.apache.iotdb.db.utils.datastructure.PatternTreeMapFactory; import org.apache.tsfile.common.constant.TsFileConstant; +import org.apache.tsfile.encrypt.EncryptUtils; import org.apache.tsfile.exception.write.PageException; import org.apache.tsfile.file.metadata.AbstractAlignedChunkMetadata; import org.apache.tsfile.file.metadata.ChunkMetadata; @@ -249,7 +250,9 @@ throws PageException, IllegalPathException, IOException, WriteProcessException { FirstBatchCompactionAlignedChunkWriter firstBatchCompactionAlignedChunkWriter = new FirstBatchCompactionAlignedChunkWriter( - this.measurementSchemas.remove(0), this.measurementSchemas); + this.measurementSchemas.remove(0), + this.measurementSchemas, + EncryptUtils.getEncryptParameter(compactionWriter.getEncryptParameter())); firstBatchCompactionAlignedChunkWriter.registerBeforeFlushChunkWriterCallback( chunkWriter -> { @@ -359,7 +362,8 @@ new FollowingBatchCompactionAlignedChunkWriter( measurementSchemas.remove(0), measurementSchemas, - batchCompactionPlan.getCompactChunkPlan(0)); + batchCompactionPlan.getCompactChunkPlan(0), + EncryptUtils.getEncryptParameter(compactionWriter.getEncryptParameter())); flushController = new FollowedBatchedCompactionFlushController( batchCompactionPlan, followingBatchCompactionAlignedChunkWriter);
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/BatchedReadChunkAlignedSeriesCompactionExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/BatchedReadChunkAlignedSeriesCompactionExecutor.java index e343ea5..dc03078 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/BatchedReadChunkAlignedSeriesCompactionExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/BatchedReadChunkAlignedSeriesCompactionExecutor.java
@@ -37,6 +37,7 @@ import org.apache.iotdb.db.storageengine.dataregion.compaction.io.CompactionTsFileWriter; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; +import org.apache.tsfile.encrypt.EncryptUtils; import org.apache.tsfile.exception.write.PageException; import org.apache.tsfile.file.metadata.AbstractAlignedChunkMetadata; import org.apache.tsfile.file.metadata.ChunkMetadata; @@ -209,7 +210,8 @@ @Override protected AlignedChunkWriterImpl constructAlignedChunkWriter() { - return new FirstBatchCompactionAlignedChunkWriter(timeSchema, schemaList); + return new FirstBatchCompactionAlignedChunkWriter( + timeSchema, schemaList, EncryptUtils.getEncryptParameter(writer.getEncryptParameter())); } @Override @@ -326,7 +328,10 @@ this.flushController = new FollowingBatchReadChunkAlignedSeriesCompactionFlushController(); this.chunkWriter = new FollowingBatchCompactionAlignedChunkWriter( - timeSchema, schemaList, batchCompactionPlan.getCompactChunkPlan(0)); + timeSchema, + schemaList, + batchCompactionPlan.getCompactChunkPlan(0), + EncryptUtils.getEncryptParameter(writer.getEncryptParameter())); } @Override
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/utils/FirstBatchCompactionAlignedChunkWriter.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/utils/FirstBatchCompactionAlignedChunkWriter.java index 4d074c3..0109fcd 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/utils/FirstBatchCompactionAlignedChunkWriter.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/utils/FirstBatchCompactionAlignedChunkWriter.java
@@ -19,9 +19,13 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.batch.utils; +import org.apache.iotdb.commons.utils.TestOnly; + import org.apache.tsfile.common.conf.TSFileDescriptor; import org.apache.tsfile.encoding.encoder.Encoder; import org.apache.tsfile.encoding.encoder.TSEncodingBuilder; +import org.apache.tsfile.encrypt.EncryptParameter; +import org.apache.tsfile.encrypt.EncryptUtils; import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.exception.write.PageException; import org.apache.tsfile.file.header.PageHeader; @@ -45,13 +49,16 @@ private ChunkWriterFlushCallback beforeChunkWriterFlushCallback; + @TestOnly public FirstBatchCompactionAlignedChunkWriter(VectorMeasurementSchema schema) { + this.encryptParam = EncryptUtils.getEncryptParameter(); timeChunkWriter = new FirstBatchCompactionTimeChunkWriter( schema.getMeasurementName(), schema.getCompressor(), schema.getTimeTSEncoding(), - schema.getTimeEncoder()); + schema.getTimeEncoder(), + encryptParam); List<String> valueMeasurementIdList = schema.getSubMeasurementsList(); List<TSDataType> valueTSDataTypeList = schema.getSubMeasurementsTSDataTypeList(); @@ -66,21 +73,32 @@ schema.getCompressor(), valueTSDataTypeList.get(i), valueTSEncodingList.get(i), - valueEncoderList.get(i))); + valueEncoderList.get(i), + encryptParam)); } this.valueIndex = 0; this.remainingPointsNumber = timeChunkWriter.getRemainingPointNumberForCurrentPage(); } + @TestOnly public FirstBatchCompactionAlignedChunkWriter( IMeasurementSchema timeSchema, List<IMeasurementSchema> valueSchemaList) { + this(timeSchema, valueSchemaList, EncryptUtils.getEncryptParameter()); + } + + public FirstBatchCompactionAlignedChunkWriter( + IMeasurementSchema timeSchema, + List<IMeasurementSchema> valueSchemaList, + EncryptParameter param) { + this.encryptParam = param; timeChunkWriter = new FirstBatchCompactionTimeChunkWriter( timeSchema.getMeasurementName(), timeSchema.getCompressor(), timeSchema.getEncodingType(), - timeSchema.getTimeEncoder()); + timeSchema.getTimeEncoder(), + param); valueChunkWriterList = new ArrayList<>(valueSchemaList.size()); for (int i = 0; i < valueSchemaList.size(); i++) { @@ -90,14 +108,17 @@ valueSchemaList.get(i).getCompressor(), valueSchemaList.get(i).getType(), valueSchemaList.get(i).getEncodingType(), - valueSchemaList.get(i).getValueEncoder())); + valueSchemaList.get(i).getValueEncoder(), + param)); } this.valueIndex = 0; this.remainingPointsNumber = timeChunkWriter.getRemainingPointNumberForCurrentPage(); } + @TestOnly public FirstBatchCompactionAlignedChunkWriter(List<IMeasurementSchema> schemaList) { + this.encryptParam = EncryptUtils.getEncryptParameter(); TSEncoding timeEncoding = TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder()); TSDataType timeType = TSFileDescriptor.getInstance().getConfig().getTimeSeriesDataType(); @@ -108,7 +129,8 @@ "", timeCompression, timeEncoding, - TSEncodingBuilder.getEncodingBuilder(timeEncoding).getEncoder(timeType)); + TSEncodingBuilder.getEncodingBuilder(timeEncoding).getEncoder(timeType), + encryptParam); valueChunkWriterList = new ArrayList<>(schemaList.size()); for (int i = 0; i < schemaList.size(); i++) { @@ -118,7 +140,8 @@ schemaList.get(i).getCompressor(), schemaList.get(i).getType(), schemaList.get(i).getEncodingType(), - schemaList.get(i).getValueEncoder())); + schemaList.get(i).getValueEncoder(), + encryptParam)); } this.valueIndex = 0; @@ -154,7 +177,21 @@ CompressionType compressionType, TSEncoding encodingType, Encoder timeEncoder) { - super(measurementId, compressionType, encodingType, timeEncoder); + super( + measurementId, + compressionType, + encodingType, + timeEncoder, + EncryptUtils.getEncryptParameter()); + } + + public FirstBatchCompactionTimeChunkWriter( + String measurementId, + CompressionType compressionType, + TSEncoding encodingType, + Encoder timeEncoder, + EncryptParameter encryptParam) { + super(measurementId, compressionType, encodingType, timeEncoder, encryptParam); } @Override
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/utils/FollowingBatchCompactionAlignedChunkWriter.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/utils/FollowingBatchCompactionAlignedChunkWriter.java index a00a568..85813d2 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/utils/FollowingBatchCompactionAlignedChunkWriter.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/utils/FollowingBatchCompactionAlignedChunkWriter.java
@@ -19,8 +19,11 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.batch.utils; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.exception.BatchCompactionCannotAlignedException; +import org.apache.tsfile.encrypt.EncryptParameter; +import org.apache.tsfile.encrypt.EncryptUtils; import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.exception.write.PageException; import org.apache.tsfile.file.header.PageHeader; @@ -43,10 +46,20 @@ private CompactChunkPlan compactChunkPlan; private ChunkWriterFlushCallback afterChunkWriterFlushCallback; + @TestOnly public FollowingBatchCompactionAlignedChunkWriter( IMeasurementSchema timeSchema, List<IMeasurementSchema> valueSchemaList, CompactChunkPlan compactChunkPlan) { + this(timeSchema, valueSchemaList, compactChunkPlan, EncryptUtils.getEncryptParameter()); + } + + public FollowingBatchCompactionAlignedChunkWriter( + IMeasurementSchema timeSchema, + List<IMeasurementSchema> valueSchemaList, + CompactChunkPlan compactChunkPlan, + EncryptParameter encryptParameter) { + this.encryptParam = encryptParameter; timeChunkWriter = new FollowingBatchCompactionTimeChunkWriter(); valueChunkWriterList = new ArrayList<>(valueSchemaList.size()); @@ -57,7 +70,8 @@ valueSchemaList.get(i).getCompressor(), valueSchemaList.get(i).getType(), valueSchemaList.get(i).getEncodingType(), - valueSchemaList.get(i).getValueEncoder())); + valueSchemaList.get(i).getValueEncoder(), + encryptParameter)); } this.valueIndex = 0; this.compactChunkPlan = compactChunkPlan;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java index 7ad7881..4e71c03 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java
@@ -40,6 +40,7 @@ import org.apache.iotdb.db.utils.datastructure.PatternTreeMapFactory; import org.apache.tsfile.common.constant.TsFileConstant; +import org.apache.tsfile.encrypt.EncryptUtils; import org.apache.tsfile.exception.write.PageException; import org.apache.tsfile.file.header.ChunkHeader; import org.apache.tsfile.file.header.PageHeader; @@ -106,7 +107,10 @@ throws PageException, IllegalPathException, IOException, WriteProcessException { compactionWriter.startMeasurement( TsFileConstant.TIME_COLUMN_ID, - new AlignedChunkWriterImpl(measurementSchemas.remove(0), measurementSchemas), + new AlignedChunkWriterImpl( + measurementSchemas.remove(0), + measurementSchemas, + EncryptUtils.getEncryptParameter(compactionWriter.getEncryptParameter())), subTaskId); compactFiles(); compactionWriter.endMeasurement(subTaskId);
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java index e2be4be..b07407c 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java
@@ -35,6 +35,7 @@ import org.apache.iotdb.db.utils.ModificationUtils; import org.apache.iotdb.db.utils.datastructure.PatternTreeMapFactory; +import org.apache.tsfile.encrypt.EncryptUtils; import org.apache.tsfile.exception.write.PageException; import org.apache.tsfile.file.header.ChunkHeader; import org.apache.tsfile.file.header.PageHeader; @@ -207,7 +208,12 @@ header.getEncodingType(), header.getCompressionType()); compactionWriter.startMeasurement( - schema.getMeasurementName(), new ChunkWriterImpl(schema, true), subTaskId); + schema.getMeasurementName(), + new ChunkWriterImpl( + schema, + true, + EncryptUtils.getEncryptParameter(compactionWriter.getEncryptParameter())), + subTaskId); hasStartMeasurement = true; seriesCompressionType = header.getCompressionType(); seriesTSEncoding = header.getEncodingType();
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/AlignedSeriesCompactionExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/AlignedSeriesCompactionExecutor.java index 1abef8e..af836c3 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/AlignedSeriesCompactionExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/AlignedSeriesCompactionExecutor.java
@@ -26,6 +26,7 @@ import org.apache.iotdb.db.storageengine.dataregion.compaction.io.CompactionTsFileWriter; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; +import org.apache.tsfile.encrypt.EncryptUtils; import org.apache.tsfile.file.header.ChunkHeader; import org.apache.tsfile.file.metadata.AlignedChunkMetadata; import org.apache.tsfile.file.metadata.ChunkMetadata; @@ -82,7 +83,9 @@ this.writer = writer; this.targetResource = targetResource; schemaList = collectSchemaFromAlignedChunkMetadataList(readerAndChunkMetadataList); - chunkWriter = new AlignedChunkWriterImpl(schemaList); + chunkWriter = + new AlignedChunkWriterImpl( + schemaList, EncryptUtils.getEncryptParameter(writer.getEncryptParameter())); this.summary = summary; }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/ReadChunkAlignedSeriesCompactionExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/ReadChunkAlignedSeriesCompactionExecutor.java index e689119..928c0cd 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/ReadChunkAlignedSeriesCompactionExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/ReadChunkAlignedSeriesCompactionExecutor.java
@@ -35,6 +35,7 @@ import org.apache.tsfile.common.conf.TSFileDescriptor; import org.apache.tsfile.encoding.decoder.Decoder; +import org.apache.tsfile.encrypt.EncryptUtils; import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.exception.write.PageException; import org.apache.tsfile.file.header.ChunkHeader; @@ -193,7 +194,8 @@ } protected AlignedChunkWriterImpl constructAlignedChunkWriter() { - return new AlignedChunkWriterImpl(timeSchema, schemaList); + return new AlignedChunkWriterImpl( + timeSchema, schemaList, EncryptUtils.getEncryptParameter(writer.getEncryptParameter())); } public void execute() throws IOException, PageException {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/SingleSeriesCompactionExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/SingleSeriesCompactionExecutor.java index 69ce89d..b09adb1 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/SingleSeriesCompactionExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/SingleSeriesCompactionExecutor.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.db.storageengine.dataregion.compaction.io.CompactionTsFileWriter; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; +import org.apache.tsfile.encrypt.EncryptUtils; import org.apache.tsfile.file.header.ChunkHeader; import org.apache.tsfile.file.metadata.ChunkMetadata; import org.apache.tsfile.file.metadata.IDeviceID; @@ -86,7 +87,9 @@ this.readerAndChunkMetadataList = readerAndChunkMetadataList; this.fileWriter = fileWriter; this.schema = measurementSchema; - this.chunkWriter = new ChunkWriterImpl(this.schema); + this.chunkWriter = + new ChunkWriterImpl( + this.schema, EncryptUtils.getEncryptParameter(fileWriter.getEncryptParameter())); this.cachedChunk = null; this.cachedChunkMetadata = null; this.targetResource = targetResource; @@ -175,7 +178,9 @@ chunkHeader.getDataType(), chunkHeader.getEncodingType(), chunkHeader.getCompressionType()); - this.chunkWriter = new ChunkWriterImpl(this.schema); + this.chunkWriter = + new ChunkWriterImpl( + this.schema, EncryptUtils.getEncryptParameter(fileWriter.getEncryptParameter())); } private long getChunkSize(Chunk chunk) {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractCompactionWriter.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractCompactionWriter.java index 5e79474..3458f98 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractCompactionWriter.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractCompactionWriter.java
@@ -28,6 +28,7 @@ import org.apache.iotdb.db.storageengine.dataregion.compaction.io.CompactionTsFileWriter; import org.apache.iotdb.db.storageengine.dataregion.modification.ModEntry; +import org.apache.tsfile.encrypt.EncryptParameter; import org.apache.tsfile.exception.write.PageException; import org.apache.tsfile.file.header.PageHeader; import org.apache.tsfile.file.metadata.ChunkMetadata; @@ -102,6 +103,8 @@ protected ModEntry ttlDeletionForCurrentDevice; + private EncryptParameter encryptParameter; + public abstract void startChunkGroup(IDeviceID deviceId, boolean isAlign) throws IOException; public abstract void endChunkGroup() throws IOException; @@ -185,6 +188,8 @@ chunkPointNumArray[subTaskId] = 0; } + public abstract EncryptParameter getEncryptParameter(); + public abstract boolean flushNonAlignedChunk( Chunk chunk, ChunkMetadata chunkMetadata, int subTaskId) throws IOException;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractCrossCompactionWriter.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractCrossCompactionWriter.java index e66ee1b..f970ad6 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractCrossCompactionWriter.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractCrossCompactionWriter.java
@@ -19,6 +19,7 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionUtils; import org.apache.iotdb.db.storageengine.dataregion.compaction.io.CompactionTsFileWriter; @@ -26,7 +27,9 @@ import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; import org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ITimeIndex; import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo; +import org.apache.iotdb.db.utils.EncryptDBUtils; +import org.apache.tsfile.encrypt.EncryptParameter; import org.apache.tsfile.file.metadata.IDeviceID; import org.apache.tsfile.file.metadata.TimeseriesMetadata; import org.apache.tsfile.read.TimeValuePair; @@ -68,13 +71,25 @@ protected List<TsFileResource> targetResources; + private final EncryptParameter encryptParameter; + + @TestOnly protected AbstractCrossCompactionWriter( List<TsFileResource> targetResources, List<TsFileResource> seqFileResources) throws IOException { + this(targetResources, seqFileResources, EncryptDBUtils.getDefaultFirstEncryptParam()); + } + + protected AbstractCrossCompactionWriter( + List<TsFileResource> targetResources, + List<TsFileResource> seqFileResources, + EncryptParameter encryptParameter) + throws IOException { currentDeviceEndTime = new long[seqFileResources.size()]; isCurrentDeviceExistedInSourceSeqFiles = new boolean[seqFileResources.size()]; isEmptyFile = new boolean[seqFileResources.size()]; isDeviceExistedInTargetFiles = new boolean[targetResources.size()]; + this.encryptParameter = encryptParameter; long memorySizeForEachWriter = (long) ((double) SystemInfo.getInstance().getMemorySizeForCompaction() @@ -86,7 +101,8 @@ new CompactionTsFileWriter( targetResources.get(i).getTsFile(), memorySizeForEachWriter, - CompactionType.CROSS_COMPACTION)); + CompactionType.CROSS_COMPACTION, + this.encryptParameter)); isEmptyFile[i] = true; } this.seqTsFileResources = seqFileResources; @@ -257,4 +273,9 @@ } protected abstract TsFileSequenceReader getFileReader(TsFileResource resource) throws IOException; + + @Override + public EncryptParameter getEncryptParameter() { + return encryptParameter; + } }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractInnerCompactionWriter.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractInnerCompactionWriter.java index 9d5e6f4..6573bb7 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractInnerCompactionWriter.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractInnerCompactionWriter.java
@@ -19,6 +19,7 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionTableSchemaCollector; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionUtils; @@ -26,7 +27,9 @@ import org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.constant.CompactionType; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo; +import org.apache.iotdb.db.utils.EncryptDBUtils; +import org.apache.tsfile.encrypt.EncryptParameter; import org.apache.tsfile.file.metadata.IDeviceID; import org.apache.tsfile.read.TimeValuePair; import org.apache.tsfile.read.common.block.TsBlock; @@ -42,6 +45,7 @@ protected int currentFileIndex; protected long endedFileSize = 0; protected List<Schema> schemas; + protected EncryptParameter encryptParameter; protected final long memoryBudgetForFileWriter = (long) @@ -49,12 +53,28 @@ / IoTDBDescriptor.getInstance().getConfig().getCompactionThreadCount() * IoTDBDescriptor.getInstance().getConfig().getChunkMetadataSizeProportion()); + @TestOnly protected AbstractInnerCompactionWriter(TsFileResource targetFileResource) { - this(Collections.singletonList(targetFileResource)); + this( + Collections.singletonList(targetFileResource), + EncryptDBUtils.getDefaultFirstEncryptParam()); } + protected AbstractInnerCompactionWriter( + TsFileResource targetFileResource, EncryptParameter encryptParameter) { + this(Collections.singletonList(targetFileResource), encryptParameter); + } + + @Deprecated protected AbstractInnerCompactionWriter(List<TsFileResource> targetFileResources) { this.targetResources = targetFileResources; + this.encryptParameter = EncryptDBUtils.getDefaultFirstEncryptParam(); + } + + protected AbstractInnerCompactionWriter( + List<TsFileResource> targetFileResources, EncryptParameter encryptParameter) { + this.targetResources = targetFileResources; + this.encryptParameter = encryptParameter; } @Override @@ -99,7 +119,8 @@ memoryBudgetForFileWriter, targetResources.get(currentFileIndex).isSeq() ? CompactionType.INNER_SEQ_COMPACTION - : CompactionType.INNER_UNSEQ_COMPACTION); + : CompactionType.INNER_UNSEQ_COMPACTION, + encryptParameter); fileWriter.setSchema(CompactionTableSchemaCollector.copySchema(schemas.get(0))); } @@ -161,4 +182,9 @@ public long getWriterSize() throws IOException { return endedFileSize + (fileWriter == null ? 0 : fileWriter.getPos()); } + + @Override + public EncryptParameter getEncryptParameter() { + return encryptParameter; + } }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/FastCrossCompactionWriter.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/FastCrossCompactionWriter.java index 69a1691..59a87b4 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/FastCrossCompactionWriter.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/FastCrossCompactionWriter.java
@@ -19,11 +19,14 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.fast.element.AlignedPageElement; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.fast.element.ChunkMetadataElement; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer.flushcontroller.AbstractCompactionFlushController; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; +import org.apache.iotdb.db.utils.EncryptDBUtils; +import org.apache.tsfile.encrypt.EncryptParameter; import org.apache.tsfile.exception.write.PageException; import org.apache.tsfile.file.header.PageHeader; import org.apache.tsfile.file.metadata.AbstractAlignedChunkMetadata; @@ -44,12 +47,23 @@ // Only used for fast compaction performer protected Map<TsFileResource, TsFileSequenceReader> readerMap; + @TestOnly public FastCrossCompactionWriter( List<TsFileResource> targetResources, List<TsFileResource> seqSourceResources, Map<TsFileResource, TsFileSequenceReader> readerMap) throws IOException { - super(targetResources, seqSourceResources); + super(targetResources, seqSourceResources, EncryptDBUtils.getDefaultFirstEncryptParam()); + this.readerMap = readerMap; + } + + public FastCrossCompactionWriter( + List<TsFileResource> targetResources, + List<TsFileResource> seqSourceResources, + Map<TsFileResource, TsFileSequenceReader> readerMap, + EncryptParameter encryptParameter) + throws IOException { + super(targetResources, seqSourceResources, encryptParameter); this.readerMap = readerMap; }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/FastInnerCompactionWriter.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/FastInnerCompactionWriter.java index 18ca215..922c3a7 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/FastInnerCompactionWriter.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/FastInnerCompactionWriter.java
@@ -19,11 +19,14 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.fast.element.AlignedPageElement; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.fast.element.ChunkMetadataElement; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer.flushcontroller.AbstractCompactionFlushController; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; +import org.apache.iotdb.db.utils.EncryptDBUtils; +import org.apache.tsfile.encrypt.EncryptParameter; import org.apache.tsfile.exception.write.PageException; import org.apache.tsfile.file.header.PageHeader; import org.apache.tsfile.file.metadata.AbstractAlignedChunkMetadata; @@ -40,12 +43,25 @@ public class FastInnerCompactionWriter extends AbstractInnerCompactionWriter { + @TestOnly public FastInnerCompactionWriter(TsFileResource targetFileResource) throws IOException { - super(targetFileResource); + super(targetFileResource, EncryptDBUtils.getDefaultFirstEncryptParam()); } + public FastInnerCompactionWriter( + TsFileResource targetFileResource, EncryptParameter encryptParameter) throws IOException { + super(targetFileResource, encryptParameter); + } + + @TestOnly public FastInnerCompactionWriter(List<TsFileResource> targetFileResources) throws IOException { - super(targetFileResources); + super(targetFileResources, EncryptDBUtils.getDefaultFirstEncryptParam()); + } + + public FastInnerCompactionWriter( + List<TsFileResource> targetFileResources, EncryptParameter encryptParameter) + throws IOException { + super(targetFileResources, encryptParameter); } @Override
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/ReadPointCrossCompactionWriter.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/ReadPointCrossCompactionWriter.java index ce596e6..6810df4 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/ReadPointCrossCompactionWriter.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/ReadPointCrossCompactionWriter.java
@@ -19,13 +19,16 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.fast.element.AlignedPageElement; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.fast.element.ChunkMetadataElement; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer.flushcontroller.AbstractCompactionFlushController; import org.apache.iotdb.db.storageengine.dataregion.read.control.FileReaderManager; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; +import org.apache.iotdb.db.utils.EncryptDBUtils; import org.apache.tsfile.block.column.Column; +import org.apache.tsfile.encrypt.EncryptParameter; import org.apache.tsfile.file.header.PageHeader; import org.apache.tsfile.file.metadata.ChunkMetadata; import org.apache.tsfile.read.TsFileSequenceReader; @@ -40,10 +43,19 @@ public class ReadPointCrossCompactionWriter extends AbstractCrossCompactionWriter { + @TestOnly public ReadPointCrossCompactionWriter( List<TsFileResource> targetResources, List<TsFileResource> seqFileResources) throws IOException { - super(targetResources, seqFileResources); + super(targetResources, seqFileResources, EncryptDBUtils.getDefaultFirstEncryptParam()); + } + + public ReadPointCrossCompactionWriter( + List<TsFileResource> targetResources, + List<TsFileResource> seqFileResources, + EncryptParameter encryptParameter) + throws IOException { + super(targetResources, seqFileResources, encryptParameter); } @Override
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/ReadPointInnerCompactionWriter.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/ReadPointInnerCompactionWriter.java index bff091c..806e708 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/ReadPointInnerCompactionWriter.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/ReadPointInnerCompactionWriter.java
@@ -19,12 +19,15 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.fast.element.AlignedPageElement; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.fast.element.ChunkMetadataElement; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer.flushcontroller.AbstractCompactionFlushController; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; +import org.apache.iotdb.db.utils.EncryptDBUtils; import org.apache.tsfile.block.column.Column; +import org.apache.tsfile.encrypt.EncryptParameter; import org.apache.tsfile.exception.write.PageException; import org.apache.tsfile.file.header.PageHeader; import org.apache.tsfile.file.metadata.ChunkMetadata; @@ -38,13 +41,26 @@ import java.util.List; public class ReadPointInnerCompactionWriter extends AbstractInnerCompactionWriter { + @TestOnly public ReadPointInnerCompactionWriter(TsFileResource targetFileResource) throws IOException { - super(targetFileResource); + super(targetFileResource, EncryptDBUtils.getDefaultFirstEncryptParam()); } + public ReadPointInnerCompactionWriter( + TsFileResource targetFileResource, EncryptParameter encryptParameter) throws IOException { + super(targetFileResource, encryptParameter); + } + + @TestOnly public ReadPointInnerCompactionWriter(List<TsFileResource> targetFileResources) throws IOException { - super(targetFileResources); + super(targetFileResources, EncryptDBUtils.getDefaultFirstEncryptParam()); + } + + public ReadPointInnerCompactionWriter( + List<TsFileResource> targetFileResources, EncryptParameter encryptParameter) + throws IOException { + super(targetFileResources, encryptParameter); } @Override
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/RepairUnsortedFileCompactionWriter.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/RepairUnsortedFileCompactionWriter.java index 5d46eb5..15d59be 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/RepairUnsortedFileCompactionWriter.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/RepairUnsortedFileCompactionWriter.java
@@ -19,8 +19,11 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; +import org.apache.iotdb.db.utils.EncryptDBUtils; +import org.apache.tsfile.encrypt.EncryptParameter; import org.apache.tsfile.read.TimeValuePair; import org.apache.tsfile.read.common.block.TsBlock; import org.apache.tsfile.read.reader.IPointReader; @@ -36,8 +39,15 @@ public class RepairUnsortedFileCompactionWriter extends ReadPointInnerCompactionWriter { private List<TimeValuePair>[] dataOfCurrentSeriesArr; + @TestOnly public RepairUnsortedFileCompactionWriter(TsFileResource targetFileResource) throws IOException { - super(targetFileResource); + super(targetFileResource, EncryptDBUtils.getDefaultFirstEncryptParam()); + dataOfCurrentSeriesArr = new ArrayList[subTaskNum]; + } + + public RepairUnsortedFileCompactionWriter( + TsFileResource targetFileResource, EncryptParameter encryptParameter) throws IOException { + super(targetFileResource, encryptParameter); dataOfCurrentSeriesArr = new ArrayList[subTaskNum]; }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileReader.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileReader.java index 7aabb08..142d1734 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileReader.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileReader.java
@@ -19,8 +19,10 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.io; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.constant.CompactionType; +import org.apache.tsfile.encrypt.EncryptParameter; import org.apache.tsfile.file.IMetadataIndexEntry; import org.apache.tsfile.file.header.ChunkHeader; import org.apache.tsfile.file.metadata.MetadataIndexNode; @@ -42,16 +44,27 @@ * data read and distinguishing between aligned and not aligned series during compaction. */ public class CompactionTsFileReader extends TsFileSequenceReader { + @TestOnly + public CompactionTsFileReader(String file, CompactionType compactionType) throws IOException { + super(file, new EncryptParameter(config.getEncryptType(), config.getEncryptKey())); + CompactionTsFileInput compactionTsFileInput = + new CompactionTsFileInput(compactionType, tsFileInput); + this.tsFileInput = compactionTsFileInput; + compactionTsFileInput.setMetadataOffset(readFileMetadata().getMetaOffset()); + } /** * Constructs a new instance of CompactionTsFileReader. * * @param file The file to be read. * @param compactionType The type of compaction running. + * @param encryptParameter The first encryption parameters for the file. * @throws IOException If an error occurs during file operations. */ - public CompactionTsFileReader(String file, CompactionType compactionType) throws IOException { - super(file); + public CompactionTsFileReader( + String file, CompactionType compactionType, EncryptParameter encryptParameter) + throws IOException { + super(file, encryptParameter); CompactionTsFileInput compactionTsFileInput = new CompactionTsFileInput(compactionType, tsFileInput); this.tsFileInput = compactionTsFileInput;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileWriter.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileWriter.java index 4f0ae73..1f822e3 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileWriter.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileWriter.java
@@ -19,11 +19,14 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.io; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.service.metrics.CompactionMetrics; import org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.CompactionTaskManager; import org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.constant.CompactionIoDataType; import org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.constant.CompactionType; +import org.apache.iotdb.db.utils.EncryptDBUtils; +import org.apache.tsfile.encrypt.EncryptParameter; import org.apache.tsfile.enums.ColumnCategory; import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.file.metadata.ChunkMetadata; @@ -52,15 +55,29 @@ private boolean isEmptyTargetFile = true; private IDeviceID currentDeviceId; + private EncryptParameter firstEncryptParameter; + + @TestOnly public CompactionTsFileWriter(File file, long maxMetadataSize, CompactionType type) throws IOException { - super(file, maxMetadataSize); + this(file, maxMetadataSize, type, EncryptDBUtils.getDefaultFirstEncryptParam()); + } + + public CompactionTsFileWriter( + File file, long maxMetadataSize, CompactionType type, EncryptParameter encryptParameter) + throws IOException { + super(file, maxMetadataSize, encryptParameter); + this.firstEncryptParameter = encryptParameter; this.type = type; super.out = new CompactionTsFileOutput( super.out, CompactionTaskManager.getInstance().getMergeWriteRateLimiter()); } + public EncryptParameter getEncryptParameter() { + return firstEncryptParameter; + } + public void markStartingWritingAligned() { isWritingAligned = true; }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairDataFileScanUtil.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairDataFileScanUtil.java index a4c3900..d515a7f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairDataFileScanUtil.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairDataFileScanUtil.java
@@ -29,6 +29,7 @@ import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResourceStatus; import org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ArrayDeviceTimeIndex; import org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ITimeIndex; +import org.apache.iotdb.db.utils.EncryptDBUtils; import org.apache.tsfile.common.conf.TSFileDescriptor; import org.apache.tsfile.common.constant.TsFileConstant; @@ -110,7 +111,8 @@ tsfile.getPath(), resource.isSeq() ? CompactionType.INNER_SEQ_COMPACTION - : CompactionType.INNER_UNSEQ_COMPACTION)) { + : CompactionType.INNER_UNSEQ_COMPACTION, + EncryptDBUtils.getFirstEncryptParamFromTSFilePath(tsfile.getAbsolutePath()))) { TsFileDeviceIterator deviceInFileIterator = reader.getAllDevicesIteratorWithIsAligned(); Set<IDeviceID> deviceIdsInTimeIndex = checkTsFileResource ? new HashSet<>(timeIndex.getDevices()) : Collections.emptySet();
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduleContext.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduleContext.java index 1f01cac..2bfc515 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduleContext.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduleContext.java
@@ -19,6 +19,7 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.schedule; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.service.metrics.CompactionMetrics; import org.apache.iotdb.db.storageengine.dataregion.compaction.constant.CompactionTaskType; @@ -29,6 +30,9 @@ import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.SettleCompactionTask; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; import org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ArrayDeviceTimeIndex; +import org.apache.iotdb.db.utils.EncryptDBUtils; + +import org.apache.tsfile.encrypt.EncryptParameter; import java.util.HashMap; import java.util.HashSet; @@ -53,9 +57,19 @@ private final Set<Long> timePartitionsDelayInsertionSelection; + private EncryptParameter encryptParameter; + + @TestOnly public CompactionScheduleContext() { this.partitionFileDeviceInfoCache = new HashMap<>(); this.timePartitionsDelayInsertionSelection = new HashSet<>(); + this.encryptParameter = EncryptDBUtils.getDefaultFirstEncryptParam(); + } + + public CompactionScheduleContext(EncryptParameter encryptParameter) { + this.partitionFileDeviceInfoCache = new HashMap<>(); + this.timePartitionsDelayInsertionSelection = new HashSet<>(); + this.encryptParameter = encryptParameter; } public void delayInsertionSelection(long timePartitionId) { @@ -177,7 +191,7 @@ return IoTDBDescriptor.getInstance() .getConfig() .getInnerSeqCompactionPerformer() - .createInstance(); + .createInstance(encryptParameter); } public IUnseqCompactionPerformer getUnseqCompactionPerformer() { @@ -185,11 +199,14 @@ IoTDBDescriptor.getInstance() .getConfig() .getInnerUnseqCompactionPerformer() - .createInstance(); + .createInstance(encryptParameter); return unseqCompactionPerformer; } public ICrossCompactionPerformer getCrossCompactionPerformer() { - return IoTDBDescriptor.getInstance().getConfig().getCrossCompactionPerformer().createInstance(); + return IoTDBDescriptor.getInstance() + .getConfig() + .getCrossCompactionPerformer() + .createInstance(encryptParameter); } }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduler.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduler.java index 96a6d09..cafb3bb 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduler.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduler.java
@@ -37,6 +37,7 @@ import org.apache.iotdb.db.storageengine.dataregion.compaction.selector.utils.InsertionCrossCompactionTaskResource; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileManager; import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo; +import org.apache.iotdb.db.utils.EncryptDBUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -124,7 +125,11 @@ @TestOnly public static void scheduleCompaction(TsFileManager tsFileManager, long timePartition) throws InterruptedException { - scheduleCompaction(tsFileManager, timePartition, new CompactionScheduleContext()); + scheduleCompaction( + tsFileManager, + timePartition, + new CompactionScheduleContext( + EncryptDBUtils.getFirstEncryptParamFromDatabase(tsFileManager.getStorageGroupName()))); } public static int tryToSubmitInnerSpaceCompactionTask(
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/AbstractCrossSpaceEstimator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/AbstractCrossSpaceEstimator.java index 76d52c6..8158d54 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/AbstractCrossSpaceEstimator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/AbstractCrossSpaceEstimator.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.CompactionScheduleContext; import org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.constant.CompactionType; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; +import org.apache.iotdb.db.utils.EncryptDBUtils; import org.apache.tsfile.read.TsFileSequenceReader; @@ -38,7 +39,10 @@ @Override protected TsFileSequenceReader getReader(String filePath) throws IOException { - return new CompactionTsFileReader(filePath, CompactionType.CROSS_COMPACTION); + return new CompactionTsFileReader( + filePath, + CompactionType.CROSS_COMPACTION, + EncryptDBUtils.getFirstEncryptParamFromTSFilePath(filePath)); } public long estimateCrossCompactionMemory(
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/AbstractInnerSpaceEstimator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/AbstractInnerSpaceEstimator.java index 40912af..0ddf498 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/AbstractInnerSpaceEstimator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/AbstractInnerSpaceEstimator.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.CompactionScheduleContext; import org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.constant.CompactionType; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; +import org.apache.iotdb.db.utils.EncryptDBUtils; import org.apache.tsfile.read.TsFileSequenceReader; @@ -39,9 +40,15 @@ @Override protected TsFileSequenceReader getReader(String filePath) throws IOException { if (filePath.contains(IoTDBConstant.UNSEQUENCE_FOLDER_NAME)) { - return new CompactionTsFileReader(filePath, CompactionType.INNER_UNSEQ_COMPACTION); + return new CompactionTsFileReader( + filePath, + CompactionType.INNER_UNSEQ_COMPACTION, + EncryptDBUtils.getFirstEncryptParamFromTSFilePath(filePath)); } else { - return new CompactionTsFileReader(filePath, CompactionType.INNER_SEQ_COMPACTION); + return new CompactionTsFileReader( + filePath, + CompactionType.INNER_SEQ_COMPACTION, + EncryptDBUtils.getFirstEncryptParamFromTSFilePath(filePath)); } }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/CompactionEstimateUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/CompactionEstimateUtils.java index e706a4e..d4be316 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/CompactionEstimateUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/CompactionEstimateUtils.java
@@ -26,6 +26,7 @@ import org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.constant.CompactionType; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo; +import org.apache.iotdb.db.utils.EncryptDBUtils; import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.file.metadata.ChunkMetadata; @@ -169,7 +170,10 @@ for (TsFileResource resource : resources) { cost += resource.getTotalModSizeInByte(); try (CompactionTsFileReader reader = - new CompactionTsFileReader(resource.getTsFilePath(), taskType)) { + new CompactionTsFileReader( + resource.getTsFilePath(), + taskType, + EncryptDBUtils.getFirstEncryptParamFromTSFilePath(resource.getTsFilePath()))) { for (Map.Entry<IDeviceID, Long> entry : getDeviceMetadataSizeMapAndCollectMetadataInfo(reader, metadataInfo).entrySet()) { deviceMetadataSizeMap.merge(entry.getKey(), entry.getValue(), Long::sum);
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/utils/CrossSpaceCompactionCandidate.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/utils/CrossSpaceCompactionCandidate.java index 52b9d52..1f08cb4 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/utils/CrossSpaceCompactionCandidate.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/utils/CrossSpaceCompactionCandidate.java
@@ -51,6 +51,7 @@ init(seqFiles, unseqFiles, new CompactionScheduleContext()); } + @TestOnly public CrossSpaceCompactionCandidate( List<TsFileResource> seqFiles, List<TsFileResource> unseqFiles, long ttlLowerBound) { this(seqFiles, unseqFiles, ttlLowerBound, new CompactionScheduleContext());
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/settle/SettleRequestHandler.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/settle/SettleRequestHandler.java index 29b9bc2..470d82c 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/settle/SettleRequestHandler.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/settle/SettleRequestHandler.java
@@ -37,6 +37,7 @@ import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResourceList; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResourceStatus; import org.apache.iotdb.db.storageengine.dataregion.tsfile.generator.TsFileNameGenerator; +import org.apache.iotdb.db.utils.EncryptDBUtils; import org.apache.iotdb.rpc.RpcUtils; import org.apache.iotdb.rpc.TSStatusCode; @@ -272,8 +273,16 @@ private TSStatus submitCompactionTask(List<TsFileResource> tsFileResources) { ICompactionPerformer performer = hasSeqFiles - ? config.getInnerSeqCompactionPerformer().createInstance() - : config.getInnerUnseqCompactionPerformer().createInstance(); + ? config + .getInnerSeqCompactionPerformer() + .createInstance( + EncryptDBUtils.getFirstEncryptParamFromDatabase( + tsFileManager.getStorageGroupName())) + : config + .getInnerUnseqCompactionPerformer() + .createInstance( + EncryptDBUtils.getFirstEncryptParamFromDatabase( + tsFileManager.getStorageGroupName())); AbstractCompactionTask task = new InnerSpaceCompactionTask( targetConsistentSettleInfo.timePartitionId,
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tool/TsFileStatisticReader.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tool/TsFileStatisticReader.java index fccfb31..d932d6c 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tool/TsFileStatisticReader.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tool/TsFileStatisticReader.java
@@ -19,6 +19,8 @@ package org.apache.iotdb.db.storageengine.dataregion.compaction.tool; +import org.apache.iotdb.db.utils.EncryptDBUtils; + import org.apache.tsfile.file.metadata.ChunkMetadata; import org.apache.tsfile.file.metadata.IDeviceID; import org.apache.tsfile.read.TsFileDeviceIterator; @@ -37,7 +39,9 @@ private final TsFileSequenceReader reader; public TsFileStatisticReader(String filePath) throws IOException { - reader = new TsFileSequenceReader(filePath); + reader = + new TsFileSequenceReader( + filePath, EncryptDBUtils.getFirstEncryptParamFromTSFilePath(filePath)); } public List<ChunkGroupStatistics> getChunkGroupStatisticsList() throws IOException {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractMemTable.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractMemTable.java index f2f4d5e..9280398 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractMemTable.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractMemTable.java
@@ -42,6 +42,7 @@ import org.apache.iotdb.db.storageengine.dataregion.read.filescan.impl.MemChunkHandleImpl; import org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView; import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALWriteUtils; +import org.apache.iotdb.db.utils.EncryptDBUtils; import org.apache.iotdb.db.utils.MemUtils; import org.apache.iotdb.db.utils.ModificationUtils; @@ -156,7 +157,11 @@ private IWritableMemChunkGroup createMemChunkGroupIfNotExistAndGet( IDeviceID deviceId, List<IMeasurementSchema> schemaList) { IWritableMemChunkGroup memChunkGroup = - memTableMap.computeIfAbsent(deviceId, k -> new WritableMemChunkGroup()); + memTableMap.computeIfAbsent( + deviceId, + k -> + new WritableMemChunkGroup( + EncryptDBUtils.getSecondEncryptParamFromDatabase(database))); for (IMeasurementSchema schema : schemaList) { if (schema != null && !memChunkGroup.contains(schema.getMeasurementName())) { seriesNumber++; @@ -1050,5 +1055,8 @@ public void setDatabaseAndDataRegionId(String database, String dataRegionId) { this.database = database; this.dataRegionId = dataRegionId; + for (IWritableMemChunkGroup memChunkGroup : memTableMap.values()) { + memChunkGroup.setEncryptParameter(EncryptDBUtils.getSecondEncryptParamFromDatabase(database)); + } } }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractWritableMemChunk.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractWritableMemChunk.java index 268a921..d1dd692 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractWritableMemChunk.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractWritableMemChunk.java
@@ -28,6 +28,7 @@ import org.apache.iotdb.db.utils.datastructure.BatchEncodeInfo; import org.apache.iotdb.db.utils.datastructure.TVList; +import org.apache.tsfile.encrypt.EncryptParameter; import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.utils.Binary; import org.apache.tsfile.utils.BitMap; @@ -227,4 +228,7 @@ @Override public abstract int serializedSize(); + + @Override + public abstract void setEncryptParameter(EncryptParameter encryptParameter); }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunk.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunk.java index d41ef85..f81238b 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunk.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunk.java
@@ -30,6 +30,8 @@ import org.apache.iotdb.db.utils.datastructure.MemPointIteratorFactory; import org.apache.iotdb.db.utils.datastructure.TVList; +import org.apache.tsfile.encrypt.EncryptParameter; +import org.apache.tsfile.encrypt.EncryptUtils; import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.read.common.TimeRange; import org.apache.tsfile.utils.Binary; @@ -71,7 +73,16 @@ private static final String UNSUPPORTED_TYPE = "Unsupported data type:"; + private EncryptParameter encryptParameter; + public AlignedWritableMemChunk(List<IMeasurementSchema> schemaList, boolean isTableModel) { + this(schemaList, isTableModel, EncryptUtils.getEncryptParameter()); + } + + public AlignedWritableMemChunk( + List<IMeasurementSchema> schemaList, + boolean isTableModel, + EncryptParameter encryptParameter) { this.measurementIndexMap = new LinkedHashMap<>(); this.dataTypes = new ArrayList<>(); this.schemaList = schemaList; @@ -82,10 +93,19 @@ this.list = AlignedTVList.newAlignedList(dataTypes); this.sortedList = new ArrayList<>(); this.ignoreAllNullRows = !isTableModel; + this.encryptParameter = encryptParameter; } private AlignedWritableMemChunk( List<IMeasurementSchema> schemaList, AlignedTVList list, boolean isTableModel) { + this(schemaList, list, isTableModel, EncryptUtils.getEncryptParameter()); + } + + private AlignedWritableMemChunk( + List<IMeasurementSchema> schemaList, + AlignedTVList list, + boolean isTableModel, + EncryptParameter encryptParameter) { this.measurementIndexMap = new LinkedHashMap<>(); this.schemaList = schemaList; for (int i = 0; i < schemaList.size(); i++) { @@ -95,6 +115,7 @@ this.dataTypes = list.getTsDataTypes(); this.sortedList = new ArrayList<>(); this.ignoreAllNullRows = !isTableModel; + this.encryptParameter = encryptParameter; } public Set<String> getAllMeasurements() { @@ -430,7 +451,7 @@ @Override public IChunkWriter createIChunkWriter() { - return new AlignedChunkWriterImpl(schemaList); + return new AlignedChunkWriterImpl(schemaList, encryptParameter); } @SuppressWarnings({"squid:S6541", "squid:S3776"}) @@ -508,7 +529,8 @@ List<TSDataType> dataTypes = list.getTsDataTypes(); Pair<Long, Integer>[] lastValidPointIndexForTimeDupCheck = new Pair[dataTypes.size()]; for (List<Integer> pageRange : chunkRange) { - AlignedChunkWriterImpl alignedChunkWriter = new AlignedChunkWriterImpl(schemaList); + AlignedChunkWriterImpl alignedChunkWriter = + new AlignedChunkWriterImpl(schemaList, encryptParameter); for (int pageNum = 0; pageNum < pageRange.size() / 2; pageNum += 1) { for (int columnIndex = 0; columnIndex < dataTypes.size(); columnIndex++) { // Pair of Time and Index @@ -645,7 +667,8 @@ return; } - AlignedChunkWriterImpl alignedChunkWriter = new AlignedChunkWriterImpl(schemaList); + AlignedChunkWriterImpl alignedChunkWriter = + new AlignedChunkWriterImpl(schemaList, encryptParameter); // create MergeSortAlignedTVListIterator. List<AlignedTVList> alignedTvLists = new ArrayList<>(sortedList); @@ -674,7 +697,7 @@ } catch (InterruptedException e) { Thread.currentThread().interrupt(); } - alignedChunkWriter = new AlignedChunkWriterImpl(schemaList); + alignedChunkWriter = new AlignedChunkWriterImpl(schemaList, encryptParameter); encodeInfo.reset(); } } @@ -860,4 +883,9 @@ } return avgPointSizeOfLargestColumn; } + + @Override + public void setEncryptParameter(EncryptParameter encryptParameter) { + this.encryptParameter = encryptParameter; + } }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunkGroup.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunkGroup.java index 36acded..ec73e7d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunkGroup.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunkGroup.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.db.storageengine.dataregion.modification.ModEntry; import org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView; +import org.apache.tsfile.encrypt.EncryptParameter; import org.apache.tsfile.utils.BitMap; import org.apache.tsfile.utils.Pair; import org.apache.tsfile.write.schema.IMeasurementSchema; @@ -41,6 +42,8 @@ private AlignedWritableMemChunk memChunk; + private EncryptParameter encryptParameter; + public AlignedWritableMemChunkGroup(List<IMeasurementSchema> schemaList, boolean isTableModel) { memChunk = new AlignedWritableMemChunk(schemaList, isTableModel); } @@ -161,6 +164,12 @@ memChunk.serializeToWAL(buffer); } + @Override + public void setEncryptParameter(EncryptParameter encryptParameter) { + this.encryptParameter = encryptParameter; + memChunk.setEncryptParameter(encryptParameter); + } + protected static AlignedWritableMemChunkGroup deserialize( DataInputStream stream, boolean isTableModel) throws IOException { AlignedWritableMemChunkGroup memChunkGroup = new AlignedWritableMemChunkGroup();
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/IWritableMemChunk.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/IWritableMemChunk.java index 13f09a0..635e06d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/IWritableMemChunk.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/IWritableMemChunk.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.db.utils.datastructure.BatchEncodeInfo; import org.apache.iotdb.db.utils.datastructure.TVList; +import org.apache.tsfile.encrypt.EncryptParameter; import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.utils.Binary; import org.apache.tsfile.utils.BitMap; @@ -127,4 +128,6 @@ TVList getWorkingTVList(); void setWorkingTVList(TVList list); + + void setEncryptParameter(EncryptParameter encryptParameter); }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/IWritableMemChunkGroup.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/IWritableMemChunkGroup.java index 62bf770..9e61d7a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/IWritableMemChunkGroup.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/IWritableMemChunkGroup.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.db.storageengine.dataregion.modification.ModEntry; import org.apache.iotdb.db.storageengine.dataregion.wal.buffer.WALEntryValue; +import org.apache.tsfile.encrypt.EncryptParameter; import org.apache.tsfile.utils.BitMap; import org.apache.tsfile.write.schema.IMeasurementSchema; @@ -59,4 +60,6 @@ IWritableMemChunk getWritableMemChunk(String measurement); long getMaxTime(); + + void setEncryptParameter(EncryptParameter encryptParameter); }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/TsFileProcessor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/TsFileProcessor.java index 6909b39..62756f4 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/TsFileProcessor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/TsFileProcessor.java
@@ -73,6 +73,7 @@ import org.apache.iotdb.db.storageengine.rescon.memory.MemTableManager; import org.apache.iotdb.db.storageengine.rescon.memory.PrimitiveArrayManager; import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo; +import org.apache.iotdb.db.utils.EncryptDBUtils; import org.apache.iotdb.db.utils.MemUtils; import org.apache.iotdb.db.utils.ModificationUtils; import org.apache.iotdb.db.utils.datastructure.AlignedTVList; @@ -224,7 +225,11 @@ this.sequence = sequence; this.tsFileResource = new TsFileResource(tsfile, this); this.dataRegionInfo = dataRegionInfo; - this.writer = new RestorableTsFileIOWriter(tsfile); + this.writer = + new RestorableTsFileIOWriter( + tsfile, + EncryptDBUtils.getFirstEncryptParamFromDatabase( + dataRegionInfo.getDataRegion().getDatabaseName())); this.updateLatestFlushTimeCallback = updateLatestFlushTimeCallback; this.walNode = WALManager.getInstance()
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunk.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunk.java index 1f4078d..ebf2315 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunk.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunk.java
@@ -20,6 +20,7 @@ package org.apache.iotdb.db.storageengine.dataregion.memtable; import org.apache.iotdb.common.rpc.thrift.TSStatus; +import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.conf.IoTDBConfig; import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView; @@ -29,6 +30,8 @@ import org.apache.iotdb.db.utils.datastructure.MemPointIteratorFactory; import org.apache.iotdb.db.utils.datastructure.TVList; +import org.apache.tsfile.encrypt.EncryptParameter; +import org.apache.tsfile.encrypt.EncryptUtils; import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.read.TimeValuePair; import org.apache.tsfile.read.common.TimeRange; @@ -65,13 +68,26 @@ private static final IoTDBConfig CONFIG = IoTDBDescriptor.getInstance().getConfig(); private final int TVLIST_SORT_THRESHOLD = CONFIG.getTvListSortThreshold(); + private EncryptParameter encryptParameter; + + @TestOnly public WritableMemChunk(IMeasurementSchema schema) { this.schema = schema; this.list = TVList.newList(schema.getType()); this.sortedList = new ArrayList<>(); + this.encryptParameter = EncryptUtils.getEncryptParameter(); } - private WritableMemChunk() {} + public WritableMemChunk(IMeasurementSchema schema, EncryptParameter encryptParameter) { + this.schema = schema; + this.list = TVList.newList(schema.getType()); + this.sortedList = new ArrayList<>(); + this.encryptParameter = encryptParameter; + } + + private WritableMemChunk() { + this.encryptParameter = EncryptUtils.getEncryptParameter(); + } protected void handoverTvList() { if (!list.isSorted()) { @@ -330,7 +346,7 @@ @Override public ChunkWriterImpl createIChunkWriter() { - return new ChunkWriterImpl(schema); + return new ChunkWriterImpl(schema, encryptParameter); } @Override @@ -594,4 +610,9 @@ Arrays.sort(filteredTimestamps); return filteredTimestamps; } + + @Override + public void setEncryptParameter(EncryptParameter encryptParameter) { + this.encryptParameter = encryptParameter; + } }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkGroup.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkGroup.java index 56f69a4..07c7603 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkGroup.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkGroup.java
@@ -24,6 +24,8 @@ import org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView; import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALWriteUtils; +import org.apache.tsfile.encrypt.EncryptParameter; +import org.apache.tsfile.encrypt.EncryptUtils; import org.apache.tsfile.utils.BitMap; import org.apache.tsfile.utils.ReadWriteIOUtils; import org.apache.tsfile.write.schema.IMeasurementSchema; @@ -39,9 +41,16 @@ public class WritableMemChunkGroup implements IWritableMemChunkGroup { private Map<String, IWritableMemChunk> memChunkMap; + private EncryptParameter encryptParameter; public WritableMemChunkGroup() { memChunkMap = new HashMap<>(); + encryptParameter = EncryptUtils.getEncryptParameter(); + } + + public WritableMemChunkGroup(EncryptParameter encryptParameter) { + memChunkMap = new HashMap<>(); + this.encryptParameter = encryptParameter; } @Override @@ -70,7 +79,7 @@ private IWritableMemChunk createMemChunkIfNotExistAndGet(IMeasurementSchema schema) { return memChunkMap.computeIfAbsent( - schema.getMeasurementName(), k -> new WritableMemChunk(schema)); + schema.getMeasurementName(), k -> new WritableMemChunk(schema, encryptParameter)); } @Override @@ -183,6 +192,14 @@ } } + @Override + public void setEncryptParameter(EncryptParameter encryptParameter) { + this.encryptParameter = encryptParameter; + for (IWritableMemChunk memChunk : memChunkMap.values()) { + memChunk.setEncryptParameter(encryptParameter); + } + } + public static WritableMemChunkGroup deserialize(DataInputStream stream) throws IOException { WritableMemChunkGroup memChunkGroup = new WritableMemChunkGroup(); int memChunkMapSize = stream.readInt();
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/control/FileReaderManager.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/control/FileReaderManager.java index 738f003..6df6866 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/control/FileReaderManager.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/control/FileReaderManager.java
@@ -22,6 +22,7 @@ import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileID; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; +import org.apache.iotdb.db.utils.EncryptDBUtils; import org.apache.tsfile.read.TsFileSequenceReader; import org.apache.tsfile.read.UnClosedTsFileReader; @@ -148,10 +149,18 @@ TsFileSequenceReader tsFileReader = null; // check if the file is old version if (!isClosed) { - tsFileReader = new UnClosedTsFileReader(filePath, ioSizeRecorder); + tsFileReader = + new UnClosedTsFileReader( + filePath, + EncryptDBUtils.getFirstEncryptParamFromTSFilePath(filePath), + ioSizeRecorder); } else { // already do the version check in TsFileSequenceReader's constructor - tsFileReader = new TsFileSequenceReader(filePath, ioSizeRecorder); + tsFileReader = + new TsFileSequenceReader( + filePath, + ioSizeRecorder, + EncryptDBUtils.getFirstEncryptParamFromTSFilePath(filePath)); } readerMap.put(tsFileID, tsFileReader); return tsFileReader;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java index 3586afa..7ee43a9 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java
@@ -211,6 +211,9 @@ } @Override + public void setModified(boolean modified) {} + + @Override public void initTsBlockBuilder(List<TSDataType> dataTypes) { builder = new TsBlockBuilder(dataTypes); }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemPageReader.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemPageReader.java index 90231d1..a868024 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemPageReader.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemPageReader.java
@@ -226,6 +226,9 @@ } @Override + public void setModified(boolean modified) {} + + @Override public void initTsBlockBuilder(List<TSDataType> dataTypes) { // non-aligned page reader don't need to init TsBlockBuilder at the very beginning }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/TsFileResourceUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/TsFileResourceUtils.java index 875aaae..ed1dba0 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/TsFileResourceUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/TsFileResourceUtils.java
@@ -26,6 +26,7 @@ import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResourceStatus; import org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ArrayDeviceTimeIndex; import org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ITimeIndex; +import org.apache.iotdb.db.utils.EncryptDBUtils; import org.apache.tsfile.common.conf.TSFileConfig; import org.apache.tsfile.common.conf.TSFileDescriptor; @@ -130,7 +131,10 @@ } public static boolean validateTsFileDataCorrectness(TsFileResource resource) { - try (TsFileSequenceReader reader = new TsFileSequenceReader(resource.getTsFilePath())) { + try (TsFileSequenceReader reader = + new TsFileSequenceReader( + resource.getTsFilePath(), + EncryptDBUtils.getFirstEncryptParamFromTSFilePath(resource.getTsFilePath()))) { if (!reader.isComplete()) { logger.error("{} {} illegal tsfile", resource.getTsFilePath(), VALIDATE_FAILED); return false;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/recover/file/AbstractTsFileRecoverPerformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/recover/file/AbstractTsFileRecoverPerformer.java index 73621a5..aec0151 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/recover/file/AbstractTsFileRecoverPerformer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/recover/file/AbstractTsFileRecoverPerformer.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.db.pipe.agent.PipeDataNodeAgent; import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; import org.apache.iotdb.db.storageengine.dataregion.utils.TsFileResourceUtils; +import org.apache.iotdb.db.utils.EncryptDBUtils; import org.apache.commons.io.FileUtils; import org.apache.tsfile.common.conf.TSFileConfig; @@ -79,11 +80,15 @@ return; } - writer = new RestorableTsFileIOWriter(tsFile); + writer = + new RestorableTsFileIOWriter( + tsFile, EncryptDBUtils.getFirstEncryptParamFromTSFilePath(tsFile.getAbsolutePath())); if (writer.hasCrashed()) { byte versionNumber; try (TsFileSequenceReader sequenceReader = - new TsFileSequenceReader(tsFile.getAbsolutePath())) { + new TsFileSequenceReader( + tsFile.getAbsolutePath(), + EncryptDBUtils.getFirstEncryptParamFromTSFilePath(tsFile.getAbsolutePath()))) { versionNumber = sequenceReader.readVersionNumber(); } catch (NotCompatibleTsFileException e) { versionNumber = -1; @@ -93,7 +98,10 @@ // cannot rewrite a file with V3 header, delete it first writer.close(); tsFile.delete(); - writer = new RestorableTsFileIOWriter(tsFile); + writer = + new RestorableTsFileIOWriter( + tsFile, + EncryptDBUtils.getFirstEncryptParamFromTSFilePath(tsFile.getAbsolutePath())); } } else { reconstructResourceFile(); @@ -114,7 +122,10 @@ protected void reconstructResourceFile() throws IOException { try (TsFileSequenceReader reader = - new TsFileSequenceReader(tsFileResource.getTsFile().getAbsolutePath())) { + new TsFileSequenceReader( + tsFileResource.getTsFile().getAbsolutePath(), + EncryptDBUtils.getFirstEncryptParamFromTSFilePath( + tsFileResource.getTsFile().getAbsolutePath()))) { TsFileResourceUtils.updateTsFileResource(reader, tsFileResource); }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/tools/utils/TsFileSequenceScan.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/tools/utils/TsFileSequenceScan.java index eddb7a0..a260a6e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/tools/utils/TsFileSequenceScan.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/tools/utils/TsFileSequenceScan.java
@@ -18,6 +18,8 @@ */ package org.apache.iotdb.db.tools.utils; +import org.apache.iotdb.db.utils.EncryptDBUtils; + import org.apache.tsfile.common.conf.TSFileConfig; import org.apache.tsfile.file.MetaMarker; import org.apache.tsfile.file.header.ChunkGroupHeader; @@ -118,7 +120,10 @@ @SuppressWarnings("java:S1181") public void scanTsFile(File tsFile) { - try (TsFileSequenceReader r = new TsFileSequenceReader(tsFile.getAbsolutePath())) { + try (TsFileSequenceReader r = + new TsFileSequenceReader( + tsFile.getAbsolutePath(), + EncryptDBUtils.getFirstEncryptParamFromTSFilePath(tsFile.getAbsolutePath()))) { this.reader = r; boolean shouldScan = onFileOpen(tsFile); if (!shouldScan) {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DataNodeAuthUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DataNodeAuthUtils.java index 656527a..187575c 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DataNodeAuthUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DataNodeAuthUtils.java
@@ -159,7 +159,7 @@ } public static TSStatus recordPasswordHistory( - long userId, String password, String oldPassword, long timeToRecord) { + long userId, String password, String oldEncryptedPassword, long timeToRecord) { InsertRowStatement insertRowStatement = new InsertRowStatement(); try { insertRowStatement.setDevicePath( @@ -169,7 +169,9 @@ insertRowStatement.setValues( new Object[] { new Binary(AuthUtils.encryptPassword(password), StandardCharsets.UTF_8), - oldPassword == null ? null : new Binary(oldPassword, StandardCharsets.UTF_8) + oldEncryptedPassword == null + ? null + : new Binary(oldEncryptedPassword, StandardCharsets.UTF_8) }); insertRowStatement.setDataTypes(new TSDataType[] {TSDataType.STRING, TSDataType.STRING}); } catch (IllegalPathException ignored) {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/EncryptDBUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/EncryptDBUtils.java new file mode 100644 index 0000000..52396d1 --- /dev/null +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/EncryptDBUtils.java
@@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.iotdb.db.utils; + +import org.apache.iotdb.db.conf.IoTDBConfig; +import org.apache.iotdb.db.conf.IoTDBDescriptor; + +import org.apache.tsfile.common.conf.TSFileConfig; +import org.apache.tsfile.common.conf.TSFileDescriptor; +import org.apache.tsfile.encrypt.EncryptParameter; +import org.apache.tsfile.encrypt.EncryptUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Map; + +public class EncryptDBUtils { + + private static final IoTDBConfig conf = IoTDBDescriptor.getInstance().getConfig(); + private static final TSFileConfig tsFileConfig = TSFileDescriptor.getInstance().getConfig(); + + private static final Logger LOGGER = LoggerFactory.getLogger(EncryptDBUtils.class); + + private static volatile EncryptParameter defaultFirstEncryptParam; + + public static EncryptParameter getFirstEncryptParamFromDatabase(String database) { + if (database == null || database.isEmpty()) { + return new EncryptParameter(tsFileConfig.getEncryptType(), tsFileConfig.getEncryptKey()); + } + for (Map.Entry<String, EncryptParameter> entry : conf.getTSFileDBToEncryptMap().entrySet()) { + if (database.trim().equals(entry.getKey().trim())) { + return entry.getValue(); + } + } + return getDefaultFirstEncryptParam(); + } + + public static EncryptParameter getSecondEncryptParamFromDatabase(String database) { + return EncryptUtils.getEncryptParameter(getFirstEncryptParamFromDatabase(database)); + } + + public static EncryptParameter getFirstEncryptParamFromTSFilePath(String tsFilePath) { + if (tsFilePath == null || tsFilePath.isEmpty()) { + return new EncryptParameter(tsFileConfig.getEncryptType(), tsFileConfig.getEncryptKey()); + } + // Use system-specific file separator + String separator = java.io.File.separator; + String[] pathSegments = tsFilePath.split(separator.equals("\\") ? "\\\\" : separator); + for (int i = pathSegments.length - 1; i >= 0; i--) { + if ("sequence".equals(pathSegments[i]) || "unsequence".equals(pathSegments[i])) { + if (i + 1 < pathSegments.length) { + return getFirstEncryptParamFromDatabase(pathSegments[i + 1]); + } + } + } + return getDefaultFirstEncryptParam(); + } + + public static EncryptParameter getDefaultFirstEncryptParam() { + if (defaultFirstEncryptParam == null) { + synchronized (EncryptDBUtils.class) { + if (defaultFirstEncryptParam == null) { + defaultFirstEncryptParam = + new EncryptParameter(tsFileConfig.getEncryptType(), tsFileConfig.getEncryptKey()); + } + } + } + return defaultFirstEncryptParam; + } +}
diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/LoginLockManagerTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/LoginLockManagerTest.java index 845e1b4..535ec462 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/LoginLockManagerTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/auth/LoginLockManagerTest.java
@@ -19,13 +19,21 @@ package org.apache.iotdb.db.auth; +import org.apache.iotdb.db.auth.LoginLockManager.UserLockInfo; + import org.junit.Before; import org.junit.Test; import java.lang.reflect.Field; import java.net.InetAddress; +import java.util.ArrayList; import java.util.Deque; +import java.util.List; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicBoolean; import static org.junit.Assert.assertEquals; @@ -62,32 +70,42 @@ assertEquals(1000, getField(normal, "failedLoginAttemptsPerUser")); assertEquals(10, getField(normal, "passwordLockTimeMinutes")); - // 2. Test disabling both IP-level and user-level restrictions - LoginLockManager disableBoth = new LoginLockManager(-1, -1, 10); - assertEquals(-1, getField(disableBoth, "failedLoginAttempts")); - assertEquals(-1, getField(disableBoth, "failedLoginAttemptsPerUser")); + // 2. Test disabling both IP-level and user-level restrictions (using -1 or 0) + LoginLockManager disableBoth1 = new LoginLockManager(-1, -1, 10); + assertEquals(-1, getField(disableBoth1, "failedLoginAttempts")); + assertEquals(-1, getField(disableBoth1, "failedLoginAttemptsPerUser")); - // 3. Test enabling only user-level restriction - LoginLockManager userOnly = new LoginLockManager(-1, 5, 10); - assertEquals(-1, getField(userOnly, "failedLoginAttempts")); - assertEquals(5, getField(userOnly, "failedLoginAttemptsPerUser")); + LoginLockManager disableBoth2 = new LoginLockManager(0, 0, 10); + assertEquals(-1, getField(disableBoth2, "failedLoginAttempts")); + assertEquals(-1, getField(disableBoth2, "failedLoginAttemptsPerUser")); - // 4. Test that enabling IP-level automatically enables user-level with default value - LoginLockManager ipEnable = new LoginLockManager(3, -1, 10); - assertEquals(3, getField(ipEnable, "failedLoginAttempts")); - assertEquals(1000, getField(ipEnable, "failedLoginAttemptsPerUser")); + // 3. Test mixed scenarios (IP enabled + user disabled, and vice versa) + LoginLockManager ipEnabledUserDisabled = new LoginLockManager(3, 0, 10); + assertEquals(3, getField(ipEnabledUserDisabled, "failedLoginAttempts")); + assertEquals(-1, getField(ipEnabledUserDisabled, "failedLoginAttemptsPerUser")); - // 5. Test invalid IP attempts value falls back to default (5) - LoginLockManager invalidIp = new LoginLockManager(0, -1, 10); - assertEquals(5, getField(invalidIp, "failedLoginAttempts")); + LoginLockManager ipDisabledUserEnabled = new LoginLockManager(-1, 5, 10); + assertEquals(-1, getField(ipDisabledUserEnabled, "failedLoginAttempts")); + assertEquals(5, getField(ipDisabledUserEnabled, "failedLoginAttemptsPerUser")); - // 6. Test invalid user attempts value falls back to default (1000) - LoginLockManager invalidUser = new LoginLockManager(-1, 0, 10); - assertEquals(1000, getField(invalidUser, "failedLoginAttemptsPerUser")); + // 4. Test invalid positive values fall back to defaults + LoginLockManager invalidIp = + new LoginLockManager(-5, 1000, 10); // Negative treated as disable (-1) + assertEquals(-1, getField(invalidIp, "failedLoginAttempts")); - // 7. Test invalid lock time value falls back to default (10 minutes) - LoginLockManager invalidTime = new LoginLockManager(5, 1000, 0); - assertEquals(10, getField(invalidTime, "passwordLockTimeMinutes")); + LoginLockManager invalidUser = + new LoginLockManager(5, -2, 10); // Negative treated as disable (-1) + assertEquals(-1, getField(invalidUser, "failedLoginAttemptsPerUser")); + + // 5. Test lock time validation + LoginLockManager zeroLockTime = new LoginLockManager(5, 1000, 0); + assertEquals(10, getField(zeroLockTime, "passwordLockTimeMinutes")); + + LoginLockManager negativeLockTime = new LoginLockManager(5, 1000, -5); + assertEquals(10, getField(negativeLockTime, "passwordLockTimeMinutes")); + + LoginLockManager customLockTime = new LoginLockManager(5, 1000, 30); + assertEquals(30, getField(customLockTime, "passwordLockTimeMinutes")); } private int getField(LoginLockManager manager, String fieldName) { @@ -332,29 +350,6 @@ } // ---------------- Configuration and Invalid Input ---------------- - - @Test - public void testInvalidConfigurationDefaults() { - { - LoginLockManager invalidConfigManager = new LoginLockManager(-1, 0, -1); - for (int i = 0; i < 1000; i++) { - invalidConfigManager.recordFailure(TEST_USER_ID, TEST_IP); - } - assertTrue( - "Should use default config when invalid values provided", - invalidConfigManager.checkLock(TEST_USER_ID, TEST_IP)); - } - { - LoginLockManager invalidConfigManager = new LoginLockManager(-3, 0, -1); - for (int i = 0; i < 5; i++) { - invalidConfigManager.recordFailure(TEST_USER_ID, TEST_IP); - } - assertTrue( - "Should use default config when invalid values provided", - invalidConfigManager.checkLock(TEST_USER_ID, TEST_IP)); - } - } - @Test public void testNullIpHandling() { lockManager.recordFailure(TEST_USER_ID, null); @@ -535,4 +530,29 @@ // Final verification: no inconsistencies detected during test assertTrue("Lock state should remain valid during concurrent access", consistencyFlag.get()); } + + @Test + public void testConcurrentOperateLockInfo() throws InterruptedException, ExecutionException { + UserLockInfo userLockInfo = new UserLockInfo(); + int numThreads = 100; + final int numAttempts = 100000; + ExecutorService executor = Executors.newFixedThreadPool(numThreads); + List<Future<Void>> threads = new ArrayList<>(numThreads); + for (int i = 0; i < numThreads; i++) { + threads.add( + executor.submit( + () -> { + for (int i1 = 0; i1 < numAttempts; i1++) { + userLockInfo.addFailureTime(i1); + if (i1 > 30) { + userLockInfo.removeOldFailures(i1 - 30); + } + } + return null; + })); + } + for (Future<Void> thread : threads) { + thread.get(); + } + } }
diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/load/TimeseriesMetadataIteratorTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/load/TimeseriesMetadataIteratorTest.java new file mode 100644 index 0000000..b368f18 --- /dev/null +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/load/TimeseriesMetadataIteratorTest.java
@@ -0,0 +1,173 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.db.queryengine.plan.analyze.load; + +import org.apache.tsfile.enums.TSDataType; +import org.apache.tsfile.file.metadata.IDeviceID; +import org.apache.tsfile.file.metadata.TimeseriesMetadata; +import org.apache.tsfile.read.TsFileSequenceReader; +import org.apache.tsfile.read.TsFileSequenceReaderTimeseriesMetadataIterator; +import org.apache.tsfile.write.TsFileWriter; +import org.apache.tsfile.write.record.Tablet; +import org.apache.tsfile.write.schema.IMeasurementSchema; +import org.apache.tsfile.write.schema.MeasurementSchema; +import org.junit.Assert; +import org.junit.Test; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class TimeseriesMetadataIteratorTest { + + private static final int DEVICE_COUNT = 1000; + + private static final int COLUMN_COUNT = 3; + + private static final long FIXED_TIMESTAMP = 1L; + + @Test + public void testTimeseriesMetadataIterator() throws Exception { + String outputPath = "testTsFile.tsfile"; + File file = createTsFile(outputPath); + + IDeviceID iDeviceID = null; + Set<IDeviceID> set = new HashSet<>(); + try (TsFileSequenceReader reader = new TsFileSequenceReader(file.getAbsolutePath())) { + TsFileSequenceReaderTimeseriesMetadataIterator iterator = + new TsFileSequenceReaderTimeseriesMetadataIterator(reader, true, 2); + while (iterator.hasNext()) { + Map<IDeviceID, List<TimeseriesMetadata>> map = iterator.next(); + for (Map.Entry<IDeviceID, List<TimeseriesMetadata>> entry : map.entrySet()) { + if (iDeviceID != null) { + if (!iDeviceID.equals(entry.getKey())) { + if (set.contains(iDeviceID)) { + Assert.fail("time series metadata iterator needs to be ordered by device id"); + } + set.add(iDeviceID); + } + } + iDeviceID = entry.getKey(); + } + } + } finally { + if (file.exists()) { + file.delete(); + } + } + } + + public static File createTsFile(String outputPath) throws Exception { + File file = new File(outputPath); + if (file.exists()) { + file.delete(); + } + + try (TsFileWriter tsFileWriter = new TsFileWriter(file)) { + createSchema(tsFileWriter); + for (int deviceIndex = 0; deviceIndex < DEVICE_COUNT; deviceIndex++) { + String deviceId = "root.d." + "device" + deviceIndex; + Tablet tablet = createTablet(deviceId); + + tsFileWriter.writeAligned(tablet); + tsFileWriter.flush(); + } + } + + return file; + } + + private static void createSchema(TsFileWriter tsFileWriter) throws Exception { + List<IMeasurementSchema> schemaList = new ArrayList<>(); + for (int colIndex = 0; colIndex < COLUMN_COUNT; colIndex++) { + String measurementName = "s" + colIndex; + TSDataType dataType = getDataType(colIndex); + schemaList.add(new MeasurementSchema(measurementName, dataType)); + } + for (int deviceIndex = 0; deviceIndex < DEVICE_COUNT; deviceIndex++) { + tsFileWriter.registerAlignedTimeseries("root.d." + "device" + deviceIndex, schemaList); + } + } + + private static TSDataType getDataType(int colIndex) { + TSDataType[] types = { + TSDataType.INT32, + TSDataType.INT64, + TSDataType.FLOAT, + TSDataType.DOUBLE, + TSDataType.BOOLEAN, + TSDataType.TEXT + }; + return types[colIndex % types.length]; + } + + private static Tablet createTablet(String deviceId) { + List<IMeasurementSchema> schemaList = new ArrayList<>(); + + for (int colIndex = 0; colIndex < COLUMN_COUNT; colIndex++) { + String measurementName = "s" + colIndex; + TSDataType dataType = getDataType(colIndex); + + schemaList.add(new MeasurementSchema(measurementName, dataType)); + } + + Tablet tablet = new Tablet(deviceId, schemaList, 1); + + tablet.initBitMaps(); + + tablet.addTimestamp(0, FIXED_TIMESTAMP); + + for (int colIndex = 0; colIndex < COLUMN_COUNT; colIndex++) { + String measurementName = "s" + colIndex; + TSDataType dataType = getDataType(colIndex); + + Object value = generateValue(dataType, colIndex); + tablet.addValue(measurementName, 0, value); + } + + tablet.setRowSize(1); + + return tablet; + } + + private static Object generateValue(TSDataType dataType, int colIndex) { + switch (dataType) { + case INT32: + return colIndex % 1000; + case INT64: + return (long) (colIndex * 1000); + case FLOAT: + return (float) (colIndex * 0.1); + case DOUBLE: + return (double) (colIndex * 0.01); + case BOOLEAN: + return colIndex % 2 == 0; + case TEXT: + return new org.apache.tsfile.utils.Binary( + ("value_" + colIndex).getBytes(StandardCharsets.UTF_8)); + default: + return colIndex; + } + } +}
diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java index c735e8d..43a637d 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
@@ -209,7 +209,6 @@ // Sequentially poll the tsFile by default private int pipeRealTimeQueuePollHistoricalTsFileThreshold = 1; private int pipeRealTimeQueueMaxWaitingTsFileSize = 1; - private boolean skipFailedTableSchemaCheck = false; /** The maximum number of threads that can be used to execute subtasks in PipeSubtaskExecutor. */ private int pipeSubtaskExecutorMaxThreadNum = @@ -219,7 +218,6 @@ private int pipeDataStructureTabletSizeInBytes = 2097152; private double pipeDataStructureTabletMemoryBlockAllocationRejectThreshold = 0.3; private double pipeDataStructureTsFileMemoryBlockAllocationRejectThreshold = 0.3; - private double PipeDataStructureBatchMemoryProportion = 0.2; private volatile double pipeTotalFloatingMemoryProportion = 0.5; // Check if memory check is enabled for Pipe @@ -255,7 +253,6 @@ private long pipeSubtaskExecutorPendingQueueMaxBlockingTimeMs = 50; private long pipeSubtaskExecutorCronHeartbeatEventIntervalSeconds = 20; - private long pipeSubtaskExecutorForcedRestartIntervalMs = Long.MAX_VALUE; private long pipeMaxWaitFinishTime = 10 * 1000; @@ -320,7 +317,7 @@ private volatile long pipeMemoryExpanderIntervalSeconds = (long) 3 * 60; // 3Min private volatile long pipeCheckMemoryEnoughIntervalMs = 10L; private volatile float pipeLeaderCacheMemoryUsagePercentage = 0.1F; - private volatile long pipeMaxAlignedSeriesChunkSizeInOneBatch = (long) 16 * 1024 * 1024; // 16MB; + private volatile long pipeMaxReaderChunkSize = 16 * MB; // 16MB; private volatile long pipeListeningQueueTransferSnapshotThreshold = 1000; private volatile int pipeSnapshotExecutionMaxBatchSize = 1000; private volatile long pipeRemainingTimeCommitRateAutoSwitchSeconds = 30; @@ -890,21 +887,6 @@ pipeDataStructureTsFileMemoryBlockAllocationRejectThreshold); } - public double getPipeDataStructureBatchMemoryProportion() { - return PipeDataStructureBatchMemoryProportion; - } - - public void setPipeDataStructureBatchMemoryProportion( - double PipeDataStructureBatchMemoryProportion) { - if (this.PipeDataStructureBatchMemoryProportion == PipeDataStructureBatchMemoryProportion) { - return; - } - this.PipeDataStructureBatchMemoryProportion = PipeDataStructureBatchMemoryProportion; - logger.info( - "PipeDataStructureBatchMemoryProportion is set to {}.", - PipeDataStructureBatchMemoryProportion); - } - public boolean isPipeEnableMemoryChecked() { return isPipeEnableMemoryCheck; } @@ -1452,22 +1434,6 @@ pipeSubtaskExecutorCronHeartbeatEventIntervalSeconds); } - public long getPipeSubtaskExecutorForcedRestartIntervalMs() { - return pipeSubtaskExecutorForcedRestartIntervalMs; - } - - public void setPipeSubtaskExecutorForcedRestartIntervalMs( - long pipeSubtaskExecutorForcedRestartIntervalMs) { - if (this.pipeSubtaskExecutorForcedRestartIntervalMs - == pipeSubtaskExecutorForcedRestartIntervalMs) { - return; - } - this.pipeSubtaskExecutorForcedRestartIntervalMs = pipeSubtaskExecutorForcedRestartIntervalMs; - logger.info( - "pipeSubtaskExecutorForcedRestartIntervalMs is set to {}", - pipeSubtaskExecutorForcedRestartIntervalMs); - } - public long getPipeMaxWaitFinishTime() { return pipeMaxWaitFinishTime; } @@ -1523,18 +1489,6 @@ pipeRealTimeQueueMaxWaitingTsFileSize); } - public boolean isSkipFailedTableSchemaCheck() { - return skipFailedTableSchemaCheck; - } - - public void setSkipFailedTableSchemaCheck(boolean skipFailedTableSchemaCheck) { - if (this.skipFailedTableSchemaCheck == skipFailedTableSchemaCheck) { - return; - } - this.skipFailedTableSchemaCheck = skipFailedTableSchemaCheck; - logger.info("skipFailedTableSchemaCheck is set to {}.", skipFailedTableSchemaCheck); - } - public void setPipeAirGapReceiverEnabled(boolean pipeAirGapReceiverEnabled) { if (pipeAirGapReceiverEnabled == this.pipeAirGapReceiverEnabled) { return; @@ -1798,19 +1752,16 @@ "pipeLeaderCacheMemoryUsagePercentage is set to {}", pipeLeaderCacheMemoryUsagePercentage); } - public long getPipeMaxAlignedSeriesChunkSizeInOneBatch() { - return pipeMaxAlignedSeriesChunkSizeInOneBatch; + public long getPipeMaxReaderChunkSize() { + return pipeMaxReaderChunkSize; } - public void setPipeMaxAlignedSeriesChunkSizeInOneBatch( - long pipeMaxAlignedSeriesChunkSizeInOneBatch) { - if (this.pipeMaxAlignedSeriesChunkSizeInOneBatch == pipeMaxAlignedSeriesChunkSizeInOneBatch) { + public void setPipeMaxReaderChunkSize(long pipeMaxReaderChunkSize) { + if (this.pipeMaxReaderChunkSize == pipeMaxReaderChunkSize) { return; } - this.pipeMaxAlignedSeriesChunkSizeInOneBatch = pipeMaxAlignedSeriesChunkSizeInOneBatch; - logger.info( - "pipeMaxAlignedSeriesChunkSizeInOneBatch is set to {}", - pipeMaxAlignedSeriesChunkSizeInOneBatch); + this.pipeMaxReaderChunkSize = pipeMaxReaderChunkSize; + logger.info("pipeMaxReaderChunkSize is set to {}", pipeMaxReaderChunkSize); } public long getPipeListeningQueueTransferSnapshotThreshold() {
diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonDescriptor.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonDescriptor.java index 0957317..2bd4d95 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonDescriptor.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonDescriptor.java
@@ -398,7 +398,7 @@ Float.parseFloat( properties.getProperty( "subscription_prefetch_missing_rate_threshold", - String.valueOf(config.getSubscriptionPrefetchMemoryThreshold())))); + String.valueOf(config.getSubscriptionPrefetchMissingRateThreshold())))); config.setSubscriptionPrefetchEventLocalCountThreshold( Integer.parseInt( properties.getProperty( @@ -473,6 +473,7 @@ config.setSchemaEngineMode(globalConfig.schemaEngineMode); config.setTagAttributeTotalSize(globalConfig.tagAttributeTotalSize); config.setDiskSpaceWarningThreshold(globalConfig.getDiskSpaceWarningThreshold()); + config.setEnableGrantOption(globalConfig.isEnableGrantOption()); } public void loadAuditConfig(TAuditConfig auditConfig) {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/metadata/AlignedTimeseriesException.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/pipe/PipeNonReportException.java similarity index 65% rename from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/metadata/AlignedTimeseriesException.java rename to iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/pipe/PipeNonReportException.java index f11c986..572a776 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/metadata/AlignedTimeseriesException.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/pipe/PipeNonReportException.java
@@ -17,17 +17,11 @@ * under the License. */ -package org.apache.iotdb.db.exception.metadata; +package org.apache.iotdb.commons.exception.pipe; -import org.apache.iotdb.commons.exception.MetadataException; -import org.apache.iotdb.rpc.TSStatusCode; +public class PipeNonReportException extends PipeRuntimeNonCriticalException { -public class AlignedTimeseriesException extends MetadataException { - - public AlignedTimeseriesException(String message, String path) { - super( - String.format("%s (Path: %s)", message, path), - TSStatusCode.ALIGNED_TIMESERIES_ERROR.getStatusCode(), - true); + public PipeNonReportException(final String message) { + super(message); } }
diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/config/PipeConfig.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/config/PipeConfig.java index 37d9af0..4e840d5 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/config/PipeConfig.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/config/PipeConfig.java
@@ -69,15 +69,13 @@ return COMMON_CONFIG.getPipeTotalFloatingMemoryProportion(); } - public double getPipeDataStructureBatchMemoryProportion() { - return COMMON_CONFIG.getPipeDataStructureBatchMemoryProportion(); - } + /////////////////////////////// Estimation /////////////////////////////// public boolean isPipeEnableMemoryCheck() { return COMMON_CONFIG.isPipeEnableMemoryChecked(); } - public long PipeInsertNodeQueueMemory() { + public long getPipeInsertNodeQueueMemory() { return COMMON_CONFIG.getPipeInsertNodeQueueMemory(); } @@ -119,10 +117,6 @@ return COMMON_CONFIG.getPipeRealTimeQueueMaxWaitingTsFileSize(); } - public boolean isSkipFailedTableSchemaCheck() { - return COMMON_CONFIG.isSkipFailedTableSchemaCheck(); - } - /////////////////////////////// Subtask Executor /////////////////////////////// public int getPipeSubtaskExecutorMaxThreadNum() { @@ -145,10 +139,6 @@ return COMMON_CONFIG.getPipeSubtaskExecutorCronHeartbeatEventIntervalSeconds(); } - public long getPipeSubtaskExecutorForcedRestartIntervalMs() { - return COMMON_CONFIG.getPipeSubtaskExecutorForcedRestartIntervalMs(); - } - public long getPipeMaxWaitFinishTime() { return COMMON_CONFIG.getPipeMaxWaitFinishTime(); } @@ -237,20 +227,8 @@ return COMMON_CONFIG.getPipeConnectorRequestSliceThresholdBytes(); } - public float getPipeLeaderCacheMemoryUsagePercentage() { - return COMMON_CONFIG.getPipeLeaderCacheMemoryUsagePercentage(); - } - - public long getPipeMaxAlignedSeriesChunkSizeInOneBatch() { - return COMMON_CONFIG.getPipeMaxAlignedSeriesChunkSizeInOneBatch(); - } - - public long getPipeListeningQueueTransferSnapshotThreshold() { - return COMMON_CONFIG.getPipeListeningQueueTransferSnapshotThreshold(); - } - - public int getPipeSnapshotExecutionMaxBatchSize() { - return COMMON_CONFIG.getPipeSnapshotExecutionMaxBatchSize(); + public long getPipeMaxReaderChunkSize() { + return COMMON_CONFIG.getPipeMaxReaderChunkSize(); } public long getPipeRemainingTimeCommitAutoSwitchSeconds() { @@ -411,6 +389,10 @@ return COMMON_CONFIG.getPipeCheckMemoryEnoughIntervalMs(); } + public float getPipeLeaderCacheMemoryUsagePercentage() { + return COMMON_CONFIG.getPipeLeaderCacheMemoryUsagePercentage(); + } + /////////////////////////////// TwoStage /////////////////////////////// public long getTwoStageAggregateMaxCombinerLiveTimeInMs() { @@ -425,6 +407,16 @@ return COMMON_CONFIG.getTwoStageAggregateSenderEndPointsCacheInMs(); } + /////////////////////////////// Meta /////////////////////////////// + + public long getPipeListeningQueueTransferSnapshotThreshold() { + return COMMON_CONFIG.getPipeListeningQueueTransferSnapshotThreshold(); + } + + public int getPipeSnapshotExecutionMaxBatchSize() { + return COMMON_CONFIG.getPipeSnapshotExecutionMaxBatchSize(); + } + /////////////////////////////// Ref /////////////////////////////// public boolean getPipeEventReferenceTrackingEnabled() { @@ -460,8 +452,6 @@ getPipeDataStructureTsFileMemoryBlockAllocationRejectThreshold()); LOGGER.info("PipeTotalFloatingMemoryProportion: {}", getPipeTotalFloatingMemoryProportion()); - LOGGER.info( - "PipeDataStructureBatchMemoryProportion: {}", getPipeDataStructureBatchMemoryProportion()); LOGGER.info("IsPipeEnableMemoryCheck: {}", isPipeEnableMemoryCheck()); LOGGER.info("PipeTsFileParserMemory: {}", getTsFileParserMemory()); LOGGER.info("SinkBatchMemoryInsertNode: {}", getSinkBatchMemoryInsertNode()); @@ -489,9 +479,6 @@ LOGGER.info( "PipeSubtaskExecutorCronHeartbeatEventIntervalSeconds: {}", getPipeSubtaskExecutorCronHeartbeatEventIntervalSeconds()); - LOGGER.info( - "PipeSubtaskExecutorForcedRestartIntervalMs: {}", - getPipeSubtaskExecutorForcedRestartIntervalMs()); LOGGER.info("PipeMaxWaitFinishTime: {}", getPipeMaxWaitFinishTime()); LOGGER.info( @@ -514,9 +501,7 @@ isPipeConnectorRPCThriftCompressionEnabled()); LOGGER.info( "PipeLeaderCacheMemoryUsagePercentage: {}", getPipeLeaderCacheMemoryUsagePercentage()); - LOGGER.info( - "PipeMaxAlignedSeriesChunkSizeInOneBatch: {}", - getPipeMaxAlignedSeriesChunkSizeInOneBatch()); + LOGGER.info("PipeMaxAlignedSeriesChunkSizeInOneBatch: {}", getPipeMaxReaderChunkSize()); LOGGER.info( "PipeListeningQueueTransferSnapshotThreshold: {}", getPipeListeningQueueTransferSnapshotThreshold());
diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/config/PipeDescriptor.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/config/PipeDescriptor.java index 2a170b6..760a7b5 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/config/PipeDescriptor.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/config/PipeDescriptor.java
@@ -210,11 +210,6 @@ "pipe_data_structure_ts_file_memory_block_allocation_reject_threshold", String.valueOf( config.getPipeDataStructureTsFileMemoryBlockAllocationRejectThreshold())))); - config.setPipeDataStructureBatchMemoryProportion( - Double.parseDouble( - properties.getProperty( - "pipe_data_structure_batch_memory_proportion", - String.valueOf(config.getPipeDataStructureBatchMemoryProportion())))); config.setPipeTotalFloatingMemoryProportion( Double.parseDouble( properties.getProperty( @@ -278,11 +273,6 @@ properties.getProperty( "pipe_realTime_queue_max_waiting_tsFile_size", String.valueOf(config.getPipeRealTimeQueueMaxWaitingTsFileSize())))); - config.setSkipFailedTableSchemaCheck( - Boolean.parseBoolean( - properties.getProperty( - "skip_failed_table_schema_check", - String.valueOf(config.isSkipFailedTableSchemaCheck())))); config.setPipeSubtaskExecutorBasicCheckPointIntervalByConsumedEventCount( Integer.parseInt( properties.getProperty( @@ -300,11 +290,6 @@ properties.getProperty( "pipe_subtask_executor_pending_queue_max_blocking_time_ms", String.valueOf(config.getPipeSubtaskExecutorPendingQueueMaxBlockingTimeMs())))); - config.setPipeSubtaskExecutorForcedRestartIntervalMs( - Long.parseLong( - properties.getProperty( - "pipe_subtask_executor_forced_restart_interval_ms", - String.valueOf(config.getPipeSubtaskExecutorForcedRestartIntervalMs())))); config.setPipeExtractorAssignerDisruptorRingBufferSize( Integer.parseInt( @@ -488,11 +473,10 @@ properties.getProperty( "pipe_leader_cache_memory_usage_percentage", String.valueOf(config.getPipeLeaderCacheMemoryUsagePercentage())))); - config.setPipeMaxAlignedSeriesChunkSizeInOneBatch( + config.setPipeMaxReaderChunkSize( Long.parseLong( properties.getProperty( - "pipe_max_aligned_series_chunk_size_in_one_batch", - String.valueOf(config.getPipeMaxAlignedSeriesChunkSizeInOneBatch())))); + "pipe_max_reader_chunk_size", String.valueOf(config.getPipeMaxReaderChunkSize())))); config.setPipeTransferTsFileSync( Boolean.parseBoolean(
diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/queue/listening/AbstractPipeListeningQueue.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/queue/listening/AbstractPipeListeningQueue.java index c5d8384..cb57260 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/queue/listening/AbstractPipeListeningQueue.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/queue/listening/AbstractPipeListeningQueue.java
@@ -76,10 +76,12 @@ } } - public synchronized Pair<Long, List<PipeSnapshotEvent>> findAvailableSnapshots() { - if (queueTailIndex2SnapshotsCache.getLeft() - < queue.getTailIndex() - - PipeConfig.getInstance().getPipeListeningQueueTransferSnapshotThreshold()) { + public synchronized Pair<Long, List<PipeSnapshotEvent>> findAvailableSnapshots( + final boolean mayClear) { + if (mayClear + && queueTailIndex2SnapshotsCache.getLeft() + < queue.getTailIndex() + - PipeConfig.getInstance().getPipeListeningQueueTransferSnapshotThreshold()) { clearSnapshots(); } return queueTailIndex2SnapshotsCache;
diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/receiver/PipeReceiverStatusHandler.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/receiver/PipeReceiverStatusHandler.java index 8f00e31..3bb9e14 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/receiver/PipeReceiverStatusHandler.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/receiver/PipeReceiverStatusHandler.java
@@ -21,7 +21,7 @@ import org.apache.iotdb.common.rpc.thrift.TSStatus; import org.apache.iotdb.commons.exception.pipe.PipeConsensusRetryWithIncreasingIntervalException; -import org.apache.iotdb.commons.exception.pipe.PipeRuntimeSinkCriticalException; +import org.apache.iotdb.commons.exception.pipe.PipeNonReportException; import org.apache.iotdb.commons.exception.pipe.PipeRuntimeSinkRetryTimesConfigurableException; import org.apache.iotdb.commons.pipe.agent.task.subtask.PipeSubtask; import org.apache.iotdb.commons.pipe.resource.log.PipeLogger; @@ -127,7 +127,7 @@ LOGGER::info, "Temporary unavailable exception: will retry forever. status: %s", status); - throw new PipeRuntimeSinkCriticalException(exceptionMessage); + throw new PipeNonReportException(exceptionMessage); } case 1810: // PIPE_RECEIVER_USER_CONFLICT_EXCEPTION
diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/source/IoTDBNonDataRegionSource.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/source/IoTDBNonDataRegionSource.java index bad0d14..97987ad 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/source/IoTDBNonDataRegionSource.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/source/IoTDBNonDataRegionSource.java
@@ -112,10 +112,10 @@ private long getNextIndexAfterSnapshot() { long nextIndex; if (needTransferSnapshot()) { - nextIndex = findSnapshot(); + nextIndex = findSnapshot(true); if (nextIndex == Long.MIN_VALUE) { triggerSnapshot(); - nextIndex = findSnapshot(); + nextIndex = findSnapshot(false); if (nextIndex == Long.MIN_VALUE) { throw new PipeException("Cannot get the newest snapshot after triggering one."); } @@ -128,9 +128,9 @@ return nextIndex; } - private long findSnapshot() { + private long findSnapshot(final boolean mayClear) { final Pair<Long, List<PipeSnapshotEvent>> queueTailIndex2Snapshots = - getListeningQueue().findAvailableSnapshots(); + getListeningQueue().findAvailableSnapshots(mayClear); final long nextIndex = Objects.nonNull(queueTailIndex2Snapshots.getLeft()) && queueTailIndex2Snapshots.getLeft() != Long.MIN_VALUE
diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/service/AbstractThriftServiceThread.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/service/AbstractThriftServiceThread.java index 7537308..39b11ba 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/service/AbstractThriftServiceThread.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/service/AbstractThriftServiceThread.java
@@ -44,7 +44,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.net.InetSocketAddress; +import java.nio.file.AccessDeniedException; +import java.security.KeyStore; +import java.security.cert.X509Certificate; +import java.util.Enumeration; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; @@ -177,13 +183,15 @@ this.serviceName = serviceName; try { + validateCertificate(keyStorePath, keyStorePwd); TSSLTransportFactory.TSSLTransportParameters params = new TSSLTransportFactory.TSSLTransportParameters(); params.setKeyStore(keyStorePath, keyStorePwd); if (trustStorePath != null && !trustStorePath.isEmpty()) { + validateCertificate(trustStorePath, trustStorePwd); params.setTrustStore(trustStorePath, trustStorePwd); + params.requireClientAuth(true); } - params.requireClientAuth(false); InetSocketAddress socketAddress = new InetSocketAddress(bindAddress, port); serverTransport = TSSLTransportFactory.getServerSocket( @@ -197,6 +205,41 @@ } } + private static void validateCertificate(String keyStorePath, String keystorePassword) + throws TTransportException { + try { + KeyStore keystore = KeyStore.getInstance("JKS"); + try (FileInputStream fis = new FileInputStream(keyStorePath)) { + keystore.load(fis, keystorePassword.toCharArray()); + } + + Enumeration<String> aliases = keystore.aliases(); + while (aliases.hasMoreElements()) { + String currentAlias = aliases.nextElement(); + checkCertificate(keystore, currentAlias); + } + } catch (AccessDeniedException e) { + throw new TTransportException("Failed to load keystore or truststore file"); + } catch (FileNotFoundException e) { + throw new TTransportException("keystore or truststore file not found"); + } catch (Exception e) { + throw new TTransportException(e); + } + } + + private static void checkCertificate(KeyStore keystore, String alias) throws Exception { + if (!keystore.containsAlias(alias)) { + return; + } + + X509Certificate cert = (X509Certificate) keystore.getCertificate(alias); + if (cert == null) { + return; + } + + cert.checkValidity(); + } + @SuppressWarnings("squid:S107") protected AbstractThriftServiceThread( TProcessor processor,
diff --git a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift index e209200..9a4c875 100644 --- a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift +++ b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
@@ -44,11 +44,12 @@ 5: required i64 timePartitionInterval 6: required string readConsistencyLevel 7: required double diskSpaceWarningThreshold - 8: optional string timestampPrecision - 9: optional string schemaEngineMode - 10: optional i32 tagAttributeTotalSize - 11: optional bool isEnterprise - 12: optional i64 timePartitionOrigin + 8: required bool enableGrantOption + 9: optional string timestampPrecision + 10: optional string schemaEngineMode + 11: optional i32 tagAttributeTotalSize + 12: optional bool isEnterprise + 13: optional i64 timePartitionOrigin } struct TRatisConfig {
diff --git a/pom.xml b/pom.xml index 8f96218..c86df5f 100644 --- a/pom.xml +++ b/pom.xml
@@ -177,7 +177,7 @@ <thrift.version>0.14.1</thrift.version> <xz.version>1.9</xz.version> <zstd-jni.version>1.5.6-3</zstd-jni.version> - <tsfile.version>2.2.0-250825-SNAPSHOT</tsfile.version> + <tsfile.version>2.2.0-251010-SNAPSHOT</tsfile.version> </properties> <!-- if we claim dependencies in dependencyManagement, then we do not claim
diff --git a/scripts/sbin/windows/start-cli-table.bat b/scripts/sbin/windows/start-cli-table.bat index 7812ff5..254b430 100644 --- a/scripts/sbin/windows/start-cli-table.bat +++ b/scripts/sbin/windows/start-cli-table.bat
@@ -34,15 +34,5 @@ REM Execute main script with: REM Pass all arguments through and add -sql_dialect table if not already specified setlocal -set ARGS=%* -if "%ARGS%"=="" ( - "%CLI_SCRIPT%" -sql_dialect table -) else ( - echo %ARGS% | find /i "-sql_dialect " >nul - if errorlevel 1 ( - "%CLI_SCRIPT%" -sql_dialect table %* - ) else ( - "%CLI_SCRIPT%" %* - ) -) +"%CLI_SCRIPT%" -sql_dialect table %* endlocal \ No newline at end of file