Skip to content

Commit 1c5eee0

Browse files
Synchronize repository - 2024-02-16
1 parent 1b5e053 commit 1c5eee0

20 files changed

+188
-37
lines changed

commercedbsync/resources/commercedbsync-items.xml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,18 @@
100100
<persistence type="property"/>
101101
<modifiers optional="false"/>
102102
<defaultvalue>false</defaultvalue>
103-
</attribute>
103+
</attribute>
104+
<attribute qualifier="resumeMigration" type="boolean">
105+
<description>Resume a failed migration</description>
106+
<persistence type="property" />
107+
<modifiers optional="true"/>
108+
<defaultvalue>false</defaultvalue>
109+
</attribute>
110+
<attribute qualifier="migrationId" type="java.lang.String" >
111+
<description>Migration Id for the job</description>
112+
<persistence type="property" />
113+
<modifiers optional="true"/>
114+
</attribute>
104115
</attributes>
105116
</itemtype>
106117

commercedbsync/resources/commercedbsync-spring.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@
315315

316316
<bean id="fullMigrationJob" class="com.sap.cx.boosters.commercedbsync.jobs.FullMigrationJob"
317317
parent="abstractMigrationJobPerformable">
318+
<property name="modelService" ref="modelService"/>
318319
</bean>
319320

320321
<!-- <bean id="defaultCMTRemoveInterceptor"-->

commercedbsync/resources/localization/commercedbsync-locales_en.properties

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,9 @@ type.MigrationCronJob.maxWriterWorkers.description=Number of writer workers to b
3030

3131
type.MigrationCronJob.batchSize.name=Batch Size
3232
type.MigrationCronJob.batchSize.description=Batch size used to query data
33+
34+
type.FullMigrationCronJob.resumeMigration.name=Resume Migration
35+
type.FullMigrationCronJob.resumeMigration.description=
36+
37+
type.FullMigrationCronJob.migrationId.name=Migration ID
38+
type.FullMigrationCronJob.migrationId.description=

commercedbsync/src/com/sap/cx/boosters/commercedbsync/jobs/AbstractMigrationJobPerformable.java

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,41 @@ public abstract class AbstractMigrationJobPerformable extends AbstractJobPerform
7474
@Override
7575
public boolean isPerformable() {
7676
for (CronJobModel cronJob : getCronJobService().getRunningOrRestartedCronJobs()) {
77+
currentMigrationId = databaseMigrationService.getMigrationID(migrationContext);
78+
7779
if ((cronJob instanceof IncrementalMigrationCronJobModel || cronJob instanceof FullMigrationCronJobModel)) {
78-
LOG.info("Previous migrations job already running {} and Type {} ", cronJob.getCode(),
79-
cronJob.getItemtype());
80+
if (isJobStateAborted(cronJob)) {
81+
try {
82+
abortCurrentMigration();
83+
databaseMigrationService.markRemainingTasksAborted(migrationContext, currentMigrationId);
84+
clearAbortRequestedIfNeeded(cronJob);
85+
86+
LOG.info("Migration with ID: {} was marked as aborted", currentMigrationId);
87+
} catch (Exception e) {
88+
LOG.warn("Failed to abort current migration");
89+
LOG.debug("Migration abort failed", e);
90+
}
91+
} else {
92+
LOG.info("Previous migration job already running {} and type {}", cronJob.getCode(),
93+
cronJob.getItemtype());
94+
}
8095
return false;
8196
}
8297
}
98+
99+
if (StringUtils.isNotEmpty(currentMigrationId)) {
100+
try {
101+
if (databaseMigrationService.getMigrationState(migrationContext, currentMigrationId)
102+
.getStatus() == MigrationProgress.RUNNING) {
103+
LOG.info("Previous migration already running, ID: {}", currentMigrationId);
104+
return false;
105+
}
106+
} catch (Exception e) {
107+
LOG.warn("Unable to fetch current migration status");
108+
LOG.debug("Migration status fetch failed", e);
109+
}
110+
}
111+
83112
return true;
84113
}
85114

@@ -199,13 +228,12 @@ protected MigrationStatus waitForFinishCronjobs(IncrementalMigrationContext cont
199228
} while (StringUtils.equalsAnyIgnoreCase(status.getStatus().toString(), RUNNING_MIGRATION));
200229

201230
if (aborted) {
202-
LOG.info(" Aborted ...STOPPING migration ");
203-
databaseMigrationService.stopMigration(migrationContext, currentMigrationId);
231+
abortCurrentMigration();
232+
clearAbortRequestedIfNeeded(cronJobModel);
204233
LOG.error("Database migration has been ABORTED, Migration State= " + status + ", Total Tasks "
205234
+ status.getTotalTasks() + ", migration id =" + status.getMigrationID() + ", Completed Tasks "
206235
+ status.getCompletedTasks());
207-
clearAbortRequestedIfNeeded(cronJobModel);
208-
throw new AbortCronJobException("CronJOB ABORTED");
236+
throw new AbortCronJobException("Cronjob ABORTED");
209237
}
210238

