in elastic-db-tools/src/main/java/com/microsoft/azure/elasticdb/shard/storeops/recovery/ReplaceMappingsLocalOperation.java [137:205]
private List<StoreMapping> getMappingsToPurge(IStoreTransactionScope ts) {
List<StoreMapping> lsmMappings;
StoreResults result;
if (rangesToRemove == null) {
// If no ranges are specified, get all the mappings for the shard.
result = ts.executeOperation(StoreOperationRequestBuilder.SP_GET_ALL_SHARD_MAPPINGS_LOCAL,
StoreOperationRequestBuilder.getAllShardMappingsLocal(shardMap, shard, null));
if (result.getResult() != StoreResult.Success) {
// Possible errors are:
// StoreResult.ShardMapDoesNotExist
// StoreResult.StoreVersionMismatch
// StoreResult.MissingParametersForStoredProcedure
throw StoreOperationErrorHandler.onRecoveryErrorLocal(result, shardMap, this.getLocation(), ShardManagementErrorCategory.Recovery,
this.getOperationName(), StoreOperationRequestBuilder.SP_GET_ALL_SHARD_MAPPINGS_LOCAL);
}
lsmMappings = result.getStoreMappings();
}
else {
// If any ranges are specified, only delete intersected ranges.
Map<ShardRange, StoreMapping> mappingsToPurge = new HashMap<>();
for (ShardRange range : rangesToRemove) {
switch (shardMap.getMapType()) {
case Range:
result = ts.executeOperation(StoreOperationRequestBuilder.SP_GET_ALL_SHARD_MAPPINGS_LOCAL,
StoreOperationRequestBuilder.getAllShardMappingsLocal(shardMap, shard, range));
break;
default:
assert shardMap.getMapType() == ShardMapType.List;
result = ts.executeOperation(StoreOperationRequestBuilder.SP_FIND_SHARD_MAPPING_BY_KEY_LOCAL, StoreOperationRequestBuilder
.findShardMappingByKeyLocal(shardMap, ShardKey.fromRawValue(shardMap.getKeyType(), range.getLow().getRawValue())));
break;
}
if (result.getResult() != StoreResult.Success) {
if (result.getResult() != StoreResult.MappingNotFoundForKey) {
// Possible errors are:
// StoreResult.ShardMapDoesNotExist
// StoreResult.StoreVersionMismatch
// StoreResult.MissingParametersForStoredProcedure
throw StoreOperationErrorHandler.onRecoveryErrorLocal(result, shardMap, this.getLocation(),
ShardManagementErrorCategory.Recovery, this.getOperationName(),
shardMap.getMapType() == ShardMapType.Range ? StoreOperationRequestBuilder.SP_GET_ALL_SHARD_MAPPINGS_LOCAL
: StoreOperationRequestBuilder.SP_FIND_SHARD_MAPPING_BY_KEY_LOCAL);
}
else {
// No intersections being found is fine. Skip to the next mapping.
assert shardMap.getMapType() == ShardMapType.List;
}
}
else {
for (StoreMapping mapping : result.getStoreMappings()) {
ShardRange intersectedRange = new ShardRange(ShardKey.fromRawValue(shardMap.getKeyType(), mapping.getMinValue()),
ShardKey.fromRawValue(shardMap.getKeyType(), mapping.getMaxValue()));
mappingsToPurge.put(intersectedRange, mapping);
}
}
}
lsmMappings = new ArrayList<>(mappingsToPurge.values());
}
return lsmMappings;
}