|
|
@@ -7,6 +7,7 @@ import com.usoftchina.saas.dc.po.DataSourceInfo;
|
|
|
import com.usoftchina.saas.dc.po.Snapshot;
|
|
|
import com.usoftchina.saas.dc.po.SnapshotUsage;
|
|
|
import com.usoftchina.saas.dc.repository.SnapshotDataRepository;
|
|
|
+import com.usoftchina.saas.dc.repository.SnapshotOriginDataRepository;
|
|
|
import com.usoftchina.saas.dc.repository.SnapshotRepository;
|
|
|
import com.usoftchina.saas.dc.repository.SnapshotUsageRepository;
|
|
|
import com.usoftchina.saas.dc.service.DataSourceInfoService;
|
|
|
@@ -43,6 +44,9 @@ public class SnapshotLifecycle {
|
|
|
@Autowired
|
|
|
private DataSourceInfoService dataSourceInfoService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private SnapshotOriginDataRepository snapshotOriginDataRepository;
|
|
|
+
|
|
|
@Autowired
|
|
|
private MysqlStrategy mysqlStrategy;
|
|
|
|
|
|
@@ -51,7 +55,7 @@ public class SnapshotLifecycle {
|
|
|
public void onReadyToCreateEvent(ReadyToCreateEvent event) {
|
|
|
Snapshot snapshot = event.getSnapshot();
|
|
|
try {
|
|
|
- snapshot.setStatus(Snapshot.Status.CREATING);
|
|
|
+ snapshot.setStatus(Snapshot.Status.CREATING.name());
|
|
|
snapshotRepository.save(snapshot);
|
|
|
// 为防止导出过程中有人操作,导致部分数据不一致,在导出前锁定该公司不允许操作
|
|
|
CompanyLockCache.lock(snapshot.getCompanyId());
|
|
|
@@ -85,7 +89,7 @@ public class SnapshotLifecycle {
|
|
|
Snapshot snapshot = event.getSnapshot();
|
|
|
// 解锁
|
|
|
CompanyLockCache.unlock(snapshot.getCompanyId());
|
|
|
- snapshot.setStatus(Snapshot.Status.SUCCESS);
|
|
|
+ snapshot.setStatus(Snapshot.Status.SUCCESS.name());
|
|
|
snapshotRepository.save(snapshot);
|
|
|
}
|
|
|
|
|
|
@@ -96,7 +100,7 @@ public class SnapshotLifecycle {
|
|
|
logger.error("failed to create snapshot {}", event.getException(), snapshot.get_id());
|
|
|
// 解锁
|
|
|
CompanyLockCache.unlock(snapshot.getCompanyId());
|
|
|
- snapshot.setStatus(Snapshot.Status.FAILED);
|
|
|
+ snapshot.setStatus(Snapshot.Status.FAILED.name());
|
|
|
snapshot.setMessage(event.getException().getMessage());
|
|
|
snapshotRepository.save(snapshot);
|
|
|
// 快照创建失败,数据已经无意义了,删除
|
|
|
@@ -108,8 +112,8 @@ public class SnapshotLifecycle {
|
|
|
public void onRemovedEvent(RemovedEvent event) {
|
|
|
Snapshot snapshot = event.getSnapshot();
|
|
|
snapshotDataRepository.deleteBySnapshotId(snapshot.get_id());
|
|
|
- snapshotUsageRepository.deleteByUsedSnapshotId(snapshot.get_id());
|
|
|
- snapshotUsageRepository.deleteByOriginSnapshotId(snapshot.get_id());
|
|
|
+ snapshotUsageRepository.deleteBySnapshotId(snapshot.get_id());
|
|
|
+ snapshotOriginDataRepository.deleteBySnapshotId(snapshot.get_id());
|
|
|
}
|
|
|
|
|
|
@Async
|
|
|
@@ -118,11 +122,11 @@ public class SnapshotLifecycle {
|
|
|
Snapshot snapshot = event.getSnapshot();
|
|
|
SnapshotUsage usage = event.getUsage();
|
|
|
try {
|
|
|
- usage.setStatus(SnapshotUsage.Status.RESTORE);
|
|
|
+ usage.setStatus(SnapshotUsage.Status.RESTORE.name());
|
|
|
snapshotUsageRepository.save(usage);
|
|
|
// 为防止导入过程中有人操作,导致部分数据不一致,在导出前锁定该公司不允许操作
|
|
|
CompanyLockCache.lock(usage.getCompanyId());
|
|
|
- restoreSnapshotData(snapshot);
|
|
|
+ restoreSnapshotData(usage);
|
|
|
SpringContextHolder.getContext().publishEvent(new RestoredEvent(this, snapshot, usage));
|
|
|
} catch (Exception e) {
|
|
|
SpringContextHolder.getContext().publishEvent(new RestoreFailedEvent(this, snapshot, usage, e));
|
|
|
@@ -130,17 +134,17 @@ public class SnapshotLifecycle {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 连接到不同数据中心,查找数据,生成快照数据,删除,使用快照数据写入
|
|
|
+ * 连接到不同数据中心,备份当前数据后删除,使用快照数据写入
|
|
|
*
|
|
|
- * @param snapshot
|
|
|
+ * @param usage
|
|
|
*/
|
|
|
- private void restoreSnapshotData(Snapshot snapshot) {
|
|
|
+ private void restoreSnapshotData(SnapshotUsage usage) {
|
|
|
String dcName = StringUtils.nullIf(CompanyCache.current().getCompany().getDcName(), "default");
|
|
|
List<DataSourceInfo> dss = dataSourceInfoService.findByDcNameUseDefault(dcName);
|
|
|
if (!CollectionUtils.isEmpty(dss)) {
|
|
|
dss.parallelStream().forEach(ds -> {
|
|
|
if ("mysql".equals(ds.getDbType())) {
|
|
|
- mysqlStrategy.imp(snapshot, ds);
|
|
|
+ mysqlStrategy.imp(usage, ds);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
@@ -152,7 +156,7 @@ public class SnapshotLifecycle {
|
|
|
SnapshotUsage usage = event.getUsage();
|
|
|
// 解锁
|
|
|
CompanyLockCache.unlock(usage.getCompanyId());
|
|
|
- usage.setStatus(SnapshotUsage.Status.SUCCESS);
|
|
|
+ usage.setStatus(SnapshotUsage.Status.SUCCESS.name());
|
|
|
snapshotUsageRepository.save(usage);
|
|
|
}
|
|
|
|
|
|
@@ -164,10 +168,35 @@ public class SnapshotLifecycle {
|
|
|
logger.error("failed to restore by snapshot {}", event.getException(), snapshot.get_id());
|
|
|
// 解锁
|
|
|
CompanyLockCache.unlock(usage.getCompanyId());
|
|
|
+ String errMsg = event.getException().getMessage();
|
|
|
// 回滚
|
|
|
- usage.setStatus(SnapshotUsage.Status.FAILED);
|
|
|
- usage.setMessage(event.getException().getMessage());
|
|
|
- snapshotUsageRepository.save(usage);
|
|
|
- // TODO
|
|
|
+ try {
|
|
|
+ usage.setStatus(SnapshotUsage.Status.ROLLBACK.name());
|
|
|
+ snapshotUsageRepository.save(usage);
|
|
|
+ rollbackSnapshotData(usage);
|
|
|
+ } catch (Exception e) {
|
|
|
+ errMsg += " \n rollback error: " + e.getMessage();
|
|
|
+ } finally {
|
|
|
+ usage.setStatus(SnapshotUsage.Status.FAILED.name());
|
|
|
+ usage.setMessage(errMsg);
|
|
|
+ snapshotUsageRepository.save(usage);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 连接到不同数据中心,删除当前数据,使用备份数据写入
|
|
|
+ *
|
|
|
+ * @param usage
|
|
|
+ */
|
|
|
+ private void rollbackSnapshotData(SnapshotUsage usage) {
|
|
|
+ String dcName = StringUtils.nullIf(CompanyCache.current().getCompany().getDcName(), "default");
|
|
|
+ List<DataSourceInfo> dss = dataSourceInfoService.findByDcNameUseDefault(dcName);
|
|
|
+ if (!CollectionUtils.isEmpty(dss)) {
|
|
|
+ dss.parallelStream().forEach(ds -> {
|
|
|
+ if ("mysql".equals(ds.getDbType())) {
|
|
|
+ mysqlStrategy.rollback(usage, ds);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
}
|
|
|
}
|