未验证 提交 a68503b3 编写于 作者: wu-sheng's avatar wu-sheng 提交者: GitHub

Fix unexpected deleting due to TTL mechanism bug (#8000)

上级 1ee9ce0a
......@@ -50,6 +50,7 @@ Release Notes.
* Support search browser service.
* Add `getProfileTaskLogs` to profile query protocol.
* Set `SW_KAFKA_FETCHER_ENABLE_NATIVE_PROTO_LOG`, `SW_KAFKA_FETCHER_ENABLE_NATIVE_JSON_LOG` default `true`.
* Fix unexpected deleting due to TTL mechanism bug for H2, MySQL, TiDB and PostgreSQL.
#### UI
......
......@@ -39,28 +39,35 @@ public class H2HistoryDeleteDAO implements IHistoryDeleteDAO {
@Override
public void deleteHistory(Model model, String timeBucketColumnName, int ttl) throws IOException {
SQLBuilder dataDeleteSQL = new SQLBuilder("delete from " + model.getName() + " where ")
.append(timeBucketColumnName).append("<= ? ");
.append(timeBucketColumnName).append("<= ? ")
.append(" and ")
.append(timeBucketColumnName).append(">= ? ");
try (Connection connection = client.getConnection()) {
long deadline;
long minTime;
if (model.isRecord()) {
deadline = Long.parseLong(new DateTime().plusDays(-ttl).toString("yyyyMMddHHmmss"));
minTime = 1000_00_00_00_00_00L;
} else {
switch (model.getDownsampling()) {
case Minute:
deadline = Long.parseLong(new DateTime().plusDays(-ttl).toString("yyyyMMddHHmm"));
minTime = 1000_00_00_00_00L;
break;
case Hour:
deadline = Long.parseLong(new DateTime().plusDays(-ttl).toString("yyyyMMddHH"));
minTime = 1000_00_00_00L;
break;
case Day:
deadline = Long.parseLong(new DateTime().plusDays(-ttl).toString("yyyyMMdd"));
minTime = 1000_00_00L;
break;
default:
return;
}
}
client.executeUpdate(connection, dataDeleteSQL.toString(), deadline);
client.executeUpdate(connection, dataDeleteSQL.toString(), deadline, minTime);
} catch (JDBCClientException | SQLException e) {
throw new IOException(e.getMessage(), e);
}
......
......@@ -40,28 +40,35 @@ public class TiDBHistoryDeleteDAO implements IHistoryDeleteDAO {
public void deleteHistory(Model model, String timeBucketColumnName, int ttl) throws IOException {
SQLBuilder dataDeleteSQL = new SQLBuilder("delete from " + model.getName() + " where ")
.append(timeBucketColumnName).append("<= ? ")
.append(" and ")
.append(timeBucketColumnName).append(">= ? ")
.append(" limit 10000");
try (Connection connection = client.getConnection()) {
long deadline;
long minTime;
if (model.isRecord()) {
deadline = Long.parseLong(new DateTime().plusDays(-ttl).toString("yyyyMMddHHmmss"));
minTime = 1000_00_00_00_00_00L;
} else {
switch (model.getDownsampling()) {
case Minute:
deadline = Long.parseLong(new DateTime().plusDays(-ttl).toString("yyyyMMddHHmm"));
minTime = 1000_00_00_00_00L;
break;
case Hour:
deadline = Long.parseLong(new DateTime().plusDays(-ttl).toString("yyyyMMddHH"));
minTime = 1000_00_00_00L;
break;
case Day:
deadline = Long.parseLong(new DateTime().plusDays(-ttl).toString("yyyyMMdd"));
minTime = 1000_00_00L;
break;
default:
return;
}
}
while (client.executeUpdate(connection, dataDeleteSQL.toString(), deadline) > 0) {
while (client.executeUpdate(connection, dataDeleteSQL.toString(), deadline, minTime) > 0) {
}
} catch (JDBCClientException | SQLException e) {
throw new IOException(e.getMessage(), e);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册