Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

When Mode uses the memory mode of H2database, JDBCRepository has a logical problem in processing Delete and Create SQL statements #33281

Closed
linghengqian opened this issue Oct 17, 2024 · 1 comment · Fixed by #33282

Comments

@linghengqian
Copy link
Member

Feature Request

For English only, other languages will not be accepted.

Please pay attention on issues you submitted, because we maybe need more details.
If no response anymore and we cannot make decision by current information, we will close it.

Please answer these questions before submitting your issue. Thanks!

Is your feature request related to a problem?

Describe the feature you would like.

  • When Mode uses the memory mode of H2database, org.apache.shardingsphere.mode.repository.standalone.jdbc.JDBCRepository has a logical problem in processing Delete and Create SQL statements.
  • For org.apache.shardingsphere.mode.repository.standalone.jdbc.JDBCRepository#init(java.util.Properties),
try (
                Connection connection = dataSource.getConnection();
                Statement statement = connection.createStatement()) {
            // TODO remove it later. Add for reset standalone test e2e's env. Need to close DataSource to release H2's memory data
            if (jdbcRepositoryProps.<String>getValue(JDBCRepositoryPropertyKey.JDBC_URL).contains("h2:mem:")) {
                try {
                    statement.execute("TRUNCATE TABLE `repository`");
                } catch (final SQLException ignored) {
                }
            }
            // Finish TODO
            statement.execute(repositorySQL.getCreateTableSQL());
        }
  • CREATE TABLE IF NOT EXISTS repository(id varchar(36) PRIMARY KEY, key TEXT, value TEXT, parent TEXT) is executed later than TRUNCATE TABLE repository. The TRUNCATE SQL should not be executed before the table is created. This leads to issues similar to those detected in https://www.yuque.com/linghengqian/meve2v/kezd0g2m3lfuz38q . The picture comes from my local device.
  • image
  • For org.apache.shardingsphere.mode.repository.standalone.jdbc.JDBCRepository#delete(java.lang.String),
public void delete(final String key) {
        try (
                Connection connection = dataSource.getConnection();
                PreparedStatement preparedStatement = connection.prepareStatement(repositorySQL.getDeleteSQL())) {
            preparedStatement.setString(1, key + "%");
            preparedStatement.executeUpdate();
        } catch (final SQLException ex) {
            log.error("Delete {} data by key: {} failed", getType(), key, ex);
        }
    }
  • For a closed normal database connection, this processing is fine. However, for H2database's memory mode, once the database connection is closed, the data will be automatically lost, and it is meaningless to continue throwing exceptions. For nativeTest involved in https://github.com/apache/shardingsphere/actions/runs/11371301147/job/31633062477, the relevant unit test is starting multiple ShardingSphere Proxy Native instances in a single JVM process or a single GraalVM Native Image. Forcibly shutting down the ShardingSphere Proxy Native instance will result in an error similar to the following.
Test run finished after 252188 ms
[        19 containers found      ]
[         0 containers skipped    ]
[        19 containers started    ]
[         0 containers aborted    ]
[        19 containers successful ]
[         0 containers failed     ]
[        18 tests found           ]
[         0 tests skipped         ]
[        18 tests started         ]
[         0 tests aborted         ]
[        18 tests successful      ]
[         0 tests failed          ]

Error:  2024-10-16 18:25:17.896 [ForkJoinPool.commonPool-worker-1] o.a.s.m.r.s.jdbc.JDBCRepository - Delete JDBC data by key: /nodes/compute_nodes/online/proxy/d5904fbf-9528-417a-8c59-913700c8777f failed
java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-7) has been closed.
	at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:96)
	at org.apache.shardingsphere.mode.repository.standalone.jdbc.JDBCRepository.delete(JDBCRepository.java:191)
	at org.apache.shardingsphere.mode.persist.service.ComputeNodePersistService.offline(ComputeNodePersistService.java:191)
	at org.apache.shardingsphere.mode.manager.ContextManager.close(ContextManager.java:212)
	at org.apache.shardingsphere.proxy.frontend.ShardingSphereProxy.close(ShardingSphereProxy.java:153)
	at org.apache.shardingsphere.proxy.frontend.ShardingSphereProxy.start(ShardingSphereProxy.java:80)
	at org.apache.shardingsphere.proxy.Bootstrap.main(Bootstrap.java:70)
	at org.apache.shardingsphere.test.natived.commons.proxy.ProxyTestingServer.lambda$new$0(ProxyTestingServer.java:48)
	at [email protected]/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804)
	at [email protected]/java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796)
	at [email protected]/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:507)
	at [email protected]/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1489)
	at [email protected]/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:2071)
	at [email protected]/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:2033)
	at [email protected]/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:187)
	at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:853)
	at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:829)
  • I believe this can be improved.
@linghengqian
Copy link
Member Author

  • I am working on the current issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant