Fixed case when seqId started new cycle. Improved edge trace/debug logging (#12342)
* Fixed case when seqId started new cycle. Improved edge trace/debug logging * Edge downlink logging improved * Edge downlink logging improved #2
This commit is contained in:
		
							parent
							
								
									15d22e9e6b
								
							
						
					
					
						commit
						cf9204416b
					
				@ -349,7 +349,7 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i
 | 
				
			|||||||
    private void startSyncProcess(TenantId tenantId, EdgeId edgeId, UUID requestId, String requestServiceId) {
 | 
					    private void startSyncProcess(TenantId tenantId, EdgeId edgeId, UUID requestId, String requestServiceId) {
 | 
				
			||||||
        EdgeGrpcSession session = sessions.get(edgeId);
 | 
					        EdgeGrpcSession session = sessions.get(edgeId);
 | 
				
			||||||
        if (session != null) {
 | 
					        if (session != null) {
 | 
				
			||||||
            if (!session.isSyncCompleted()) {
 | 
					            if (session.isSyncInProgress()) {
 | 
				
			||||||
                clusterService.pushEdgeSyncResponseToCore(new FromEdgeSyncResponse(requestId, tenantId, edgeId, false, "Sync process is active at the moment"), requestServiceId);
 | 
					                clusterService.pushEdgeSyncResponseToCore(new FromEdgeSyncResponse(requestId, tenantId, edgeId, false, "Sync process is active at the moment"), requestServiceId);
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                boolean success = false;
 | 
					                boolean success = false;
 | 
				
			||||||
@ -368,7 +368,7 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        UUID requestId = request.getId();
 | 
					        UUID requestId = request.getId();
 | 
				
			||||||
        EdgeGrpcSession session = sessions.get(request.getEdgeId());
 | 
					        EdgeGrpcSession session = sessions.get(request.getEdgeId());
 | 
				
			||||||
        if (session != null && !session.isSyncCompleted()) {
 | 
					        if (session != null && session.isSyncInProgress()) {
 | 
				
			||||||
            responseConsumer.accept(new FromEdgeSyncResponse(requestId, request.getTenantId(), request.getEdgeId(), false, "Sync process is active at the moment"));
 | 
					            responseConsumer.accept(new FromEdgeSyncResponse(requestId, request.getTenantId(), request.getEdgeId(), false, "Sync process is active at the moment"));
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            log.trace("[{}][{}] Processing sync edge request [{}], serviceId [{}]", request.getTenantId(), request.getId(), request.getEdgeId(), request.getServiceId());
 | 
					            log.trace("[{}][{}] Processing sync edge request [{}], serviceId [{}]", request.getTenantId(), request.getId(), request.getEdgeId(), request.getServiceId());
 | 
				
			||||||
@ -411,7 +411,7 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i
 | 
				
			|||||||
                    newEventLock.lock();
 | 
					                    newEventLock.lock();
 | 
				
			||||||
                    try {
 | 
					                    try {
 | 
				
			||||||
                        if (Boolean.TRUE.equals(sessionNewEvents.get(edgeId))) {
 | 
					                        if (Boolean.TRUE.equals(sessionNewEvents.get(edgeId))) {
 | 
				
			||||||
                            log.trace("[{}][{}] Set session new events flag to false", tenantId, edgeId.getId());
 | 
					                            log.trace("[{}][{}] set session new events flag to false", tenantId, edgeId.getId());
 | 
				
			||||||
                            sessionNewEvents.put(edgeId, false);
 | 
					                            sessionNewEvents.put(edgeId, false);
 | 
				
			||||||
                            session.processHighPriorityEvents();
 | 
					                            session.processHighPriorityEvents();
 | 
				
			||||||
                            processEdgeEventMigrationIfNeeded(session, edgeId);
 | 
					                            processEdgeEventMigrationIfNeeded(session, edgeId);
 | 
				
			||||||
@ -420,6 +420,7 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i
 | 
				
			|||||||
                                    @Override
 | 
					                                    @Override
 | 
				
			||||||
                                    public void onSuccess(Boolean newEventsAdded) {
 | 
					                                    public void onSuccess(Boolean newEventsAdded) {
 | 
				
			||||||
                                        if (Boolean.TRUE.equals(newEventsAdded)) {
 | 
					                                        if (Boolean.TRUE.equals(newEventsAdded)) {
 | 
				
			||||||
 | 
					                                            log.trace("[{}][{}] new events added. set session new events flag to true", tenantId, edgeId.getId());
 | 
				
			||||||
                                            sessionNewEvents.put(edgeId, true);
 | 
					                                            sessionNewEvents.put(edgeId, true);
 | 
				
			||||||
                                        }
 | 
					                                        }
 | 
				
			||||||
                                        scheduleEdgeEventsCheck(session);
 | 
					                                        scheduleEdgeEventsCheck(session);
 | 
				
			||||||
 | 
				
			|||||||
@ -28,6 +28,7 @@ import org.springframework.data.util.Pair;
 | 
				
			|||||||
import org.thingsboard.server.common.data.AttributeScope;
 | 
					import org.thingsboard.server.common.data.AttributeScope;
 | 
				
			||||||
import org.thingsboard.server.common.data.DataConstants;
 | 
					import org.thingsboard.server.common.data.DataConstants;
 | 
				
			||||||
import org.thingsboard.server.common.data.EdgeUtils;
 | 
					import org.thingsboard.server.common.data.EdgeUtils;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.StringUtils;
 | 
				
			||||||
import org.thingsboard.server.common.data.edge.Edge;
 | 
					import org.thingsboard.server.common.data.edge.Edge;
 | 
				
			||||||
import org.thingsboard.server.common.data.edge.EdgeEvent;
 | 
					import org.thingsboard.server.common.data.edge.EdgeEvent;
 | 
				
			||||||
import org.thingsboard.server.common.data.id.EdgeId;
 | 
					import org.thingsboard.server.common.data.id.EdgeId;
 | 
				
			||||||
@ -130,13 +131,12 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
    private Long previousStartTs;
 | 
					    private Long previousStartTs;
 | 
				
			||||||
    private Long newStartSeqId;
 | 
					    private Long newStartSeqId;
 | 
				
			||||||
    private Long previousStartSeqId;
 | 
					    private Long previousStartSeqId;
 | 
				
			||||||
    private Long seqIdEnd;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private StreamObserver<RequestMsg> inputStream;
 | 
					    private StreamObserver<RequestMsg> inputStream;
 | 
				
			||||||
    private StreamObserver<ResponseMsg> outputStream;
 | 
					    private StreamObserver<ResponseMsg> outputStream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private volatile boolean connected;
 | 
					    private volatile boolean connected;
 | 
				
			||||||
    private volatile boolean syncCompleted;
 | 
					    private volatile boolean syncInProgress;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private EdgeVersion edgeVersion;
 | 
					    private EdgeVersion edgeVersion;
 | 
				
			||||||
    private int maxInboundMessageSize;
 | 
					    private int maxInboundMessageSize;
 | 
				
			||||||
@ -191,7 +191,7 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            startSyncProcess(fullSync);
 | 
					                            startSyncProcess(fullSync);
 | 
				
			||||||
                        } else {
 | 
					                        } else {
 | 
				
			||||||
                            syncCompleted = true;
 | 
					                            syncInProgress = false;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    if (requestMsg.getMsgType().equals(RequestMsgType.UPLINK_RPC_MESSAGE)) {
 | 
					                    if (requestMsg.getMsgType().equals(RequestMsgType.UPLINK_RPC_MESSAGE)) {
 | 
				
			||||||
@ -246,10 +246,14 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void startSyncProcess(boolean fullSync) {
 | 
					    public void startSyncProcess(boolean fullSync) {
 | 
				
			||||||
        log.info("[{}][{}][{}] Staring edge sync process", tenantId, edge.getId(), sessionId);
 | 
					        if (!syncInProgress) {
 | 
				
			||||||
        syncCompleted = false;
 | 
					            log.info("[{}][{}][{}] Staring edge sync process", tenantId, edge.getId(), sessionId);
 | 
				
			||||||
        interruptGeneralProcessingOnSync();
 | 
					            syncInProgress = true;
 | 
				
			||||||
        doSync(new EdgeSyncCursor(ctx, edge, fullSync));
 | 
					            interruptGeneralProcessingOnSync();
 | 
				
			||||||
 | 
					            doSync(new EdgeSyncCursor(ctx, edge, fullSync));
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            log.info("[{}][{}][{}] Sync is already started, skipping starting it now", tenantId, edge.getId(), sessionId);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void doSync(EdgeSyncCursor cursor) {
 | 
					    private void doSync(EdgeSyncCursor cursor) {
 | 
				
			||||||
@ -292,6 +296,7 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    protected void processEdgeEvents(EdgeEventFetcher fetcher, PageLink pageLink, SettableFuture<Pair<Long, Long>> result) {
 | 
					    protected void processEdgeEvents(EdgeEventFetcher fetcher, PageLink pageLink, SettableFuture<Pair<Long, Long>> result) {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
 | 
					            log.trace("[{}] Start processing edge events, fetcher = {}, pageLink = {}", sessionId, fetcher.getClass().getSimpleName(), pageLink);
 | 
				
			||||||
            processHighPriorityEvents();
 | 
					            processHighPriorityEvents();
 | 
				
			||||||
            PageData<EdgeEvent> pageData = fetcher.fetchEdgeEvents(edge.getTenantId(), edge, pageLink);
 | 
					            PageData<EdgeEvent> pageData = fetcher.fetchEdgeEvents(edge.getTenantId(), edge, pageLink);
 | 
				
			||||||
            if (isConnected() && !pageData.getData().isEmpty()) {
 | 
					            if (isConnected() && !pageData.getData().isEmpty()) {
 | 
				
			||||||
@ -327,7 +332,7 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }, ctx.getGrpcCallbackExecutorService());
 | 
					                }, ctx.getGrpcCallbackExecutorService());
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                log.trace("[{}] no event(s) found. Stop processing edge events", sessionId);
 | 
					                log.trace("[{}] no event(s) found. Stop processing edge events, fetcher = {}, pageLink = {}", sessionId, fetcher.getClass().getSimpleName(), pageLink);
 | 
				
			||||||
                result.set(null);
 | 
					                result.set(null);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } catch (Exception e) {
 | 
					        } catch (Exception e) {
 | 
				
			||||||
@ -406,6 +411,8 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
                || sessionState.getScheduledSendDownlinkTask() != null && !sessionState.getScheduledSendDownlinkTask().isCancelled()) {
 | 
					                || sessionState.getScheduledSendDownlinkTask() != null && !sessionState.getScheduledSendDownlinkTask().isCancelled()) {
 | 
				
			||||||
            log.debug("[{}][{}][{}] Previous send downlink future was not properly completed, stopping it now!", tenantId, edge.getId(), sessionId);
 | 
					            log.debug("[{}][{}][{}] Previous send downlink future was not properly completed, stopping it now!", tenantId, edge.getId(), sessionId);
 | 
				
			||||||
            stopCurrentSendDownlinkMsgsTask(true);
 | 
					            stopCurrentSendDownlinkMsgsTask(true);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            log.trace("[{}][{}][{}] Previous send downlink future is not active", tenantId, edge.getId(), sessionId);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -519,12 +526,12 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
        try {
 | 
					        try {
 | 
				
			||||||
            if (msg.getSuccess()) {
 | 
					            if (msg.getSuccess()) {
 | 
				
			||||||
                sessionState.getPendingMsgsMap().remove(msg.getDownlinkMsgId());
 | 
					                sessionState.getPendingMsgsMap().remove(msg.getDownlinkMsgId());
 | 
				
			||||||
                log.debug("[{}][{}] Msg has been processed successfully! Msg Id: [{}], Msg: {}", tenantId, edge.getRoutingKey(), msg.getDownlinkMsgId(), msg);
 | 
					                log.debug("[{}][{}][{}] Msg has been processed successfully! Msg Id: [{}], Msg: {}", tenantId, edge.getId(), sessionId, msg.getDownlinkMsgId(), msg);
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                log.error("[{}][{}] Msg processing failed! Msg Id: [{}], Error msg: {}", tenantId, edge.getRoutingKey(), msg.getDownlinkMsgId(), msg.getErrorMsg());
 | 
					                log.error("[{}][{}][{}] Msg processing failed! Msg Id: [{}], Error msg: {}", tenantId, edge.getId(), sessionId, msg.getDownlinkMsgId(), msg.getErrorMsg());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (sessionState.getPendingMsgsMap().isEmpty()) {
 | 
					            if (sessionState.getPendingMsgsMap().isEmpty()) {
 | 
				
			||||||
                log.debug("[{}][{}] Pending msgs map is empty. Stopping current iteration", tenantId, edge.getRoutingKey());
 | 
					                log.debug("[{}][{}][{}] Pending msgs map is empty. Stopping current iteration", tenantId, edge.getId(), sessionId);
 | 
				
			||||||
                stopCurrentSendDownlinkMsgsTask(false);
 | 
					                stopCurrentSendDownlinkMsgsTask(false);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } catch (Exception e) {
 | 
					        } catch (Exception e) {
 | 
				
			||||||
@ -534,7 +541,7 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public void processHighPriorityEvents() {
 | 
					    public void processHighPriorityEvents() {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            if (isConnected() && isSyncCompleted()) {
 | 
					            if (isConnected() && !isSyncInProgress()) {
 | 
				
			||||||
                if (highPriorityQueue.isEmpty()) {
 | 
					                if (highPriorityQueue.isEmpty()) {
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@ -543,6 +550,7 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
                while ((event = highPriorityQueue.poll()) != null) {
 | 
					                while ((event = highPriorityQueue.poll()) != null) {
 | 
				
			||||||
                    highPriorityEvents.add(event);
 | 
					                    highPriorityEvents.add(event);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                log.trace("[{}][{}] Sending high priority events {}", tenantId, sessionId, highPriorityEvents.size());
 | 
				
			||||||
                List<DownlinkMsg> downlinkMsgsPack = convertToDownlinkMsgsPack(highPriorityEvents);
 | 
					                List<DownlinkMsg> downlinkMsgsPack = convertToDownlinkMsgsPack(highPriorityEvents);
 | 
				
			||||||
                sendDownlinkMsgsPack(downlinkMsgsPack).get();
 | 
					                sendDownlinkMsgsPack(downlinkMsgsPack).get();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -553,18 +561,18 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public ListenableFuture<Boolean> processEdgeEvents() throws Exception {
 | 
					    public ListenableFuture<Boolean> processEdgeEvents() throws Exception {
 | 
				
			||||||
        SettableFuture<Boolean> result = SettableFuture.create();
 | 
					        SettableFuture<Boolean> result = SettableFuture.create();
 | 
				
			||||||
        log.trace("[{}][{}] starting processing edge events", tenantId, sessionId);
 | 
					        if (isConnected() && !isSyncInProgress()) {
 | 
				
			||||||
        if (isConnected() && isSyncCompleted()) {
 | 
					 | 
				
			||||||
            Pair<Long, Long> startTsAndSeqId = getQueueStartTsAndSeqId().get();
 | 
					            Pair<Long, Long> startTsAndSeqId = getQueueStartTsAndSeqId().get();
 | 
				
			||||||
            previousStartTs = startTsAndSeqId.getFirst();
 | 
					            previousStartTs = startTsAndSeqId.getFirst();
 | 
				
			||||||
            previousStartSeqId = startTsAndSeqId.getSecond();
 | 
					            previousStartSeqId = startTsAndSeqId.getSecond();
 | 
				
			||||||
            GeneralEdgeEventFetcher fetcher = new GeneralEdgeEventFetcher(
 | 
					            GeneralEdgeEventFetcher fetcher = new GeneralEdgeEventFetcher(
 | 
				
			||||||
                    previousStartTs,
 | 
					                    previousStartTs,
 | 
				
			||||||
                    previousStartSeqId,
 | 
					                    previousStartSeqId,
 | 
				
			||||||
                    seqIdEnd,
 | 
					 | 
				
			||||||
                    false,
 | 
					                    false,
 | 
				
			||||||
                    Integer.toUnsignedLong(ctx.getEdgeEventStorageSettings().getMaxReadRecordsCount()),
 | 
					                    Integer.toUnsignedLong(ctx.getEdgeEventStorageSettings().getMaxReadRecordsCount()),
 | 
				
			||||||
                    ctx.getEdgeEventService());
 | 
					                    ctx.getEdgeEventService());
 | 
				
			||||||
 | 
					            log.trace("[{}][{}] starting processing edge events, previousStartTs = {}, previousStartSeqId = {}",
 | 
				
			||||||
 | 
					                    tenantId, sessionId, previousStartTs, previousStartSeqId);
 | 
				
			||||||
            Futures.addCallback(startProcessingEdgeEvents(fetcher), new FutureCallback<>() {
 | 
					            Futures.addCallback(startProcessingEdgeEvents(fetcher), new FutureCallback<>() {
 | 
				
			||||||
                @Override
 | 
					                @Override
 | 
				
			||||||
                public void onSuccess(@Nullable Pair<Long, Long> newStartTsAndSeqId) {
 | 
					                public void onSuccess(@Nullable Pair<Long, Long> newStartTsAndSeqId) {
 | 
				
			||||||
@ -574,18 +582,16 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
                            @Override
 | 
					                            @Override
 | 
				
			||||||
                            public void onSuccess(@Nullable List<Long> list) {
 | 
					                            public void onSuccess(@Nullable List<Long> list) {
 | 
				
			||||||
                                log.debug("[{}][{}] queue offset was updated [{}]", tenantId, sessionId, newStartTsAndSeqId);
 | 
					                                log.debug("[{}][{}] queue offset was updated [{}]", tenantId, sessionId, newStartTsAndSeqId);
 | 
				
			||||||
 | 
					                                boolean newEventsAvailable;
 | 
				
			||||||
                                if (fetcher.isSeqIdNewCycleStarted()) {
 | 
					                                if (fetcher.isSeqIdNewCycleStarted()) {
 | 
				
			||||||
                                    seqIdEnd = fetcher.getSeqIdEnd();
 | 
					                                    newEventsAvailable = isNewEdgeEventsAvailable();
 | 
				
			||||||
                                    boolean newEventsAvailable = isNewEdgeEventsAvailable();
 | 
					 | 
				
			||||||
                                    result.set(newEventsAvailable);
 | 
					 | 
				
			||||||
                                } else {
 | 
					                                } else {
 | 
				
			||||||
                                    seqIdEnd = null;
 | 
					                                    newEventsAvailable = isSeqIdStartedNewCycle();
 | 
				
			||||||
                                    boolean newEventsAvailable = isSeqIdStartedNewCycle();
 | 
					 | 
				
			||||||
                                    if (!newEventsAvailable) {
 | 
					                                    if (!newEventsAvailable) {
 | 
				
			||||||
                                        newEventsAvailable = isNewEdgeEventsAvailable();
 | 
					                                        newEventsAvailable = isNewEdgeEventsAvailable();
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
                                    result.set(newEventsAvailable);
 | 
					 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
 | 
					                                result.set(newEventsAvailable);
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            @Override
 | 
					                            @Override
 | 
				
			||||||
@ -607,7 +613,7 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }, ctx.getGrpcCallbackExecutorService());
 | 
					            }, ctx.getGrpcCallbackExecutorService());
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            if (!isSyncCompleted()) {
 | 
					            if (isSyncInProgress()) {
 | 
				
			||||||
                log.trace("[{}][{}] edge sync is not completed yet. Skipping iteration", tenantId, sessionId);
 | 
					                log.trace("[{}][{}] edge sync is not completed yet. Skipping iteration", tenantId, sessionId);
 | 
				
			||||||
                result.set(Boolean.TRUE);
 | 
					                result.set(Boolean.TRUE);
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
@ -672,9 +678,12 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private boolean isSeqIdStartedNewCycle() {
 | 
					    private boolean isSeqIdStartedNewCycle() {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
 | 
					            log.trace("[{}][{}][{}] Checking if seq id started new cycle", tenantId, edge.getId(), sessionId);
 | 
				
			||||||
            TimePageLink pageLink = new TimePageLink(ctx.getEdgeEventStorageSettings().getMaxReadRecordsCount(), 0, null, null, newStartTs, System.currentTimeMillis());
 | 
					            TimePageLink pageLink = new TimePageLink(ctx.getEdgeEventStorageSettings().getMaxReadRecordsCount(), 0, null, null, newStartTs, System.currentTimeMillis());
 | 
				
			||||||
            PageData<EdgeEvent> edgeEvents = ctx.getEdgeEventService().findEdgeEvents(edge.getTenantId(), edge.getId(), 0L, previousStartSeqId == 0 ? null : previousStartSeqId - 1, pageLink);
 | 
					            PageData<EdgeEvent> edgeEvents = ctx.getEdgeEventService().findEdgeEvents(edge.getTenantId(), edge.getId(), 0L, previousStartSeqId == 0 ? null : previousStartSeqId - 1, pageLink);
 | 
				
			||||||
            return !edgeEvents.getData().isEmpty();
 | 
					            boolean result = !edgeEvents.getData().isEmpty();
 | 
				
			||||||
 | 
					            log.trace("[{}][{}][{}] Result of check if seq id started new cycle, result = {}", tenantId, edge.getId(), sessionId, result);
 | 
				
			||||||
 | 
					            return result;
 | 
				
			||||||
        } catch (Exception e) {
 | 
					        } catch (Exception e) {
 | 
				
			||||||
            log.error("[{}][{}][{}] Failed to execute isSeqIdStartedNewCycle", tenantId, edge.getId(), sessionId, e);
 | 
					            log.error("[{}][{}][{}] Failed to execute isSeqIdStartedNewCycle", tenantId, edge.getId(), sessionId, e);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -683,9 +692,12 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private boolean isNewEdgeEventsAvailable() {
 | 
					    private boolean isNewEdgeEventsAvailable() {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
 | 
					            log.trace("[{}][{}][{}] Checking if new edge events available", tenantId, edge.getId(), sessionId);
 | 
				
			||||||
            TimePageLink pageLink = new TimePageLink(ctx.getEdgeEventStorageSettings().getMaxReadRecordsCount(), 0, null, null, newStartTs, System.currentTimeMillis());
 | 
					            TimePageLink pageLink = new TimePageLink(ctx.getEdgeEventStorageSettings().getMaxReadRecordsCount(), 0, null, null, newStartTs, System.currentTimeMillis());
 | 
				
			||||||
            PageData<EdgeEvent> edgeEvents = ctx.getEdgeEventService().findEdgeEvents(edge.getTenantId(), edge.getId(), newStartSeqId, null, pageLink);
 | 
					            PageData<EdgeEvent> edgeEvents = ctx.getEdgeEventService().findEdgeEvents(edge.getTenantId(), edge.getId(), newStartSeqId, null, pageLink);
 | 
				
			||||||
            return !edgeEvents.getData().isEmpty() || !highPriorityQueue.isEmpty();
 | 
					            boolean result = !edgeEvents.getData().isEmpty() || !highPriorityQueue.isEmpty();
 | 
				
			||||||
 | 
					            log.trace("[{}][{}][{}] Result of check if new edge events available, result = {}", tenantId, edge.getId(), sessionId, result);
 | 
				
			||||||
 | 
					            return result;
 | 
				
			||||||
        } catch (Exception e) {
 | 
					        } catch (Exception e) {
 | 
				
			||||||
            log.error("[{}][{}][{}] Failed to execute isNewEdgeEventsAvailable", tenantId, edge.getId(), sessionId, e);
 | 
					            log.error("[{}][{}][{}] Failed to execute isNewEdgeEventsAvailable", tenantId, edge.getId(), sessionId, e);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -724,7 +736,7 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void markSyncCompletedSendEdgeEventUpdate() {
 | 
					    private void markSyncCompletedSendEdgeEventUpdate() {
 | 
				
			||||||
        syncCompleted = true;
 | 
					        syncInProgress = false;
 | 
				
			||||||
        ctx.getClusterService().onEdgeEventUpdate(new EdgeEventUpdateMsg(edge.getTenantId(), edge.getId()));
 | 
					        ctx.getClusterService().onEdgeEventUpdate(new EdgeEventUpdateMsg(edge.getTenantId(), edge.getId()));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -737,29 +749,27 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void sendDownlinkMsg(ResponseMsg downlinkMsg) {
 | 
					    private void sendDownlinkMsg(ResponseMsg responseMsg) {
 | 
				
			||||||
        if (downlinkMsg.getDownlinkMsg().getWidgetTypeUpdateMsgCount() > 0) {
 | 
					 | 
				
			||||||
            log.trace("[{}][{}] Sending downlink widgetTypeUpdateMsg, downlinkMsgId = {}", tenantId, sessionId, downlinkMsg.getDownlinkMsg().getDownlinkMsgId());
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            log.trace("[{}][{}] Sending downlink msg [{}]", tenantId, sessionId, downlinkMsg);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (isConnected()) {
 | 
					        if (isConnected()) {
 | 
				
			||||||
 | 
					            String responseMsgStr = StringUtils.truncate(responseMsg.toString(), 10000);
 | 
				
			||||||
 | 
					            log.trace("[{}][{}] Sending downlink msg [{}]", tenantId, sessionId, responseMsgStr);
 | 
				
			||||||
            downlinkMsgLock.lock();
 | 
					            downlinkMsgLock.lock();
 | 
				
			||||||
 | 
					            String downlinkMsgStr = responseMsg.hasDownlinkMsg() ? String.valueOf(responseMsg.getDownlinkMsg().getDownlinkMsgId()) : responseMsgStr;
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
                outputStream.onNext(downlinkMsg);
 | 
					                outputStream.onNext(responseMsg);
 | 
				
			||||||
            } catch (Exception e) {
 | 
					            } catch (Exception e) {
 | 
				
			||||||
                log.error("[{}][{}] Failed to send downlink message [{}]", tenantId, sessionId, downlinkMsg, e);
 | 
					                log.error("[{}][{}] Failed to send downlink message [{}]", tenantId, sessionId, downlinkMsgStr, e);
 | 
				
			||||||
                connected = false;
 | 
					                connected = false;
 | 
				
			||||||
                sessionCloseListener.accept(edge, sessionId);
 | 
					                sessionCloseListener.accept(edge, sessionId);
 | 
				
			||||||
            } finally {
 | 
					            } finally {
 | 
				
			||||||
                downlinkMsgLock.unlock();
 | 
					                downlinkMsgLock.unlock();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            log.trace("[{}][{}] Response msg successfully sent. downlinkMsgId = {}", tenantId, sessionId, downlinkMsg.getDownlinkMsg().getDownlinkMsgId());
 | 
					            log.trace("[{}][{}] downlink msg successfully sent [{}]", tenantId, sessionId, downlinkMsgStr);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    protected DownlinkMsg convertEntityEventToDownlink(EdgeEvent edgeEvent) {
 | 
					    private DownlinkMsg convertEntityEventToDownlink(EdgeEvent edgeEvent) {
 | 
				
			||||||
        log.trace("[{}] Executing convertEntityEventToDownlink, edgeEvent [{}], action [{}]", edgeEvent.getTenantId(), edgeEvent, edgeEvent.getAction());
 | 
					        log.trace("[{}][{}] Executing convertEntityEventToDownlink, edgeEvent [{}], action [{}]", tenantId, sessionId, edgeEvent, edgeEvent.getAction());
 | 
				
			||||||
        return switch (edgeEvent.getType()) {
 | 
					        return switch (edgeEvent.getType()) {
 | 
				
			||||||
            case EDGE -> ctx.getEdgeProcessor().convertEdgeEventToDownlink(edgeEvent);
 | 
					            case EDGE -> ctx.getEdgeProcessor().convertEdgeEventToDownlink(edgeEvent);
 | 
				
			||||||
            case DEVICE -> ctx.getDeviceProcessor().convertDeviceEventToDownlink(edgeEvent, edgeVersion);
 | 
					            case DEVICE -> ctx.getDeviceProcessor().convertDeviceEventToDownlink(edgeEvent, edgeVersion);
 | 
				
			||||||
@ -789,7 +799,7 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
            case OAUTH2_CLIENT -> ctx.getOAuth2EdgeProcessor().convertOAuth2ClientEventToDownlink(edgeEvent, edgeVersion);
 | 
					            case OAUTH2_CLIENT -> ctx.getOAuth2EdgeProcessor().convertOAuth2ClientEventToDownlink(edgeEvent, edgeVersion);
 | 
				
			||||||
            case DOMAIN -> ctx.getOAuth2EdgeProcessor().convertOAuth2DomainEventToDownlink(edgeEvent, edgeVersion);
 | 
					            case DOMAIN -> ctx.getOAuth2EdgeProcessor().convertOAuth2DomainEventToDownlink(edgeEvent, edgeVersion);
 | 
				
			||||||
            default -> {
 | 
					            default -> {
 | 
				
			||||||
                log.warn("[{}] Unsupported edge event type [{}]", edgeEvent.getTenantId(), edgeEvent);
 | 
					                log.warn("[{}][{}] Unsupported edge event type [{}]", tenantId, sessionId, edgeEvent);
 | 
				
			||||||
                yield null;
 | 
					                yield null;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
@ -923,8 +933,8 @@ public abstract class EdgeGrpcSession implements Closeable {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        } catch (Exception e) {
 | 
					        } catch (Exception e) {
 | 
				
			||||||
            String failureMsg = String.format("Can't process uplink msg [%s] from edge", uplinkMsg);
 | 
					            String failureMsg = String.format("Can't process uplink msg [%s] from edge", uplinkMsg);
 | 
				
			||||||
            log.error("[{}][{}] Can't process uplink msg [{}]", edge.getTenantId(), sessionId, uplinkMsg, e);
 | 
					            log.error("[{}][{}] Can't process uplink msg [{}]", tenantId, sessionId, uplinkMsg, e);
 | 
				
			||||||
            ctx.getNotificationRuleProcessor().process(EdgeCommunicationFailureTrigger.builder().tenantId(edge.getTenantId()).edgeId(edge.getId())
 | 
					            ctx.getNotificationRuleProcessor().process(EdgeCommunicationFailureTrigger.builder().tenantId(tenantId).edgeId(edge.getId())
 | 
				
			||||||
                    .customerId(edge.getCustomerId()).edgeName(edge.getName()).failureMsg(failureMsg).error(e.getMessage()).build());
 | 
					                    .customerId(edge.getCustomerId()).edgeName(edge.getName()).failureMsg(failureMsg).error(e.getMessage()).build());
 | 
				
			||||||
            return Futures.immediateFailedFuture(e);
 | 
					            return Futures.immediateFailedFuture(e);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -73,7 +73,7 @@ public class KafkaEdgeGrpcSession extends EdgeGrpcSession {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private void processMsgs(List<TbProtoQueueMsg<ToEdgeEventNotificationMsg>> msgs, TbQueueConsumer<TbProtoQueueMsg<ToEdgeEventNotificationMsg>> consumer) {
 | 
					    private void processMsgs(List<TbProtoQueueMsg<ToEdgeEventNotificationMsg>> msgs, TbQueueConsumer<TbProtoQueueMsg<ToEdgeEventNotificationMsg>> consumer) {
 | 
				
			||||||
        log.trace("[{}][{}] starting processing edge events", tenantId, sessionId);
 | 
					        log.trace("[{}][{}] starting processing edge events", tenantId, sessionId);
 | 
				
			||||||
        if (isConnected() && isSyncCompleted() && !isHighPriorityProcessing) {
 | 
					        if (isConnected() && !isSyncInProgress() && !isHighPriorityProcessing) {
 | 
				
			||||||
            List<EdgeEvent> edgeEvents = new ArrayList<>();
 | 
					            List<EdgeEvent> edgeEvents = new ArrayList<>();
 | 
				
			||||||
            for (TbProtoQueueMsg<ToEdgeEventNotificationMsg> msg : msgs) {
 | 
					            for (TbProtoQueueMsg<ToEdgeEventNotificationMsg> msg : msgs) {
 | 
				
			||||||
                EdgeEvent edgeEvent = ProtoUtils.fromProto(msg.getValue().getEdgeEventMsg());
 | 
					                EdgeEvent edgeEvent = ProtoUtils.fromProto(msg.getValue().getEdgeEventMsg());
 | 
				
			||||||
 | 
				
			|||||||
@ -33,8 +33,6 @@ public class GeneralEdgeEventFetcher implements EdgeEventFetcher {
 | 
				
			|||||||
    private final Long queueStartTs;
 | 
					    private final Long queueStartTs;
 | 
				
			||||||
    private Long seqIdStart;
 | 
					    private Long seqIdStart;
 | 
				
			||||||
    @Getter
 | 
					    @Getter
 | 
				
			||||||
    private Long seqIdEnd;
 | 
					 | 
				
			||||||
    @Getter
 | 
					 | 
				
			||||||
    private boolean seqIdNewCycleStarted;
 | 
					    private boolean seqIdNewCycleStarted;
 | 
				
			||||||
    private Long maxReadRecordsCount;
 | 
					    private Long maxReadRecordsCount;
 | 
				
			||||||
    private final EdgeEventService edgeEventService;
 | 
					    private final EdgeEventService edgeEventService;
 | 
				
			||||||
@ -53,10 +51,11 @@ public class GeneralEdgeEventFetcher implements EdgeEventFetcher {
 | 
				
			|||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public PageData<EdgeEvent> fetchEdgeEvents(TenantId tenantId, Edge edge, PageLink pageLink) {
 | 
					    public PageData<EdgeEvent> fetchEdgeEvents(TenantId tenantId, Edge edge, PageLink pageLink) {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            PageData<EdgeEvent> edgeEvents = edgeEventService.findEdgeEvents(tenantId, edge.getId(), seqIdStart, seqIdEnd, (TimePageLink) pageLink);
 | 
					            log.trace("[{}] Finding general edge events [{}], seqIdStart = {}, pageLink = {}",
 | 
				
			||||||
 | 
					                    tenantId, edge.getId(), seqIdStart, pageLink);
 | 
				
			||||||
 | 
					            PageData<EdgeEvent> edgeEvents = edgeEventService.findEdgeEvents(tenantId, edge.getId(), seqIdStart, null, (TimePageLink) pageLink);
 | 
				
			||||||
            if (edgeEvents.getData().isEmpty()) {
 | 
					            if (edgeEvents.getData().isEmpty()) {
 | 
				
			||||||
                this.seqIdEnd = Math.max(this.maxReadRecordsCount, seqIdStart - this.maxReadRecordsCount);
 | 
					                edgeEvents = edgeEventService.findEdgeEvents(tenantId, edge.getId(), 0L, Math.max(this.maxReadRecordsCount, seqIdStart - this.maxReadRecordsCount), (TimePageLink) pageLink);
 | 
				
			||||||
                edgeEvents = edgeEventService.findEdgeEvents(tenantId, edge.getId(), 0L, seqIdEnd, (TimePageLink) pageLink);
 | 
					 | 
				
			||||||
                if (edgeEvents.getData().stream().anyMatch(ee -> ee.getSeqId() < seqIdStart)) {
 | 
					                if (edgeEvents.getData().stream().anyMatch(ee -> ee.getSeqId() < seqIdStart)) {
 | 
				
			||||||
                    log.info("[{}] seqId column of edge_event table started new cycle [{}]", tenantId, edge.getId());
 | 
					                    log.info("[{}] seqId column of edge_event table started new cycle [{}]", tenantId, edge.getId());
 | 
				
			||||||
                    this.seqIdNewCycleStarted = true;
 | 
					                    this.seqIdNewCycleStarted = true;
 | 
				
			||||||
 | 
				
			|||||||
@ -235,6 +235,9 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService {
 | 
				
			|||||||
                    if (relationsList != null && !relationsList.isEmpty()) {
 | 
					                    if (relationsList != null && !relationsList.isEmpty()) {
 | 
				
			||||||
                        List<ListenableFuture<Void>> futures = new ArrayList<>();
 | 
					                        List<ListenableFuture<Void>> futures = new ArrayList<>();
 | 
				
			||||||
                        for (List<EntityRelation> entityRelations : relationsList) {
 | 
					                        for (List<EntityRelation> entityRelations : relationsList) {
 | 
				
			||||||
 | 
					                            if (entityRelations.isEmpty()) {
 | 
				
			||||||
 | 
					                                continue;
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
                            log.trace("[{}][{}][{}][{}] relation(s) are going to be pushed to edge.", tenantId, edge.getId(), entityId, entityRelations.size());
 | 
					                            log.trace("[{}][{}][{}][{}] relation(s) are going to be pushed to edge.", tenantId, edge.getId(), entityId, entityRelations.size());
 | 
				
			||||||
                            for (EntityRelation relation : entityRelations) {
 | 
					                            for (EntityRelation relation : entityRelations) {
 | 
				
			||||||
                                try {
 | 
					                                try {
 | 
				
			||||||
@ -255,19 +258,23 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService {
 | 
				
			|||||||
                                }
 | 
					                                }
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        Futures.addCallback(Futures.allAsList(futures), new FutureCallback<>() {
 | 
					                        if (futures.isEmpty()) {
 | 
				
			||||||
                            @Override
 | 
					                            futureToSet.set(null);
 | 
				
			||||||
                            public void onSuccess(@Nullable List<Void> voids) {
 | 
					                        } else {
 | 
				
			||||||
                                futureToSet.set(null);
 | 
					                            Futures.addCallback(Futures.allAsList(futures), new FutureCallback<>() {
 | 
				
			||||||
                            }
 | 
					                                @Override
 | 
				
			||||||
 | 
					                                public void onSuccess(@Nullable List<Void> voids) {
 | 
				
			||||||
 | 
					                                    futureToSet.set(null);
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            @Override
 | 
					                                @Override
 | 
				
			||||||
                            public void onFailure(Throwable throwable) {
 | 
					                                public void onFailure(Throwable throwable) {
 | 
				
			||||||
                                String errMsg = String.format("[%s][%s] Exception during saving edge events [%s]!", tenantId, edge.getId(), relationRequestMsg);
 | 
					                                    String errMsg = String.format("[%s][%s] Exception during saving edge events [%s]!", tenantId, edge.getId(), relationRequestMsg);
 | 
				
			||||||
                                log.error(errMsg, throwable);
 | 
					                                    log.error(errMsg, throwable);
 | 
				
			||||||
                                futureToSet.setException(new RuntimeException(errMsg, throwable));
 | 
					                                    futureToSet.setException(new RuntimeException(errMsg, throwable));
 | 
				
			||||||
                            }
 | 
					                                }
 | 
				
			||||||
                        }, dbCallbackExecutorService);
 | 
					                            }, dbCallbackExecutorService);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        futureToSet.set(null);
 | 
					                        futureToSet.set(null);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
				
			|||||||
@ -134,7 +134,7 @@ public class JpaBaseEdgeEventDao extends JpaPartitionedAbstractDao<EdgeEventEnti
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public ListenableFuture<Void> saveAsync(EdgeEvent edgeEvent) {
 | 
					    public ListenableFuture<Void> saveAsync(EdgeEvent edgeEvent) {
 | 
				
			||||||
        log.debug("Save edge event [{}] ", edgeEvent);
 | 
					        log.debug("Saving EdgeEvent [{}] ", edgeEvent);
 | 
				
			||||||
        if (edgeEvent.getId() == null) {
 | 
					        if (edgeEvent.getId() == null) {
 | 
				
			||||||
            UUID timeBased = Uuids.timeBased();
 | 
					            UUID timeBased = Uuids.timeBased();
 | 
				
			||||||
            edgeEvent.setId(new EdgeEventId(timeBased));
 | 
					            edgeEvent.setId(new EdgeEventId(timeBased));
 | 
				
			||||||
@ -156,7 +156,7 @@ public class JpaBaseEdgeEventDao extends JpaPartitionedAbstractDao<EdgeEventEnti
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private ListenableFuture<Void> save(EdgeEventEntity entity) {
 | 
					    private ListenableFuture<Void> save(EdgeEventEntity entity) {
 | 
				
			||||||
        log.debug("Save edge event [{}] ", entity);
 | 
					        log.debug("Saving EdgeEventEntity [{}] ", entity);
 | 
				
			||||||
        if (entity.getTenantId() == null) {
 | 
					        if (entity.getTenantId() == null) {
 | 
				
			||||||
            log.trace("Save system edge event with predefined id {}", systemTenantId);
 | 
					            log.trace("Save system edge event with predefined id {}", systemTenantId);
 | 
				
			||||||
            entity.setTenantId(systemTenantId);
 | 
					            entity.setTenantId(systemTenantId);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user