211239
if (status.isFailed()) {
@@ -218,6 +246,11 @@ protected MigrationStatus waitForFinishCronjobs(IncrementalMigrationContext cont
218246
return status;
219247
}
220248

249+
private void abortCurrentMigration() throws Exception {
250+
LOG.info("Aborted ...STOPPING migration");
251+
databaseMigrationService.stopMigration(migrationContext, currentMigrationId);
252+
}
253+
221254
protected LaunchOptions createLaunchOptions(MigrationCronJobModel migrationCronJob) {
222255
final LaunchOptions launchOptions = new LaunchOptions();
223256

@@ -240,8 +273,8 @@ private void putLaunchOptionProperty(final LaunchOptions launchOptions, String p
240273

241274
protected boolean isJobStateAborted(final CronJobModel cronJobModel) {
242275
this.modelService.refresh(cronJobModel);
243-
LOG.info("cron job status = " + cronJobModel.getStatus());
244-
LOG.info("cron job request to abort =" + cronJobModel.getRequestAbort());
276+
LOG.info("Cron job status: {}", cronJobModel.getStatus());
277+
LOG.info("Cron job request to abort: {}", BooleanUtils.isTrue(cronJobModel.getRequestAbort()));
245278
return ((cronJobModel.getStatus() == CronJobStatus.ABORTED)
246279
|| (cronJobModel.getRequestAbort() != null && cronJobModel.getRequestAbort()));
247280
}

commercedbsync/src/com/sap/cx/boosters/commercedbsync/jobs/FullMigrationJob.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@
77
package com.sap.cx.boosters.commercedbsync.jobs;
88

99
import com.google.common.base.Preconditions;
10+
import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants;
1011
import com.sap.cx.boosters.commercedbsync.context.IncrementalMigrationContext;
12+
import com.sap.cx.boosters.commercedbsync.context.LaunchOptions;
1113
import de.hybris.platform.cronjob.enums.CronJobResult;
1214
import de.hybris.platform.cronjob.enums.CronJobStatus;
1315
import de.hybris.platform.cronjob.jalo.AbortCronJobException;
1416
import de.hybris.platform.cronjob.model.CronJobModel;
1517
import de.hybris.platform.servicelayer.cronjob.PerformResult;
1618
import com.sap.cx.boosters.commercedbsync.model.cron.FullMigrationCronJobModel;
19+
import de.hybris.platform.servicelayer.model.ModelService;
1720
import org.slf4j.Logger;
1821
import org.slf4j.LoggerFactory;
1922

@@ -24,6 +27,12 @@ public class FullMigrationJob extends AbstractMigrationJobPerformable {
2427

2528
private static final Logger LOG = LoggerFactory.getLogger(FullMigrationJob.class);
2629

30+
private final ModelService modelService;
31+
32+
public FullMigrationJob(final ModelService modelService) {
33+
this.modelService = modelService;
34+
}
35+
2736
@Override
2837
public PerformResult perform(final CronJobModel cronJobModel) {
2938
FullMigrationCronJobModel fullMigrationCronJobModel;
@@ -54,9 +63,24 @@ public PerformResult perform(final CronJobModel cronJobModel) {
5463
incrementalMigrationContext.setIncrementalModeEnabled(false);
5564
incrementalMigrationContext
5665
.setFullDatabaseMigrationEnabled(fullMigrationCronJobModel.isFullDatabaseMigration());
57-
currentMigrationId = databaseMigrationService.startMigration(incrementalMigrationContext,
58-
createLaunchOptions(fullMigrationCronJobModel));
66+
final LaunchOptions launchOptions = createLaunchOptions(fullMigrationCronJobModel);
5967

68+
if (fullMigrationCronJobModel.isResumeMigration()) {
69+
currentMigrationId = fullMigrationCronJobModel.getMigrationId();
70+
Preconditions.checkNotNull(currentMigrationId,
71+
"Migration ID must be present to resume failed migration job");
72+
launchOptions.getPropertyOverrideMap().put(CommercedbsyncConstants.MIGRATION_SCHEDULER_RESUME_ENABLED,
73+
true);
74+
databaseMigrationService.resumeUnfinishedMigration(incrementalMigrationContext, launchOptions,
75+
currentMigrationId);
76+
LOG.info("Resumed Migration {}", currentMigrationId);
77+
} else {
78+
currentMigrationId = databaseMigrationService.startMigration(incrementalMigrationContext,
79+
launchOptions);
80+
LOG.info("Started Migration {}", currentMigrationId);
81+
fullMigrationCronJobModel.setMigrationId(currentMigrationId);
82+
modelService.save(fullMigrationCronJobModel);
83+
}
6084
waitForFinishCronjobs(incrementalMigrationContext, currentMigrationId, cronJobModel);
6185
} catch (final AbortCronJobException e) {
6286
return new PerformResult(CronJobResult.ERROR, CronJobStatus.ABORTED);

commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/impl/TransformFunctionGeneratorPreProcessor.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,21 @@ public void process(final CopyContext context) {
3434
}
3535

3636
private String getPlatformSpecificSQL(final DataBaseProvider databaseProvider) {
37-
String platformSpecificSQL = "mssql-general.sql";
38-
if (databaseProvider.isHanaUsed() || databaseProvider.isOracleUsed() || databaseProvider.isPostgreSqlUsed()) {
39-
platformSpecificSQL = null;
37+
String platformSpecificSQL = null;
38+
39+
if (databaseProvider.isMssqlUsed()) {
40+
platformSpecificSQL = "mssql-general.sql";
4041
}
4142

42-
LOG.info("Identified platform specific transformation function SQL {}", platformSpecificSQL);
43+
LOG.info("Identified platform specific transformation function SQL: {}",
44+
StringUtils.defaultIfEmpty(platformSpecificSQL, "<none>"));
4345

4446
return platformSpecificSQL;
4547
}
4648

4749
@Override
4850
public boolean shouldExecute(CopyContext context) {
49-
return context.getMigrationContext().isDataExportEnabled();
51+
return context.getMigrationContext().isDataExportEnabled()
52+
&& context.getMigrationContext().getDataSourceRepository().getDatabaseProvider().isMssqlUsed();
5053
}
5154
}

commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/impl/TypeInfoTableGeneratorPreProcessor.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,19 @@ public void process(final CopyContext context) {
6868

6969
@Override
7070
public boolean shouldExecute(CopyContext context) {
71-
return context.getMigrationContext().isDataExportEnabled();
71+
return context.getMigrationContext().isDataExportEnabled()
72+
&& context.getMigrationContext().getDataSourceRepository().getDatabaseProvider().isMssqlUsed();
7273
}
7374

7475
private String getPlatformSpecificSQL(final DataBaseProvider databaseProvider) {
75-
String platformSpecificSQL = "mssql-typeinfotable.sql";
76-
if (databaseProvider.isHanaUsed() || databaseProvider.isOracleUsed() || databaseProvider.isPostgreSqlUsed()) {
77-
platformSpecificSQL = null;
76+
String platformSpecificSQL = null;
77+
78+
if (databaseProvider.isMssqlUsed()) {
79+
platformSpecificSQL = "mssql-typeinfotable.sql";
7880
}
7981

80-
LOG.info("Identified platform specific typeinfo table SQL {}", platformSpecificSQL);
82+
LOG.info("Identified platform specific typeinfo table SQL: {}",
83+
StringUtils.defaultIfEmpty(platformSpecificSQL, "<none>"));
8184

8285
return platformSpecificSQL;
8386
}

commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/HanaDataRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public String getDatabaseTimezone() {
9696
return rs.getString("VALUE");
9797
}
9898
} catch (Exception e) {
99-
e.getMessage();
99+
LOG.warn("Failed to check database timezone", e);
100100
}
101101
return null;
102102
}

commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/MySQLDataRepository.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import de.hybris.bootstrap.ddl.DatabaseSettings;
1919
import de.hybris.bootstrap.ddl.HybrisPlatform;
2020
import org.apache.ddlutils.Platform;
21+
import org.slf4j.Logger;
22+
import org.slf4j.LoggerFactory;
2123
import org.springframework.core.io.Resource;
2224
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
2325

@@ -28,6 +30,8 @@
2830
import java.util.List;
2931

3032
public class MySQLDataRepository extends AbstractDataRepository {
33+
private static final Logger LOG = LoggerFactory.getLogger(MySQLDataRepository.class);
34+
3135
public MySQLDataRepository(MigrationContext migrationContext, DataSourceConfiguration dataSourceConfiguration,
3236
DatabaseMigrationDataTypeMapperService databaseMigrationDataTypeMapperService) {
3337
super(migrationContext, dataSourceConfiguration, databaseMigrationDataTypeMapperService);
@@ -149,7 +153,7 @@ public String getDatabaseTimezone() {
149153
return rs.getString("timezone");
150154
}
151155
} catch (Exception e) {
152-
e.getMessage();
156+
LOG.warn("Failed to check database timezone", e);
153157
}
154158
return null;
155159
}

commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/NullRepository.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,6 @@ public String buildBulkUpsertStatement(String table, List<String> columnsToCopy,
240240

241241
@Override
242242
public String getDatabaseTimezone() {
243-
244243
return null;
245244
}
246245

0 commit comments

Comments
 (0)