|
|
@ -73,6 +73,7 @@ import org.thingsboard.server.queue.util.AfterStartUp; |
|
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
import java.util.ArrayList; |
|
|
import java.util.List; |
|
|
import java.util.List; |
|
|
|
|
|
import java.util.Set; |
|
|
import java.util.concurrent.ExecutorService; |
|
|
import java.util.concurrent.ExecutorService; |
|
|
import java.util.concurrent.ScheduledExecutorService; |
|
|
import java.util.concurrent.ScheduledExecutorService; |
|
|
import java.util.concurrent.TimeUnit; |
|
|
import java.util.concurrent.TimeUnit; |
|
|
@ -150,12 +151,10 @@ public class DefaultEdqsService implements EdqsService { |
|
|
executor.submit(() -> { |
|
|
executor.submit(() -> { |
|
|
try { |
|
|
try { |
|
|
EdqsSyncState syncState = getSyncState(); |
|
|
EdqsSyncState syncState = getSyncState(); |
|
|
if (edqsSyncService.isSyncNeeded() || syncState == null || syncState.getStatus() != EdqsSyncStatus.FINISHED) { |
|
|
if (edqsSyncService.isSyncNeeded() || syncState == null) { |
|
|
if (hashPartitionService.isSystemPartitionMine(ServiceType.TB_CORE)) { |
|
|
requestEdqsSync(new EdqsSyncRequest()); |
|
|
processSystemRequest(ToCoreEdqsRequest.builder() |
|
|
} else if (syncState.getStatus() != EdqsSyncStatus.FINISHED) { |
|
|
.syncRequest(new EdqsSyncRequest()) |
|
|
requestEdqsSync(new EdqsSyncRequest(syncState.getObjectTypes())); |
|
|
.build()); |
|
|
|
|
|
} |
|
|
|
|
|
} else { |
|
|
} else { |
|
|
// only if topic/RocksDB is not empty and sync is finished
|
|
|
// only if topic/RocksDB is not empty and sync is finished
|
|
|
onSyncStatusUpdate(EdqsSyncStatus.FINISHED); |
|
|
onSyncStatusUpdate(EdqsSyncStatus.FINISHED); |
|
|
@ -166,11 +165,19 @@ public class DefaultEdqsService implements EdqsService { |
|
|
}); |
|
|
}); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void requestEdqsSync(EdqsSyncRequest syncRequest) { |
|
|
|
|
|
if (hashPartitionService.isSystemPartitionMine(ServiceType.TB_CORE)) { |
|
|
|
|
|
processSystemRequest(ToCoreEdqsRequest.builder() |
|
|
|
|
|
.syncRequest(syncRequest) |
|
|
|
|
|
.build()); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public void processSystemRequest(ToCoreEdqsRequest request) { |
|
|
public void processSystemRequest(ToCoreEdqsRequest request) { |
|
|
log.info("Processing system request {}", request); |
|
|
log.info("Processing system request {}", request); |
|
|
if (request.getSyncRequest() != null) { |
|
|
if (request.getSyncRequest() != null) { |
|
|
saveSyncState(EdqsSyncStatus.REQUESTED); |
|
|
saveSyncState(EdqsSyncStatus.REQUESTED, request.getSyncRequest().getObjectTypes()); |
|
|
} |
|
|
} |
|
|
broadcast(ToCoreEdqsMsg.builder() |
|
|
broadcast(ToCoreEdqsMsg.builder() |
|
|
.syncRequest(request.getSyncRequest()) |
|
|
.syncRequest(request.getSyncRequest()) |
|
|
@ -198,7 +205,8 @@ public class DefaultEdqsService implements EdqsService { |
|
|
onSyncStatusUpdate(msg.getSyncStatus()); |
|
|
onSyncStatusUpdate(msg.getSyncStatus()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (msg.getSyncRequest() != null) { |
|
|
EdqsSyncRequest syncRequest = msg.getSyncRequest(); |
|
|
|
|
|
if (syncRequest != null) { |
|
|
syncLock.lock(); |
|
|
syncLock.lock(); |
|
|
try { |
|
|
try { |
|
|
EdqsSyncState syncState = getSyncState(); |
|
|
EdqsSyncState syncState = getSyncState(); |
|
|
@ -209,15 +217,15 @@ public class DefaultEdqsService implements EdqsService { |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
saveSyncState(EdqsSyncStatus.STARTED); |
|
|
saveSyncState(EdqsSyncStatus.STARTED, syncRequest.getObjectTypes()); |
|
|
|
|
|
|
|
|
edqsSyncService.sync(); |
|
|
edqsSyncService.sync(syncRequest); |
|
|
|
|
|
|
|
|
saveSyncState(EdqsSyncStatus.FINISHED); |
|
|
saveSyncState(EdqsSyncStatus.FINISHED); |
|
|
broadcastSyncStatusUpdate(EdqsSyncStatus.FINISHED); |
|
|
broadcastSyncStatusUpdate(EdqsSyncStatus.FINISHED); |
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
log.error("Failed to complete sync", e); |
|
|
log.error("Failed to complete sync", e); |
|
|
saveSyncState(EdqsSyncStatus.FAILED); |
|
|
saveSyncState(EdqsSyncStatus.FAILED, syncRequest.getObjectTypes()); |
|
|
broadcastSyncStatusUpdate(EdqsSyncStatus.FAILED); |
|
|
broadcastSyncStatusUpdate(EdqsSyncStatus.FAILED); |
|
|
} finally { |
|
|
} finally { |
|
|
syncLock.unlock(); |
|
|
syncLock.unlock(); |
|
|
@ -369,7 +377,12 @@ public class DefaultEdqsService implements EdqsService { |
|
|
|
|
|
|
|
|
@SneakyThrows |
|
|
@SneakyThrows |
|
|
private void saveSyncState(EdqsSyncStatus status) { |
|
|
private void saveSyncState(EdqsSyncStatus status) { |
|
|
EdqsSyncState state = new EdqsSyncState(status); |
|
|
saveSyncState(status, null); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@SneakyThrows |
|
|
|
|
|
private void saveSyncState(EdqsSyncStatus status, Set<ObjectType> objectTypes) { |
|
|
|
|
|
EdqsSyncState state = new EdqsSyncState(status, objectTypes); |
|
|
log.info("New EDQS sync state: {}", state); |
|
|
log.info("New EDQS sync state: {}", state); |
|
|
attributesService.save(TenantId.SYS_TENANT_ID, TenantId.SYS_TENANT_ID, AttributeScope.SERVER_SCOPE, new BaseAttributeKvEntry( |
|
|
attributesService.save(TenantId.SYS_TENANT_ID, TenantId.SYS_TENANT_ID, AttributeScope.SERVER_SCOPE, new BaseAttributeKvEntry( |
|
|
new JsonDataEntry("edqsSyncState", JacksonUtil.toString(state)), |
|
|
new JsonDataEntry("edqsSyncState", JacksonUtil.toString(state)), |
|
|
@ -383,11 +396,4 @@ public class DefaultEdqsService implements EdqsService { |
|
|
eventsProducer.stop(); |
|
|
eventsProducer.stop(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Data |
|
|
|
|
|
@AllArgsConstructor |
|
|
|
|
|
@NoArgsConstructor |
|
|
|
|
|
private static class EdqsSyncState { |
|
|
|
|
|
private EdqsSyncStatus status; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|