Commit 80b850add88c4e08973103610deec3f27b959952

Authored by Igor Kulikov
2 parents b5444e6c 35626766

Merge branch 'master' of github.com:thingsboard/thingsboard

@@ -437,6 +437,7 @@ public class SqlDatabaseUpgradeService implements DatabaseEntitiesUpgradeService @@ -437,6 +437,7 @@ public class SqlDatabaseUpgradeService implements DatabaseEntitiesUpgradeService
437 case "3.2.1": 437 case "3.2.1":
438 try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) { 438 try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) {
439 log.info("Updating schema ..."); 439 log.info("Updating schema ...");
  440 + conn.createStatement().execute("CREATE INDEX IF NOT EXISTS idx_audit_log_tenant_id_and_created_time ON audit_log(tenant_id, created_time);");
440 schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "3.2.1", SCHEMA_UPDATE_SQL); 441 schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "3.2.1", SCHEMA_UPDATE_SQL);
441 loadSql(schemaUpdateFile, conn); 442 loadSql(schemaUpdateFile, conn);
442 conn.createStatement().execute("UPDATE tb_schema_settings SET schema_version = 3002002;"); 443 conn.createStatement().execute("UPDATE tb_schema_settings SET schema_version = 3002002;");
@@ -22,9 +22,7 @@ import com.google.common.util.concurrent.ListenableFuture; @@ -22,9 +22,7 @@ import com.google.common.util.concurrent.ListenableFuture;
22 import lombok.extern.slf4j.Slf4j; 22 import lombok.extern.slf4j.Slf4j;
23 import org.checkerframework.checker.nullness.qual.Nullable; 23 import org.checkerframework.checker.nullness.qual.Nullable;
24 import org.springframework.beans.factory.annotation.Autowired; 24 import org.springframework.beans.factory.annotation.Autowired;
25 -import org.springframework.context.event.EventListener;  
26 import org.springframework.stereotype.Service; 25 import org.springframework.stereotype.Service;
27 -import org.thingsboard.common.util.ThingsBoardThreadFactory;  
28 import org.thingsboard.server.common.data.alarm.Alarm; 26 import org.thingsboard.server.common.data.alarm.Alarm;
29 import org.thingsboard.server.common.data.alarm.AlarmInfo; 27 import org.thingsboard.server.common.data.alarm.AlarmInfo;
30 import org.thingsboard.server.common.data.alarm.AlarmQuery; 28 import org.thingsboard.server.common.data.alarm.AlarmQuery;
@@ -35,43 +33,22 @@ import org.thingsboard.server.common.data.id.AlarmId; @@ -35,43 +33,22 @@ import org.thingsboard.server.common.data.id.AlarmId;
35 import org.thingsboard.server.common.data.id.CustomerId; 33 import org.thingsboard.server.common.data.id.CustomerId;
36 import org.thingsboard.server.common.data.id.EntityId; 34 import org.thingsboard.server.common.data.id.EntityId;
37 import org.thingsboard.server.common.data.id.TenantId; 35 import org.thingsboard.server.common.data.id.TenantId;
38 -import org.thingsboard.server.common.data.kv.AttributeKvEntry;  
39 -import org.thingsboard.server.common.data.kv.BaseAttributeKvEntry;  
40 -import org.thingsboard.server.common.data.kv.BooleanDataEntry;  
41 -import org.thingsboard.server.common.data.kv.DoubleDataEntry;  
42 -import org.thingsboard.server.common.data.kv.LongDataEntry;  
43 -import org.thingsboard.server.common.data.kv.StringDataEntry;  
44 -import org.thingsboard.server.common.data.kv.TsKvEntry;  
45 import org.thingsboard.server.common.data.page.PageData; 36 import org.thingsboard.server.common.data.page.PageData;
46 import org.thingsboard.server.common.data.query.AlarmData; 37 import org.thingsboard.server.common.data.query.AlarmData;
47 -import org.thingsboard.server.common.data.query.AlarmDataPageLink;  
48 import org.thingsboard.server.common.data.query.AlarmDataQuery; 38 import org.thingsboard.server.common.data.query.AlarmDataQuery;
49 import org.thingsboard.server.common.msg.queue.ServiceType; 39 import org.thingsboard.server.common.msg.queue.ServiceType;
50 import org.thingsboard.server.common.msg.queue.TbCallback; 40 import org.thingsboard.server.common.msg.queue.TbCallback;
51 import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; 41 import org.thingsboard.server.common.msg.queue.TopicPartitionInfo;
52 import org.thingsboard.server.dao.alarm.AlarmOperationResult; 42 import org.thingsboard.server.dao.alarm.AlarmOperationResult;
53 import org.thingsboard.server.dao.alarm.AlarmService; 43 import org.thingsboard.server.dao.alarm.AlarmService;
54 -import org.thingsboard.server.dao.attributes.AttributesService;  
55 -import org.thingsboard.server.dao.timeseries.TimeseriesService;  
56 import org.thingsboard.server.gen.transport.TransportProtos; 44 import org.thingsboard.server.gen.transport.TransportProtos;
57 -import org.thingsboard.server.queue.discovery.PartitionChangeEvent;  
58 import org.thingsboard.server.queue.discovery.PartitionService; 45 import org.thingsboard.server.queue.discovery.PartitionService;
59 import org.thingsboard.server.service.queue.TbClusterService; 46 import org.thingsboard.server.service.queue.TbClusterService;
60 import org.thingsboard.server.service.subscription.SubscriptionManagerService; 47 import org.thingsboard.server.service.subscription.SubscriptionManagerService;
61 import org.thingsboard.server.service.subscription.TbSubscriptionUtils; 48 import org.thingsboard.server.service.subscription.TbSubscriptionUtils;
62 -import org.thingsboard.server.service.telemetry.sub.AlarmSubscriptionUpdate;  
63 49
64 -import javax.annotation.PostConstruct;  
65 -import javax.annotation.PreDestroy;  
66 import java.util.Collection; 50 import java.util.Collection;
67 -import java.util.Collections;  
68 -import java.util.List;  
69 import java.util.Optional; 51 import java.util.Optional;
70 -import java.util.Set;  
71 -import java.util.concurrent.ConcurrentHashMap;  
72 -import java.util.concurrent.ExecutorService;  
73 -import java.util.concurrent.Executors;  
74 -import java.util.function.Consumer;  
75 52
76 /** 53 /**
77 * Created by ashvayka on 27.03.18. 54 * Created by ashvayka on 27.03.18.
@@ -124,9 +101,15 @@ public class DefaultAlarmSubscriptionService extends AbstractSubscriptionService @@ -124,9 +101,15 @@ public class DefaultAlarmSubscriptionService extends AbstractSubscriptionService
124 101
125 @Override 102 @Override
126 public ListenableFuture<Boolean> clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs) { 103 public ListenableFuture<Boolean> clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs) {
  104 + ListenableFuture<AlarmOperationResult> result = clearAlarmForResult(tenantId, alarmId, details, clearTs);
  105 + return Futures.transform(result, AlarmOperationResult::isSuccessful, wsCallBackExecutor);
  106 + }
  107 +
  108 + @Override
  109 + public ListenableFuture<AlarmOperationResult> clearAlarmForResult(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs) {
127 ListenableFuture<AlarmOperationResult> result = alarmService.clearAlarm(tenantId, alarmId, details, clearTs); 110 ListenableFuture<AlarmOperationResult> result = alarmService.clearAlarm(tenantId, alarmId, details, clearTs);
128 Futures.addCallback(result, new AlarmUpdateCallback(), wsCallBackExecutor); 111 Futures.addCallback(result, new AlarmUpdateCallback(), wsCallBackExecutor);
129 - return Futures.transform(result, AlarmOperationResult::isSuccessful, wsCallBackExecutor); 112 + return result;
130 } 113 }
131 114
132 @Override 115 @Override
@@ -15,7 +15,6 @@ @@ -15,7 +15,6 @@
15 */ 15 */
16 package org.thingsboard.server.dao.alarm; 16 package org.thingsboard.server.dao.alarm;
17 17
18 -import lombok.AllArgsConstructor;  
19 import lombok.Data; 18 import lombok.Data;
20 import org.thingsboard.server.common.data.alarm.Alarm; 19 import org.thingsboard.server.common.data.alarm.Alarm;
21 import org.thingsboard.server.common.data.id.EntityId; 20 import org.thingsboard.server.common.data.id.EntityId;
@@ -43,3 +43,5 @@ CREATE INDEX IF NOT EXISTS idx_asset_customer_id_and_type ON asset(tenant_id, cu @@ -43,3 +43,5 @@ CREATE INDEX IF NOT EXISTS idx_asset_customer_id_and_type ON asset(tenant_id, cu
43 CREATE INDEX IF NOT EXISTS idx_asset_type ON asset(tenant_id, type); 43 CREATE INDEX IF NOT EXISTS idx_asset_type ON asset(tenant_id, type);
44 44
45 CREATE INDEX IF NOT EXISTS idx_attribute_kv_by_key_and_last_update_ts ON attribute_kv(entity_id, attribute_key, last_update_ts desc); 45 CREATE INDEX IF NOT EXISTS idx_attribute_kv_by_key_and_last_update_ts ON attribute_kv(entity_id, attribute_key, last_update_ts desc);
  46 +
  47 +CREATE INDEX IF NOT EXISTS idx_audit_log_tenant_id_and_created_time ON audit_log(tenant_id, created_time);
@@ -16,7 +16,6 @@ @@ -16,7 +16,6 @@
16 package org.thingsboard.rule.engine.api; 16 package org.thingsboard.rule.engine.api;
17 17
18 import com.fasterxml.jackson.databind.JsonNode; 18 import com.fasterxml.jackson.databind.JsonNode;
19 -import com.google.common.util.concurrent.FutureCallback;  
20 import com.google.common.util.concurrent.ListenableFuture; 19 import com.google.common.util.concurrent.ListenableFuture;
21 import org.thingsboard.server.common.data.alarm.Alarm; 20 import org.thingsboard.server.common.data.alarm.Alarm;
22 import org.thingsboard.server.common.data.alarm.AlarmInfo; 21 import org.thingsboard.server.common.data.alarm.AlarmInfo;
@@ -28,15 +27,12 @@ import org.thingsboard.server.common.data.id.AlarmId; @@ -28,15 +27,12 @@ import org.thingsboard.server.common.data.id.AlarmId;
28 import org.thingsboard.server.common.data.id.CustomerId; 27 import org.thingsboard.server.common.data.id.CustomerId;
29 import org.thingsboard.server.common.data.id.EntityId; 28 import org.thingsboard.server.common.data.id.EntityId;
30 import org.thingsboard.server.common.data.id.TenantId; 29 import org.thingsboard.server.common.data.id.TenantId;
31 -import org.thingsboard.server.common.data.kv.AttributeKvEntry;  
32 -import org.thingsboard.server.common.data.kv.TsKvEntry;  
33 import org.thingsboard.server.common.data.page.PageData; 30 import org.thingsboard.server.common.data.page.PageData;
34 import org.thingsboard.server.common.data.query.AlarmData; 31 import org.thingsboard.server.common.data.query.AlarmData;
35 -import org.thingsboard.server.common.data.query.AlarmDataPageLink;  
36 import org.thingsboard.server.common.data.query.AlarmDataQuery; 32 import org.thingsboard.server.common.data.query.AlarmDataQuery;
  33 +import org.thingsboard.server.dao.alarm.AlarmOperationResult;
37 34
38 import java.util.Collection; 35 import java.util.Collection;
39 -import java.util.List;  
40 36
41 /** 37 /**
42 * Created by ashvayka on 02.04.18. 38 * Created by ashvayka on 02.04.18.
@@ -51,6 +47,8 @@ public interface RuleEngineAlarmService { @@ -51,6 +47,8 @@ public interface RuleEngineAlarmService {
51 47
52 ListenableFuture<Boolean> clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs); 48 ListenableFuture<Boolean> clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs);
53 49
  50 + ListenableFuture<AlarmOperationResult> clearAlarmForResult(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs);
  51 +
54 ListenableFuture<Alarm> findAlarmByIdAsync(TenantId tenantId, AlarmId alarmId); 52 ListenableFuture<Alarm> findAlarmByIdAsync(TenantId tenantId, AlarmId alarmId);
55 53
56 ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type); 54 ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type);
@@ -17,28 +17,26 @@ package org.thingsboard.rule.engine.profile; @@ -17,28 +17,26 @@ package org.thingsboard.rule.engine.profile;
17 17
18 import com.fasterxml.jackson.databind.JsonNode; 18 import com.fasterxml.jackson.databind.JsonNode;
19 import com.fasterxml.jackson.databind.node.ObjectNode; 19 import com.fasterxml.jackson.databind.node.ObjectNode;
  20 +import com.google.common.util.concurrent.ListenableFuture;
20 import lombok.Data; 21 import lombok.Data;
21 import lombok.extern.slf4j.Slf4j; 22 import lombok.extern.slf4j.Slf4j;
22 import org.apache.commons.lang3.StringUtils; 23 import org.apache.commons.lang3.StringUtils;
  24 +import org.thingsboard.common.util.DonAsynchron;
23 import org.thingsboard.rule.engine.action.TbAlarmResult; 25 import org.thingsboard.rule.engine.action.TbAlarmResult;
24 import org.thingsboard.rule.engine.api.TbContext; 26 import org.thingsboard.rule.engine.api.TbContext;
25 import org.thingsboard.rule.engine.profile.state.PersistedAlarmRuleState; 27 import org.thingsboard.rule.engine.profile.state.PersistedAlarmRuleState;
26 import org.thingsboard.rule.engine.profile.state.PersistedAlarmState; 28 import org.thingsboard.rule.engine.profile.state.PersistedAlarmState;
27 import org.thingsboard.server.common.data.DataConstants; 29 import org.thingsboard.server.common.data.DataConstants;
28 -import org.thingsboard.server.common.data.Tenant;  
29 import org.thingsboard.server.common.data.alarm.Alarm; 30 import org.thingsboard.server.common.data.alarm.Alarm;
30 import org.thingsboard.server.common.data.alarm.AlarmSeverity; 31 import org.thingsboard.server.common.data.alarm.AlarmSeverity;
31 import org.thingsboard.server.common.data.alarm.AlarmStatus; 32 import org.thingsboard.server.common.data.alarm.AlarmStatus;
32 import org.thingsboard.server.common.data.device.profile.AlarmConditionKeyType; 33 import org.thingsboard.server.common.data.device.profile.AlarmConditionKeyType;
33 import org.thingsboard.server.common.data.device.profile.DeviceProfileAlarm; 34 import org.thingsboard.server.common.data.device.profile.DeviceProfileAlarm;
34 -import org.thingsboard.server.common.data.id.CustomerId;  
35 import org.thingsboard.server.common.data.id.EntityId; 35 import org.thingsboard.server.common.data.id.EntityId;
36 -import org.thingsboard.server.common.data.id.TenantId;  
37 -import org.thingsboard.server.common.data.query.EntityKeyType;  
38 -import org.thingsboard.server.common.data.query.KeyFilter;  
39 import org.thingsboard.server.common.msg.TbMsg; 36 import org.thingsboard.server.common.msg.TbMsg;
40 import org.thingsboard.server.common.msg.TbMsgMetaData; 37 import org.thingsboard.server.common.msg.TbMsgMetaData;
41 import org.thingsboard.server.common.msg.queue.ServiceQueue; 38 import org.thingsboard.server.common.msg.queue.ServiceQueue;
  39 +import org.thingsboard.server.dao.alarm.AlarmOperationResult;
42 import org.thingsboard.server.dao.util.mapping.JacksonUtil; 40 import org.thingsboard.server.dao.util.mapping.JacksonUtil;
43 41
44 import java.util.ArrayList; 42 import java.util.ArrayList;
@@ -118,8 +116,16 @@ class AlarmState { @@ -118,8 +116,16 @@ class AlarmState {
118 for (AlarmRuleState state : createRulesSortedBySeverityDesc) { 116 for (AlarmRuleState state : createRulesSortedBySeverityDesc) {
119 stateUpdate = clearAlarmState(stateUpdate, state); 117 stateUpdate = clearAlarmState(stateUpdate, state);
120 } 118 }
121 - ctx.getAlarmService().clearAlarm(ctx.getTenantId(), currentAlarm.getId(), createDetails(clearState), System.currentTimeMillis());  
122 - pushMsg(ctx, new TbAlarmResult(false, false, true, currentAlarm)); 119 + ListenableFuture<AlarmOperationResult> alarmClearOperationResult = ctx.getAlarmService().clearAlarmForResult(
  120 + ctx.getTenantId(), currentAlarm.getId(), createDetails(clearState), System.currentTimeMillis()
  121 + );
  122 + DonAsynchron.withCallback(alarmClearOperationResult,
  123 + result -> {
  124 + pushMsg(ctx, new TbAlarmResult(false, false, true, result.getAlarm()));
  125 + },
  126 + throwable -> {
  127 + throw new RuntimeException(throwable);
  128 + });
123 currentAlarm = null; 129 currentAlarm = null;
124 } else if (AlarmEvalResult.FALSE.equals(evalResult)) { 130 } else if (AlarmEvalResult.FALSE.equals(evalResult)) {
125 stateUpdate = clearAlarmState(stateUpdate, clearState); 131 stateUpdate = clearAlarmState(stateUpdate, clearState);