diff --git a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/server/ALBToReverseProxyArchiveRedirectMapper.java b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/server/ALBToReverseProxyArchiveRedirectMapper.java index 477d76c229f..1143f942c80 100755 --- a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/server/ALBToReverseProxyArchiveRedirectMapper.java +++ b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/server/ALBToReverseProxyArchiveRedirectMapper.java @@ -26,7 +26,7 @@ extends AbstractALBToReverseProxyRedirectMapper reverseProxy, - String hostname, ProcessT master, Optional optionalKeyName, byte[] privateKeyDecryptionPassphrase) { + String hostname, Optional optionalKeyName, byte[] privateKeyDecryptionPassphrase) { super(reverseProxy, hostname, optionalKeyName, privateKeyDecryptionPassphrase); } diff --git a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/server/LandscapeManagementWriteServiceImpl.java b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/server/LandscapeManagementWriteServiceImpl.java index fd4bad0cab4..b5820437db2 100755 --- a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/server/LandscapeManagementWriteServiceImpl.java +++ b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/server/LandscapeManagementWriteServiceImpl.java @@ -721,35 +721,47 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem logger.info("Importing master data from "+from+" to "+archive); final MasterDataImportResult mdiResult = archive.importMasterData(from, from.getLeaderboardGroupIds(), /* override */ true, /* compress */ true, /* import wind */ true, /* import device configurations */ false, /* import tracked races and start tracking */ true, Optional.of(idForProgressTracking)); - final DataImportProgress result = waitForMDICompletionOrError(archive, idForProgressTracking, durationToWaitBeforeCompareServers, + if (mdiResult == null) { + logger.severe("Couldn't find any result for the master data import. Aborting."); + throw new IllegalStateException("Couldn't find any result for the master data import. Aborting archiving of replica set "+from); + } + final DataImportProgress mdiProgress = waitForMDICompletionOrError(archive, idForProgressTracking, durationToWaitBeforeCompareServers, /* log message */ "MDI from "+hostnameFromWhichToArchive+" into "+hostnameOfArchive); - if (result != null && !result.failed() && result.getResult() != null) { + if (mdiProgress != null && !mdiProgress.failed() && mdiProgress.getResult() != null) { logger.info("MDI from "+hostnameFromWhichToArchive+" info "+hostnameOfArchive+" succeeded. Comparing server contents now..."); final CompareServersResult compareServersResult = Wait.wait(()->from.compareServers(Optional.empty(), archive, Optional.of(from.getLeaderboardGroupIds())), csr->!csr.hasDiffs(), /* retryOnException */ true, Optional.of(durationToWaitBeforeCompareServers.times(maxNumberOfCompareServerAttempts)), - durationToWaitBeforeCompareServers, Level.INFO, "Comparing leaderboard groups with IDs "+from.getLeaderboardGroupIds()+ + durationToWaitBeforeCompareServers, Level.INFO, "Comparing leaderboard groups with IDs "+Util.joinStrings(", ", from.getLeaderboardGroupIds())+ " between importing server "+hostnameOfArchive+" and exporting server "+hostnameFromWhichToArchive); if (compareServersResult != null) { if (!compareServersResult.hasDiffs()) { + logger.info("No differences found during comparing server contents. Moving on..."); final Set eventIDs = new HashSet<>(); for (final Iterable eids : Util.map(mdiResult.getLeaderboardGroupsImported(), lgWithEventIds->lgWithEventIds.getEventIds())) { Util.addAll(eids, eventIDs); } + logger.info("Removing remote sailing server references to events on "+from+" with IDs "+eventIDs+" from archive server "+archive); archive.removeRemoteServerEventReferences(from, eventIDs); final AwsRegion region = new AwsRegion(regionId); final ReverseProxy, RotatingFileBasedLog> centralReverseProxy = getLandscape().getCentralReverseProxy(region); - SailingAnalyticsProcess archiveMaster = archiveReplicaSet.getMaster(); // TODO bug5311: when refactoring this for general scope migration, moving to a dedicated replica set will not require this // TODO bug5311: when refactoring this for general scope migration, moving into a cold storage server other than ARCHIVE will require ALBToReverseProxyRedirectMapper instead + logger.info("Adding reverse proxy rules for migrated content pointing to ARCHIVE"); defaultRedirect.accept(new ALBToReverseProxyArchiveRedirectMapper<>( - centralReverseProxy, hostnameFromWhichToArchive, archiveMaster, Optional.ofNullable(optionalKeyName), passphraseForPrivateKeyDecryption)); + centralReverseProxy, hostnameFromWhichToArchive, Optional.ofNullable(optionalKeyName), passphraseForPrivateKeyDecryption)); if (removeApplicationReplicaSet) { + logger.info("Removing the application replica set archived ("+from+") was requested"); final SailingAnalyticsProcess fromMaster = getSailingAnalyticsProcessFromDTO(applicationReplicaSetToArchive.getMaster()); removeApplicationReplicaSet(regionId, applicationReplicaSetToArchive, optionalKeyName, passphraseForPrivateKeyDecryption); final Database fromDatabase = fromMaster.getDatabaseConfiguration(region, WAIT_FOR_PROCESS_TIMEOUT, Optional.ofNullable(optionalKeyName), passphraseForPrivateKeyDecryption); - final Database toDatabase = getMongoEndpoint(moveDatabaseHere).getDatabase(fromDatabase.getName()); - getCopyAndCompareMongoDatabaseBuilder(fromDatabase, toDatabase).run(); + if (moveDatabaseHere != null) { + final Database toDatabase = getMongoEndpoint(moveDatabaseHere).getDatabase(fromDatabase.getName()); + logger.info("Archiving the database content of "+fromDatabase.getConnectionURI()+" to "+toDatabase.getConnectionURI()); + getCopyAndCompareMongoDatabaseBuilder(fromDatabase, toDatabase).run(); + } else { + logger.info("No archiving of database content was requested. Leaving "+fromDatabase.getConnectionURI()+" untouched."); + } } } else { logger.severe("Even after "+maxNumberOfCompareServerAttempts+" attempts and waiting a total of "+ @@ -767,7 +779,7 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem } } else { logger.severe("The Master Data Import (MDI) from "+hostnameFromWhichToArchive+" into "+hostnameOfArchive+ - " did not work"+(result != null ? result.getErrorMessage() : " (no result at all)")); + " did not work"+(mdiProgress != null ? mdiProgress.getErrorMessage() : " (no result at all)")); } return idForProgressTracking; } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/SailingServerImpl.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/SailingServerImpl.java index c5edcabec2c..cae1721831e 100755 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/SailingServerImpl.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/SailingServerImpl.java @@ -131,8 +131,15 @@ public class SailingServerImpl implements SailingServer { final HttpPost importMasterData = new HttpPost(mdiUrl.toString()); importMasterData.setEntity(EntityBuilder.create() .setContentType(ContentType.APPLICATION_FORM_URLENCODED).setParameters(params).build()); - final JSONObject jsonResponse = (JSONObject) getJsonParsedResponse(importMasterData).getA(); - return new MasterDataImportResultJsonDeserializer().deserialize(jsonResponse); + final Pair responseAndStatus = getJsonParsedResponse(importMasterData); + final MasterDataImportResult result; + if (responseAndStatus.getB() >= 200 && responseAndStatus.getB() < 300) { + final JSONObject jsonResponse = (JSONObject) responseAndStatus.getA(); + result = new MasterDataImportResultJsonDeserializer().deserialize(jsonResponse); + } else { + result = null; + } + return result; } @Override @@ -161,10 +168,10 @@ public class SailingServerImpl implements SailingServer { params.add(new BasicNameValuePair(CompareServersResource.LEADERBOARDGROUP_UUID_FORM_PARAM, leaderboardGroupId.toString())); } }); - final HttpPost importMasterData = new HttpPost(compareServersUrl.toString()); - importMasterData.setEntity(EntityBuilder.create().setContentType(ContentType.APPLICATION_FORM_URLENCODED) + final HttpPost compareServersPostRequest = new HttpPost(compareServersUrl.toString()); + compareServersPostRequest.setEntity(EntityBuilder.create().setContentType(ContentType.APPLICATION_FORM_URLENCODED) .setParameters(params).build()); - final JSONObject jsonResponse = (JSONObject) getJsonParsedResponse(importMasterData).getA(); + final JSONObject jsonResponse = (JSONObject) getJsonParsedResponse(compareServersPostRequest).getA(); return new CompareServersResultJsonDeserializer().deserialize(jsonResponse); } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/CompareServersResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/CompareServersResource.java index 654276ebd0a..4b2887c301b 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/CompareServersResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/CompareServersResource.java @@ -306,12 +306,12 @@ public class CompareServersResource extends AbstractSailingServerResource { Iterator iter = ((JSONObject) json).keySet().iterator(); while (iter.hasNext()) { Object key = iter.next(); - final String nextPath = path+"."+key; + final String nextPath = path+key; if (KEYSETTOIGNORE.contains(nextPath)) { iter.remove(); } else { Object value = ((JSONObject) json).get(key); - removeUnnecessaryFields(value, nextPath); + removeUnnecessaryFields(value, nextPath+"."); } } } else if (json instanceof JSONArray) { diff --git a/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/interfaces/DataImportLockWithProgress.java b/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/interfaces/DataImportLockWithProgress.java index 39964a54e93..20fdf86183f 100644 --- a/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/interfaces/DataImportLockWithProgress.java +++ b/java/com.sap.sailing.server.interface/src/com/sap/sailing/server/interfaces/DataImportLockWithProgress.java @@ -33,9 +33,9 @@ import com.sap.sse.concurrent.NamedReentrantReadWriteLock; */ public class DataImportLockWithProgress extends NamedReentrantReadWriteLock { /** - * Defaults to 60s (60000ms). + * Defaults to 60 minutes */ - private static final int TIME_TO_DELETE_PROGRESS_ENTRY_AFTER_OPERATION_FINISHED_IN_MILLIS = 60000; + private static final int TIME_TO_DELETE_PROGRESS_ENTRY_AFTER_OPERATION_FINISHED_IN_MILLIS = 60 * 60000; private static final long serialVersionUID = -3527221613483691340L;