Commit f7f06a22978e7515c9657a3f23e93b0d13f85468

Authored by AndrewVolosytnykhThingsboard
Committed by Andrew Shvayka
1 parent d5658d5b

Improvement of solution: README.md cleaned, build plugin fixed, some code cleaning

@@ -70,7 +70,7 @@ @@ -70,7 +70,7 @@
70 <plugins> 70 <plugins>
71 <plugin> 71 <plugin>
72 <artifactId>maven-assembly-plugin</artifactId> 72 <artifactId>maven-assembly-plugin</artifactId>
73 - <configuration> 73 + <configuration combine.self="override">
74 <archive> 74 <archive>
75 <manifest> 75 <manifest>
76 <mainClass>org.thingsboard.client.tools.migrator.MigratorTool</mainClass> 76 <mainClass>org.thingsboard.client.tools.migrator.MigratorTool</mainClass>
@@ -43,7 +43,6 @@ public class PgCaMigrator { @@ -43,7 +43,6 @@ public class PgCaMigrator {
43 private final long LOG_BATCH = 1000000; 43 private final long LOG_BATCH = 1000000;
44 private final long rowPerFile = 1000000; 44 private final long rowPerFile = 1000000;
45 45
46 - private long linesProcessed = 0;  
47 private long linesTsMigrated = 0; 46 private long linesTsMigrated = 0;
48 private long linesLatestMigrated = 0; 47 private long linesLatestMigrated = 0;
49 private long castErrors = 0; 48 private long castErrors = 0;
@@ -99,7 +98,7 @@ public class PgCaMigrator { @@ -99,7 +98,7 @@ public class PgCaMigrator {
99 System.out.println("START TO MIGRATE LATEST"); 98 System.out.println("START TO MIGRATE LATEST");
100 long start = System.currentTimeMillis(); 99 long start = System.currentTimeMillis();
101 processBlock(iterator, currentTsLatestWriter, outTsLatestDir, this::toValuesLatest); 100 processBlock(iterator, currentTsLatestWriter, outTsLatestDir, this::toValuesLatest);
102 - System.out.println("FORMING OF SSL FOR LATEST TS FINISHED WITH TIME: " + (System.currentTimeMillis() - start) + " ms."); 101 + System.out.println("TOTAL LINES MIGRATED: " + linesLatestMigrated + ", FORMING OF SSL FOR LATEST TS FINISHED WITH TIME: " + (System.currentTimeMillis() - start) + " ms.");
103 isLatestDone = true; 102 isLatestDone = true;
104 } 103 }
105 104
@@ -107,7 +106,7 @@ public class PgCaMigrator { @@ -107,7 +106,7 @@ public class PgCaMigrator {
107 System.out.println("START TO MIGRATE TS"); 106 System.out.println("START TO MIGRATE TS");
108 long start = System.currentTimeMillis(); 107 long start = System.currentTimeMillis();
109 processBlock(iterator, currentTsWriter, outTsDir, this::toValuesTs); 108 processBlock(iterator, currentTsWriter, outTsDir, this::toValuesTs);
110 - System.out.println("FORMING OF SSL FOR TS FINISHED WITH TIME: " + (System.currentTimeMillis() - start) + " ms."); 109 + System.out.println("TOTAL LINES MIGRATED: " + linesTsMigrated + ", FORMING OF SSL FOR TS FINISHED WITH TIME: " + (System.currentTimeMillis() - start) + " ms.");
111 isTsDone = true; 110 isTsDone = true;
112 } 111 }
113 } 112 }
@@ -212,7 +211,7 @@ public class PgCaMigrator { @@ -212,7 +211,7 @@ public class PgCaMigrator {
212 211
213 private void processBlock(LineIterator iterator, CQLSSTableWriter writer, File outDir, Function<List<String>, List<Object>> function) { 212 private void processBlock(LineIterator iterator, CQLSSTableWriter writer, File outDir, Function<List<String>, List<Object>> function) {
214 String currentLine; 213 String currentLine;
215 - linesProcessed = 0; 214 + long linesProcessed = 0;
216 while(iterator.hasNext()) { 215 while(iterator.hasNext()) {
217 logLinesProcessed(linesProcessed++); 216 logLinesProcessed(linesProcessed++);
218 currentLine = iterator.nextLine(); 217 currentLine = iterator.nextLine();
@@ -23,7 +23,7 @@ It will generate single jar file with all required dependencies inside `target d @@ -23,7 +23,7 @@ It will generate single jar file with all required dependencies inside `target d
23 23
24 1. Dump related tables that need to correct save telemetry 24 1. Dump related tables that need to correct save telemetry
25 25
26 - `pg_dump -h localhost -U postgres -d thingsboard -t tenant -t customer -t user -t dashboard -t asset -t device -t alarm -t rule_chain -t rule_node -t entity_view -t widgets_bundle -t widget_type -t tenant_profile -t device_profile -t api_usage_state -t tb_user > related_entities.dmp` 26 + `pg_dump -h localhost -U postgres -d thingsboard -T admin_settings -T attribute_kv -T audit_log -T component_discriptor -T device_credentials -T event -T oauth2_client_registration -T oauth2_client_registration_info -T oauth2_client_registration_template -T relation -T rule_node_state tb_schema_settings -T user_credentials > related_entities.dmp`
27 27
28 2. Dump `ts_kv` and child: 28 2. Dump `ts_kv` and child:
29 29
@@ -47,12 +47,12 @@ Create 3 empty directories. For example: @@ -47,12 +47,12 @@ Create 3 empty directories. For example:
47 **Note: if you run this tool on remote instance - don't forget to execute this command in `screen` to avoid unexpected termination* 47 **Note: if you run this tool on remote instance - don't forget to execute this command in `screen` to avoid unexpected termination*
48 48
49 ``` 49 ```
50 -java -jar ./tools-2.4.1-SNAPSHOT-jar-with-dependencies.jar 50 +java -jar ./tools-3.2.2-SNAPSHOT-jar-with-dependencies.jar
51 -telemetryFrom /home/user/dump/ts_kv_all.dmp 51 -telemetryFrom /home/user/dump/ts_kv_all.dmp
52 - -relatedEntities /home/user/dump/relatedEntities.dmp  
53 - -latestOut /home/ubunut/migration/ts_latest  
54 - -tsOut /home/ubunut/migration/ts  
55 - -partitionsOut /home/ubunut/migration/ts_partition 52 + -relatedEntities /home/user/dump/related_entities.dmp
  53 + -latestOut /home/user/migration/ts_latest
  54 + -tsOut /home/user/migration/ts
  55 + -partitionsOut /home/user/migration/ts_partition
56 -castEnable false 56 -castEnable false
57 ``` 57 ```
58 *Use your paths for program arguments* 58 *Use your paths for program arguments*
@@ -63,7 +63,7 @@ Tool execution time depends on DB size, CPU resources and Disk throughput @@ -63,7 +63,7 @@ Tool execution time depends on DB size, CPU resources and Disk throughput
63 * Note that this this part works only for single node Cassandra Cluster. If you have more nodes - it is better to use `sstableloader` tool. 63 * Note that this this part works only for single node Cassandra Cluster. If you have more nodes - it is better to use `sstableloader` tool.
64 64
65 1. [Optional] install Cassandra on the instance 65 1. [Optional] install Cassandra on the instance
66 -2. [Optional] Using `cqlsh` create `thingsboard` keyspace and requred tables from this file `schema-ts.cql` 66 +2. [Optional] Using `cqlsh` create `thingsboard` keyspace and requred tables from this files `schema-ts.cql` and `schema-ts-latest.cql` using `source` command
67 3. Stop Cassandra 67 3. Stop Cassandra
68 4. Look at `/var/lib/cassandra/data/thingsboard` and check for names of data folders 68 4. Look at `/var/lib/cassandra/data/thingsboard` and check for names of data folders
69 5. Copy generated SSTable files into cassandra data dir using next command: 69 5. Copy generated SSTable files into cassandra data dir using next command:
@@ -27,6 +27,24 @@ import java.util.Map; @@ -27,6 +27,24 @@ import java.util.Map;
27 27
28 public class RelatedEntitiesParser { 28 public class RelatedEntitiesParser {
29 private final Map<String, String> allEntityIdsAndTypes = new HashMap<>(); 29 private final Map<String, String> allEntityIdsAndTypes = new HashMap<>();
  30 +
  31 + private final Map<String, EntityType> tableNameAndEntityType = Map.ofEntries(
  32 + Map.entry("COPY public.alarm ", EntityType.ALARM),
  33 + Map.entry("COPY public.asset ", EntityType.ASSET),
  34 + Map.entry("COPY public.customer ", EntityType.CUSTOMER),
  35 + Map.entry("COPY public.dashboard ", EntityType.DASHBOARD),
  36 + Map.entry("COPY public.device ", EntityType.DEVICE),
  37 + Map.entry("COPY public.rule_chain ", EntityType.RULE_CHAIN),
  38 + Map.entry("COPY public.rule_node ", EntityType.RULE_NODE),
  39 + Map.entry("COPY public.tenant ", EntityType.TENANT),
  40 + Map.entry("COPY public.tb_user ", EntityType.USER),
  41 + Map.entry("COPY public.entity_view ", EntityType.ENTITY_VIEW),
  42 + Map.entry("COPY public.widgets_bundle ", EntityType.WIDGETS_BUNDLE),
  43 + Map.entry("COPY public.widget_type ", EntityType.WIDGET_TYPE),
  44 + Map.entry("COPY public.tenant_profile ", EntityType.TENANT_PROFILE),
  45 + Map.entry("COPY public.device_profile ", EntityType.DEVICE_PROFILE),
  46 + Map.entry("COPY public.api_usage_state ", EntityType.API_USAGE_STATE)
  47 + );
30 48
31 public RelatedEntitiesParser(File source) throws IOException { 49 public RelatedEntitiesParser(File source) throws IOException {
32 processAllTables(FileUtils.lineIterator(source)); 50 processAllTables(FileUtils.lineIterator(source));
@@ -45,36 +63,10 @@ public class RelatedEntitiesParser { @@ -45,36 +63,10 @@ public class RelatedEntitiesParser {
45 try { 63 try {
46 while (lineIterator.hasNext()) { 64 while (lineIterator.hasNext()) {
47 currentLine = lineIterator.nextLine(); 65 currentLine = lineIterator.nextLine();
48 - if (currentLine.startsWith("COPY public.alarm")) {  
49 - processBlock(lineIterator, EntityType.ALARM);  
50 - } else if (currentLine.startsWith("COPY public.asset")) {  
51 - processBlock(lineIterator, EntityType.ASSET);  
52 - } else if (currentLine.startsWith("COPY public.customer")) {  
53 - processBlock(lineIterator, EntityType.CUSTOMER);  
54 - } else if (currentLine.startsWith("COPY public.dashboard")) {  
55 - processBlock(lineIterator, EntityType.DASHBOARD);  
56 - } else if (currentLine.startsWith("COPY public.device")) {  
57 - processBlock(lineIterator, EntityType.DEVICE);  
58 - } else if (currentLine.startsWith("COPY public.rule_chain")) {  
59 - processBlock(lineIterator, EntityType.RULE_CHAIN);  
60 - } else if (currentLine.startsWith("COPY public.rule_node")) {  
61 - processBlock(lineIterator, EntityType.RULE_NODE);  
62 - } else if (currentLine.startsWith("COPY public.tenant")) {  
63 - processBlock(lineIterator, EntityType.TENANT);  
64 - } else if (currentLine.startsWith("COPY public.tb_user")) {  
65 - processBlock(lineIterator, EntityType.USER);  
66 - } else if (currentLine.startsWith("COPY public.entity_view")) {  
67 - processBlock(lineIterator, EntityType.ENTITY_VIEW);  
68 - } else if (currentLine.startsWith("COPY public.widgets_bundle")) {  
69 - processBlock(lineIterator, EntityType.WIDGETS_BUNDLE);  
70 - } else if (currentLine.startsWith("COPY public.widget_type")) {  
71 - processBlock(lineIterator, EntityType.WIDGET_TYPE);  
72 - } else if (currentLine.startsWith("COPY public.tenant_profile")) {  
73 - processBlock(lineIterator, EntityType.TENANT_PROFILE);  
74 - } else if (currentLine.startsWith("COPY public.device_profile")) {  
75 - processBlock(lineIterator, EntityType.DEVICE_PROFILE);  
76 - } else if (currentLine.startsWith("COPY public.api_usage_state")) {  
77 - processBlock(lineIterator, EntityType.API_USAGE_STATE); 66 + for(Map.Entry<String, EntityType> entry : tableNameAndEntityType.entrySet()) {
  67 + if(currentLine.startsWith(entry.getKey())) {
  68 + processBlock(lineIterator, entry.getValue());
  69 + }
78 } 70 }
79 } 71 }
80 } finally { 72 } finally {