Fixes for upgrade functionality
This commit is contained in:
parent
6d7c28c88f
commit
6aa5655e6f
@ -14,6 +14,38 @@
|
|||||||
-- limitations under the License.
|
-- limitations under the License.
|
||||||
--
|
--
|
||||||
|
|
||||||
|
DROP MATERIALIZED VIEW IF EXISTS thingsboard.rule_chain_by_tenant_and_search_text;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS thingsboard.rule_chain;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS thingsboard.rule_chain (
|
||||||
|
id uuid,
|
||||||
|
tenant_id uuid,
|
||||||
|
name text,
|
||||||
|
type text,
|
||||||
|
search_text text,
|
||||||
|
first_rule_node_id uuid,
|
||||||
|
root boolean,
|
||||||
|
debug_mode boolean,
|
||||||
|
configuration text,
|
||||||
|
additional_info text,
|
||||||
|
PRIMARY KEY (id, tenant_id, type)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.rule_chain_by_tenant_and_search_text AS
|
||||||
|
SELECT *
|
||||||
|
from thingsboard.rule_chain
|
||||||
|
WHERE tenant_id IS NOT NULL AND search_text IS NOT NULL AND id IS NOT NULL AND type IS NOT NULL
|
||||||
|
PRIMARY KEY ( tenant_id, search_text, id, type )
|
||||||
|
WITH CLUSTERING ORDER BY ( search_text ASC, id DESC );
|
||||||
|
|
||||||
|
CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.rule_chain_by_tenant_by_type_and_search_text AS
|
||||||
|
SELECT *
|
||||||
|
from thingsboard.rule_chain
|
||||||
|
WHERE tenant_id IS NOT NULL AND search_text IS NOT NULL AND id IS NOT NULL AND type IS NOT NULL
|
||||||
|
PRIMARY KEY ( tenant_id, type, search_text, id )
|
||||||
|
WITH CLUSTERING ORDER BY ( type ASC, search_text ASC, id DESC );
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS thingsboard.edge (
|
CREATE TABLE IF NOT EXISTS thingsboard.edge (
|
||||||
id timeuuid,
|
id timeuuid,
|
||||||
tenant_id timeuuid,
|
tenant_id timeuuid,
|
||||||
@ -37,12 +69,12 @@ CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_tenant_and_name AS
|
|||||||
PRIMARY KEY ( tenant_id, name, id, customer_id, type)
|
PRIMARY KEY ( tenant_id, name, id, customer_id, type)
|
||||||
WITH CLUSTERING ORDER BY ( name ASC, id DESC, customer_id DESC);
|
WITH CLUSTERING ORDER BY ( name ASC, id DESC, customer_id DESC);
|
||||||
|
|
||||||
CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_tenant_and_routing_key AS
|
CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_routing_key AS
|
||||||
SELECT *
|
SELECT *
|
||||||
from thingsboard.edge
|
from thingsboard.edge
|
||||||
WHERE tenant_id IS NOT NULL AND customer_id IS NOT NULL AND type IS NOT NULL AND routing_key IS NOT NULL AND id IS NOT NULL
|
WHERE tenant_id IS NOT NULL AND customer_id IS NOT NULL AND type IS NOT NULL AND routing_key IS NOT NULL AND id IS NOT NULL
|
||||||
PRIMARY KEY ( tenant_id, routing_key, id, customer_id, type)
|
PRIMARY KEY ( routing_key, tenant_id, id, customer_id, type)
|
||||||
WITH CLUSTERING ORDER BY ( routing_key ASC, id DESC, customer_id DESC);
|
WITH CLUSTERING ORDER BY ( tenant_id DESC, id DESC, customer_id DESC);
|
||||||
|
|
||||||
CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_tenant_and_search_text AS
|
CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_tenant_and_search_text AS
|
||||||
SELECT *
|
SELECT *
|
||||||
|
|||||||
@ -152,6 +152,15 @@ public class ThingsboardInstallService {
|
|||||||
databaseTsUpgradeService.upgradeDatabase("2.5.4");
|
databaseTsUpgradeService.upgradeDatabase("2.5.4");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case "2.5.5":
|
||||||
|
log.info("Upgrading ThingsBoard from version 2.5.5 to 2.6.0 ...");
|
||||||
|
if (databaseTsUpgradeService != null) {
|
||||||
|
databaseTsUpgradeService.upgradeDatabase("2.5.5");
|
||||||
|
}
|
||||||
|
databaseEntitiesUpgradeService.upgradeDatabase("2.5.5");
|
||||||
|
|
||||||
|
dataUpdateService.updateData("2.5.5");
|
||||||
|
|
||||||
log.info("Updating system data...");
|
log.info("Updating system data...");
|
||||||
|
|
||||||
systemDataLoaderService.deleteSystemWidgetBundle("charts");
|
systemDataLoaderService.deleteSystemWidgetBundle("charts");
|
||||||
|
|||||||
@ -150,6 +150,9 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i
|
|||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.warn("Failed to process messages handling!", e);
|
log.warn("Failed to process messages handling!", e);
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (InterruptedException ignore) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@ -252,6 +252,7 @@ public final class EdgeGrpcSession implements Closeable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void processHandleMessages() throws ExecutionException, InterruptedException {
|
void processHandleMessages() throws ExecutionException, InterruptedException {
|
||||||
|
if (isConnected()) {
|
||||||
Long queueStartTs = getQueueStartTs().get();
|
Long queueStartTs = getQueueStartTs().get();
|
||||||
TimePageLink pageLink = new TimePageLink(ctx.getEdgeEventStorageSettings().getMaxReadRecordsCount(), queueStartTs, null, true);
|
TimePageLink pageLink = new TimePageLink(ctx.getEdgeEventStorageSettings().getMaxReadRecordsCount(), queueStartTs, null, true);
|
||||||
TimePageData<EdgeEvent> pageData;
|
TimePageData<EdgeEvent> pageData;
|
||||||
@ -300,6 +301,7 @@ public final class EdgeGrpcSession implements Closeable {
|
|||||||
log.error("Error during sleep", e);
|
log.error("Error during sleep", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private List<DownlinkMsg> convertToDownlinkMsgsPack(List<EdgeEvent> edgeEvents) {
|
private List<DownlinkMsg> convertToDownlinkMsgsPack(List<EdgeEvent> edgeEvents) {
|
||||||
List<DownlinkMsg> result = new ArrayList<>();
|
List<DownlinkMsg> result = new ArrayList<>();
|
||||||
|
|||||||
@ -50,7 +50,7 @@ public abstract class AbstractSqlTsDatabaseUpgradeService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
protected InstallScripts installScripts;
|
protected InstallScripts installScripts;
|
||||||
|
|
||||||
protected abstract void loadSql(Connection conn, String fileName);
|
protected abstract void loadSql(Connection conn, String version, String fileName);
|
||||||
|
|
||||||
protected void loadFunctions(Path sqlFile, Connection conn) throws Exception {
|
protected void loadFunctions(Path sqlFile, Connection conn) throws Exception {
|
||||||
String sql = new String(Files.readAllBytes(sqlFile), StandardCharsets.UTF_8);
|
String sql = new String(Files.readAllBytes(sqlFile), StandardCharsets.UTF_8);
|
||||||
|
|||||||
@ -21,6 +21,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.context.annotation.Profile;
|
import org.springframework.context.annotation.Profile;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.thingsboard.server.common.data.rule.RuleChainType;
|
||||||
import org.thingsboard.server.dao.dashboard.DashboardService;
|
import org.thingsboard.server.dao.dashboard.DashboardService;
|
||||||
import org.thingsboard.server.dao.util.NoSqlDao;
|
import org.thingsboard.server.dao.util.NoSqlDao;
|
||||||
import org.thingsboard.server.service.install.cql.CassandraDbHelper;
|
import org.thingsboard.server.service.install.cql.CassandraDbHelper;
|
||||||
@ -44,6 +45,7 @@ import static org.thingsboard.server.service.install.DatabaseHelper.ENTITY_VIEWS
|
|||||||
import static org.thingsboard.server.service.install.DatabaseHelper.ID;
|
import static org.thingsboard.server.service.install.DatabaseHelper.ID;
|
||||||
import static org.thingsboard.server.service.install.DatabaseHelper.KEYS;
|
import static org.thingsboard.server.service.install.DatabaseHelper.KEYS;
|
||||||
import static org.thingsboard.server.service.install.DatabaseHelper.NAME;
|
import static org.thingsboard.server.service.install.DatabaseHelper.NAME;
|
||||||
|
import static org.thingsboard.server.service.install.DatabaseHelper.RULE_CHAIN;
|
||||||
import static org.thingsboard.server.service.install.DatabaseHelper.SEARCH_TEXT;
|
import static org.thingsboard.server.service.install.DatabaseHelper.SEARCH_TEXT;
|
||||||
import static org.thingsboard.server.service.install.DatabaseHelper.START_TS;
|
import static org.thingsboard.server.service.install.DatabaseHelper.START_TS;
|
||||||
import static org.thingsboard.server.service.install.DatabaseHelper.TENANT_ID;
|
import static org.thingsboard.server.service.install.DatabaseHelper.TENANT_ID;
|
||||||
@ -306,17 +308,39 @@ public class CassandraDatabaseUpgradeService extends AbstractCassandraDatabaseUp
|
|||||||
}
|
}
|
||||||
log.info("Schema updated.");
|
log.info("Schema updated.");
|
||||||
break;
|
break;
|
||||||
case "2.5.0":
|
case "2.5.5":
|
||||||
|
|
||||||
|
log.info("Upgrading Cassandra DataBase from version {} to 2.6.0 ...", fromVersion);
|
||||||
|
|
||||||
|
// Dump rule chains
|
||||||
|
|
||||||
|
cluster.getSession();
|
||||||
|
|
||||||
|
ks = cluster.getCluster().getMetadata().getKeyspace(cluster.getKeyspaceName());
|
||||||
|
|
||||||
|
log.info("Dumping rule chains ...");
|
||||||
|
Path ruleChainsDump = CassandraDbHelper.dumpCfIfExists(ks, cluster.getSession(), RULE_CHAIN,
|
||||||
|
new String[]{ID, TENANT_ID, NAME, SEARCH_TEXT, "first_rule_node_id", "root", "debug_mode", CONFIGURATION, ADDITIONAL_INFO, TYPE},
|
||||||
|
new String[]{"", "", "", "", "", "", "", "", "", RuleChainType.CORE.name()},
|
||||||
|
"tb-rule-chains");
|
||||||
|
log.info("Rule chains dumped.");
|
||||||
|
|
||||||
log.info("Updating schema ...");
|
log.info("Updating schema ...");
|
||||||
schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "2.6.0", SCHEMA_UPDATE_CQL);
|
schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "2.6.0", SCHEMA_UPDATE_CQL);
|
||||||
loadCql(schemaUpdateFile);
|
loadCql(schemaUpdateFile);
|
||||||
|
|
||||||
try {
|
|
||||||
cluster.getSession().execute("alter table rule_chain add type text");
|
|
||||||
Thread.sleep(2500);
|
|
||||||
} catch (InvalidQueryException e) {}
|
|
||||||
log.info("Schema updated.");
|
log.info("Schema updated.");
|
||||||
|
|
||||||
|
// Restore rule chains
|
||||||
|
|
||||||
|
log.info("Restoring rule chains ...");
|
||||||
|
if (ruleChainsDump != null) {
|
||||||
|
CassandraDbHelper.loadCf(ks, cluster.getSession(), RULE_CHAIN,
|
||||||
|
new String[]{ID, TENANT_ID, NAME, SEARCH_TEXT, "first_rule_node_id", "root", "debug_mode", CONFIGURATION, ADDITIONAL_INFO, TYPE}, ruleChainsDump);
|
||||||
|
Files.deleteIfExists(ruleChainsDump);
|
||||||
|
}
|
||||||
|
log.info("Rule chains restored.");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new RuntimeException("Unable to upgrade Cassandra database, unsupported fromVersion: " + fromVersion);
|
throw new RuntimeException("Unable to upgrade Cassandra database, unsupported fromVersion: " + fromVersion);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -50,6 +50,7 @@ public class CassandraTsDatabaseUpgradeService extends AbstractCassandraDatabase
|
|||||||
break;
|
break;
|
||||||
case "2.5.0":
|
case "2.5.0":
|
||||||
case "2.5.4":
|
case "2.5.4":
|
||||||
|
case "2.5.5":
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new RuntimeException("Unable to upgrade Cassandra database, unsupported fromVersion: " + fromVersion);
|
throw new RuntimeException("Unable to upgrade Cassandra database, unsupported fromVersion: " + fromVersion);
|
||||||
|
|||||||
@ -57,6 +57,7 @@ public class DatabaseHelper {
|
|||||||
public static final String DASHBOARD = "dashboard";
|
public static final String DASHBOARD = "dashboard";
|
||||||
public static final String ENTITY_VIEWS = "entity_views";
|
public static final String ENTITY_VIEWS = "entity_views";
|
||||||
public static final String ENTITY_VIEW = "entity_view";
|
public static final String ENTITY_VIEW = "entity_view";
|
||||||
|
public static final String RULE_CHAIN = "rule_chain";
|
||||||
public static final String ID = "id";
|
public static final String ID = "id";
|
||||||
public static final String TITLE = "title";
|
public static final String TITLE = "title";
|
||||||
public static final String TYPE = "type";
|
public static final String TYPE = "type";
|
||||||
|
|||||||
@ -115,6 +115,11 @@ public class InstallScripts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void createDefaultEdgeRuleChains(TenantId tenantId) {
|
||||||
|
Path tenantChainsDir = getTenantRuleChainsDir();
|
||||||
|
loadRuleChainFromFile(tenantId, tenantChainsDir.resolve("edge_root_rule_chain.json"));
|
||||||
|
}
|
||||||
|
|
||||||
public void loadSystemWidgets() throws Exception {
|
public void loadSystemWidgets() throws Exception {
|
||||||
Path widgetBundlesDir = Paths.get(getDataDir(), JSON_DIR, SYSTEM_DIR, WIDGET_BUNDLES_DIR);
|
Path widgetBundlesDir = Paths.get(getDataDir(), JSON_DIR, SYSTEM_DIR, WIDGET_BUNDLES_DIR);
|
||||||
try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(widgetBundlesDir, path -> path.toString().endsWith(JSON_EXT))) {
|
try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(widgetBundlesDir, path -> path.toString().endsWith(JSON_EXT))) {
|
||||||
|
|||||||
@ -94,7 +94,7 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe
|
|||||||
log.info("PostgreSQL version is valid!");
|
log.info("PostgreSQL version is valid!");
|
||||||
if (isOldSchema(conn, 2004003)) {
|
if (isOldSchema(conn, 2004003)) {
|
||||||
log.info("Load upgrade functions ...");
|
log.info("Load upgrade functions ...");
|
||||||
loadSql(conn, LOAD_FUNCTIONS_SQL);
|
loadSql(conn, "2.4.3", LOAD_FUNCTIONS_SQL);
|
||||||
log.info("Updating timeseries schema ...");
|
log.info("Updating timeseries schema ...");
|
||||||
executeQuery(conn, CALL_CREATE_PARTITION_TS_KV_TABLE);
|
executeQuery(conn, CALL_CREATE_PARTITION_TS_KV_TABLE);
|
||||||
if (!partitionType.equals("INDEFINITE")) {
|
if (!partitionType.equals("INDEFINITE")) {
|
||||||
@ -179,9 +179,9 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe
|
|||||||
}
|
}
|
||||||
|
|
||||||
log.info("Load TTL functions ...");
|
log.info("Load TTL functions ...");
|
||||||
loadSql(conn, LOAD_TTL_FUNCTIONS_SQL);
|
loadSql(conn, "2.4.3", LOAD_TTL_FUNCTIONS_SQL);
|
||||||
log.info("Load Drop Partitions functions ...");
|
log.info("Load Drop Partitions functions ...");
|
||||||
loadSql(conn, LOAD_DROP_PARTITIONS_FUNCTIONS_SQL);
|
loadSql(conn, "2.4.3", LOAD_DROP_PARTITIONS_FUNCTIONS_SQL);
|
||||||
|
|
||||||
executeQuery(conn, "UPDATE tb_schema_settings SET schema_version = 2005000");
|
executeQuery(conn, "UPDATE tb_schema_settings SET schema_version = 2005000");
|
||||||
|
|
||||||
@ -198,7 +198,13 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe
|
|||||||
case "2.5.4":
|
case "2.5.4":
|
||||||
try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) {
|
try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) {
|
||||||
log.info("Load Drop Partitions functions ...");
|
log.info("Load Drop Partitions functions ...");
|
||||||
loadSql(conn, LOAD_DROP_PARTITIONS_FUNCTIONS_SQL);
|
loadSql(conn, "2.4.3", LOAD_DROP_PARTITIONS_FUNCTIONS_SQL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "2.5.5":
|
||||||
|
try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) {
|
||||||
|
log.info("Load TTL functions ...");
|
||||||
|
loadSql(conn, "2.6.0", LOAD_TTL_FUNCTIONS_SQL);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -236,8 +242,8 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void loadSql(Connection conn, String fileName) {
|
protected void loadSql(Connection conn, String version, String fileName) {
|
||||||
Path schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "2.4.3", fileName);
|
Path schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", version, fileName);
|
||||||
try {
|
try {
|
||||||
loadFunctions(schemaUpdateFile, conn);
|
loadFunctions(schemaUpdateFile, conn);
|
||||||
log.info("Functions successfully loaded!");
|
log.info("Functions successfully loaded!");
|
||||||
|
|||||||
@ -233,7 +233,7 @@ public class SqlDatabaseUpgradeService implements DatabaseEntitiesUpgradeService
|
|||||||
log.info("Schema updated.");
|
log.info("Schema updated.");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "2.5.0":
|
case "2.5.5":
|
||||||
try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) {
|
try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) {
|
||||||
log.info("Updating schema ...");
|
log.info("Updating schema ...");
|
||||||
schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "2.6.0", SCHEMA_UPDATE_SQL);
|
schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "2.6.0", SCHEMA_UPDATE_SQL);
|
||||||
|
|||||||
@ -89,7 +89,7 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr
|
|||||||
log.info("PostgreSQL version is valid!");
|
log.info("PostgreSQL version is valid!");
|
||||||
if (isOldSchema(conn, 2004003)) {
|
if (isOldSchema(conn, 2004003)) {
|
||||||
log.info("Load upgrade functions ...");
|
log.info("Load upgrade functions ...");
|
||||||
loadSql(conn, LOAD_FUNCTIONS_SQL);
|
loadSql(conn, "2.4.3", LOAD_FUNCTIONS_SQL);
|
||||||
log.info("Updating timescale schema ...");
|
log.info("Updating timescale schema ...");
|
||||||
executeQuery(conn, CALL_CREATE_TS_KV_LATEST_TABLE);
|
executeQuery(conn, CALL_CREATE_TS_KV_LATEST_TABLE);
|
||||||
executeQuery(conn, CALL_CREATE_NEW_TENANT_TS_KV_TABLE);
|
executeQuery(conn, CALL_CREATE_NEW_TENANT_TS_KV_TABLE);
|
||||||
@ -165,7 +165,7 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr
|
|||||||
}
|
}
|
||||||
|
|
||||||
log.info("Load TTL functions ...");
|
log.info("Load TTL functions ...");
|
||||||
loadSql(conn, LOAD_TTL_FUNCTIONS_SQL);
|
loadSql(conn, "2.4.3", LOAD_TTL_FUNCTIONS_SQL);
|
||||||
|
|
||||||
executeQuery(conn, "UPDATE tb_schema_settings SET schema_version = 2005000");
|
executeQuery(conn, "UPDATE tb_schema_settings SET schema_version = 2005000");
|
||||||
log.info("schema timescale updated!");
|
log.info("schema timescale updated!");
|
||||||
@ -179,6 +179,8 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr
|
|||||||
break;
|
break;
|
||||||
case "2.5.4":
|
case "2.5.4":
|
||||||
break;
|
break;
|
||||||
|
case "2.5.5":
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw new RuntimeException("Unable to upgrade SQL database, unsupported fromVersion: " + fromVersion);
|
throw new RuntimeException("Unable to upgrade SQL database, unsupported fromVersion: " + fromVersion);
|
||||||
}
|
}
|
||||||
@ -200,8 +202,8 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void loadSql(Connection conn, String fileName) {
|
protected void loadSql(Connection conn, String version, String fileName) {
|
||||||
Path schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "2.4.3", fileName);
|
Path schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", version, fileName);
|
||||||
try {
|
try {
|
||||||
loadFunctions(schemaUpdateFile, conn);
|
loadFunctions(schemaUpdateFile, conn);
|
||||||
log.info("Functions successfully loaded!");
|
log.info("Functions successfully loaded!");
|
||||||
|
|||||||
@ -157,6 +157,8 @@ public class CassandraDbHelper {
|
|||||||
str = new Float(row.getFloat(index)).toString();
|
str = new Float(row.getFloat(index)).toString();
|
||||||
} else if (type == DataType.timestamp()) {
|
} else if (type == DataType.timestamp()) {
|
||||||
str = ""+row.getTimestamp(index).getTime();
|
str = ""+row.getTimestamp(index).getTime();
|
||||||
|
} else if (type == DataType.cboolean()) {
|
||||||
|
str = ""+ row.getBool(index);
|
||||||
} else {
|
} else {
|
||||||
str = row.getString(index);
|
str = row.getString(index);
|
||||||
}
|
}
|
||||||
@ -205,6 +207,8 @@ public class CassandraDbHelper {
|
|||||||
boundStatement.setFloat(column, Float.valueOf(value));
|
boundStatement.setFloat(column, Float.valueOf(value));
|
||||||
} else if (type == DataType.timestamp()) {
|
} else if (type == DataType.timestamp()) {
|
||||||
boundStatement.setTimestamp(column, new Date(Long.valueOf(value)));
|
boundStatement.setTimestamp(column, new Date(Long.valueOf(value)));
|
||||||
|
} else if (type == DataType.cboolean()) {
|
||||||
|
boundStatement.setBool(column, Boolean.valueOf(value));
|
||||||
} else {
|
} else {
|
||||||
boundStatement.setString(column, value);
|
boundStatement.setString(column, value);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,9 +19,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.context.annotation.Profile;
|
import org.springframework.context.annotation.Profile;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.server.common.data.SearchTextBased;
|
|
||||||
import org.thingsboard.server.common.data.Tenant;
|
import org.thingsboard.server.common.data.Tenant;
|
||||||
import org.thingsboard.server.common.data.id.UUIDBased;
|
|
||||||
import org.thingsboard.server.common.data.page.TextPageData;
|
import org.thingsboard.server.common.data.page.TextPageData;
|
||||||
import org.thingsboard.server.common.data.page.TextPageLink;
|
import org.thingsboard.server.common.data.page.TextPageLink;
|
||||||
import org.thingsboard.server.common.data.rule.RuleChain;
|
import org.thingsboard.server.common.data.rule.RuleChain;
|
||||||
@ -50,6 +48,10 @@ public class DefaultDataUpdateService implements DataUpdateService {
|
|||||||
log.info("Updating data from version 1.4.0 to 2.0.0 ...");
|
log.info("Updating data from version 1.4.0 to 2.0.0 ...");
|
||||||
tenantsDefaultRuleChainUpdater.updateEntities(null);
|
tenantsDefaultRuleChainUpdater.updateEntities(null);
|
||||||
break;
|
break;
|
||||||
|
case "2.5.5":
|
||||||
|
log.info("Updating data from version 2.5.5 to 2.6.0 ...");
|
||||||
|
tenantsDefaultEdgeRuleChainUpdater.updateEntities(null);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw new RuntimeException("Unable to update data, unsupported fromVersion: " + fromVersion);
|
throw new RuntimeException("Unable to update data, unsupported fromVersion: " + fromVersion);
|
||||||
}
|
}
|
||||||
@ -76,4 +78,24 @@ public class DefaultDataUpdateService implements DataUpdateService {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private PaginatedUpdater<String, Tenant> tenantsDefaultEdgeRuleChainUpdater =
|
||||||
|
new PaginatedUpdater<String, Tenant>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected TextPageData<Tenant> findEntities(String region, TextPageLink pageLink) {
|
||||||
|
return tenantService.findTenants(pageLink);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void updateEntity(Tenant tenant) {
|
||||||
|
try {
|
||||||
|
RuleChain defaultEdgeRuleChain = ruleChainService.getDefaultRootEdgeRuleChain(tenant.getId());
|
||||||
|
if (defaultEdgeRuleChain == null) {
|
||||||
|
installScripts.createDefaultEdgeRuleChains(tenant.getId());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Unable to update Tenant", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
@ -27,7 +27,6 @@ import com.google.common.util.concurrent.MoreExecutors;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.thingsboard.server.common.data.Device;
|
|
||||||
import org.thingsboard.server.common.data.EntitySubtype;
|
import org.thingsboard.server.common.data.EntitySubtype;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.edge.Edge;
|
import org.thingsboard.server.common.data.edge.Edge;
|
||||||
@ -57,8 +56,8 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.in;
|
|||||||
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
|
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME;
|
import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_CUSTOMER_BY_TYPE_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME;
|
import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_CUSTOMER_BY_TYPE_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME;
|
||||||
|
import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_ROUTING_KEY_VIEW_NAME;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_TENANT_AND_NAME_VIEW_NAME;
|
import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_TENANT_AND_NAME_VIEW_NAME;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_TENANT_AND_ROUTING_KEY_VIEW_NAME;
|
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME;
|
import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_TENANT_BY_TYPE_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME;
|
import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_TENANT_BY_TYPE_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.EDGE_COLUMN_FAMILY_NAME;
|
import static org.thingsboard.server.dao.model.ModelConstants.EDGE_COLUMN_FAMILY_NAME;
|
||||||
@ -203,9 +202,8 @@ public class CassandraEdgeDao extends CassandraAbstractSearchTextDao<EdgeEntity,
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<Edge> findByRoutingKey(UUID tenantId, String routingKey) {
|
public Optional<Edge> findByRoutingKey(UUID tenantId, String routingKey) {
|
||||||
Select select = select().from(EDGE_BY_TENANT_AND_ROUTING_KEY_VIEW_NAME);
|
Select select = select().from(EDGE_BY_ROUTING_KEY_VIEW_NAME);
|
||||||
Select.Where query = select.where();
|
Select.Where query = select.where();
|
||||||
query.and(eq(EDGE_TENANT_ID_PROPERTY, tenantId));
|
|
||||||
query.and(eq(EDGE_ROUTING_KEY_PROPERTY, routingKey));
|
query.and(eq(EDGE_ROUTING_KEY_PROPERTY, routingKey));
|
||||||
return Optional.ofNullable(DaoUtil.getData(findOneByStatement(new TenantId(tenantId), query)));
|
return Optional.ofNullable(DaoUtil.getData(findOneByStatement(new TenantId(tenantId), query)));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -373,7 +373,7 @@ public class ModelConstants {
|
|||||||
public static final String EDGE_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME = "edge_by_customer_and_search_text";
|
public static final String EDGE_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME = "edge_by_customer_and_search_text";
|
||||||
public static final String EDGE_BY_CUSTOMER_BY_TYPE_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME = "edge_by_customer_by_type_and_search_text";
|
public static final String EDGE_BY_CUSTOMER_BY_TYPE_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME = "edge_by_customer_by_type_and_search_text";
|
||||||
public static final String EDGE_BY_TENANT_AND_NAME_VIEW_NAME = "edge_by_tenant_and_name";
|
public static final String EDGE_BY_TENANT_AND_NAME_VIEW_NAME = "edge_by_tenant_and_name";
|
||||||
public static final String EDGE_BY_TENANT_AND_ROUTING_KEY_VIEW_NAME = "edge_by_tenant_and_routing_key";
|
public static final String EDGE_BY_ROUTING_KEY_VIEW_NAME = "edge_by_routing_key";
|
||||||
|
|
||||||
public static final String EDGE_ROUTING_KEY_PROPERTY = "routing_key";
|
public static final String EDGE_ROUTING_KEY_PROPERTY = "routing_key";
|
||||||
public static final String EDGE_SECRET_PROPERTY = "secret";
|
public static final String EDGE_SECRET_PROPERTY = "secret";
|
||||||
|
|||||||
@ -22,9 +22,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.edge.Edge;
|
|
||||||
import org.thingsboard.server.common.data.id.EdgeId;
|
import org.thingsboard.server.common.data.id.EdgeId;
|
||||||
import org.thingsboard.server.common.data.id.RuleChainId;
|
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.common.data.page.TextPageLink;
|
import org.thingsboard.server.common.data.page.TextPageLink;
|
||||||
import org.thingsboard.server.common.data.page.TimePageLink;
|
import org.thingsboard.server.common.data.page.TimePageLink;
|
||||||
@ -45,8 +43,6 @@ import java.util.List;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
|
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.DEVICE_TENANT_ID_PROPERTY;
|
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.DEVICE_TYPE_PROPERTY;
|
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.RULE_CHAIN_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME;
|
import static org.thingsboard.server.dao.model.ModelConstants.RULE_CHAIN_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.RULE_CHAIN_BY_TENANT_BY_TYPE_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME;
|
import static org.thingsboard.server.dao.model.ModelConstants.RULE_CHAIN_BY_TENANT_BY_TYPE_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.RULE_CHAIN_COLUMN_FAMILY_NAME;
|
import static org.thingsboard.server.dao.model.ModelConstants.RULE_CHAIN_COLUMN_FAMILY_NAME;
|
||||||
|
|||||||
@ -749,12 +749,12 @@ CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_tenant_and_name AS
|
|||||||
PRIMARY KEY ( tenant_id, name, id, customer_id, type)
|
PRIMARY KEY ( tenant_id, name, id, customer_id, type)
|
||||||
WITH CLUSTERING ORDER BY ( name ASC, id DESC, customer_id DESC);
|
WITH CLUSTERING ORDER BY ( name ASC, id DESC, customer_id DESC);
|
||||||
|
|
||||||
CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_tenant_and_routing_key AS
|
CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_routing_key AS
|
||||||
SELECT *
|
SELECT *
|
||||||
from thingsboard.edge
|
from thingsboard.edge
|
||||||
WHERE tenant_id IS NOT NULL AND customer_id IS NOT NULL AND type IS NOT NULL AND routing_key IS NOT NULL AND id IS NOT NULL
|
WHERE tenant_id IS NOT NULL AND customer_id IS NOT NULL AND type IS NOT NULL AND routing_key IS NOT NULL AND id IS NOT NULL
|
||||||
PRIMARY KEY ( tenant_id, routing_key, id, customer_id, type)
|
PRIMARY KEY ( routing_key, tenant_id, id, customer_id, type)
|
||||||
WITH CLUSTERING ORDER BY ( routing_key ASC, id DESC, customer_id DESC);
|
WITH CLUSTERING ORDER BY ( tenant_id DESC, id DESC, customer_id DESC);
|
||||||
|
|
||||||
CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_tenant_and_search_text AS
|
CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_tenant_and_search_text AS
|
||||||
SELECT *
|
SELECT *
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user