[
https://issues.apache.org/jira/browse/AURORA-1912?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Zameer Manji reassigned AURORA-1912:
------------------------------------
Assignee: Zameer Manji
> DbSnapShot may remove enum values
> ---------------------------------
>
> Key: AURORA-1912
> URL: https://issues.apache.org/jira/browse/AURORA-1912
> Project: Aurora
> Issue Type: Bug
> Reporter: Zameer Manji
> Assignee: Zameer Manji
>
> The dbnsapshot restore may truncate enum tables and cause referential
> integrity issues. From the code it restores from the SQL dump by first
> dropping all tables:
> {noformat}
> try (Connection c = ((DataSource)
> store.getUnsafeStoreAccess()).getConnection()) {
> LOG.info("Dropping all tables");
> try (PreparedStatement drop = c.prepareStatement("DROP ALL
> OBJECTS")) {
> drop.executeUpdate();
> }
> {noformat}
> However a freshly started leader will have some data in there from preparing
> the storage:
> {noformat}
> @Override
> @Transactional
> protected void startUp() throws IOException {
> Configuration configuration = sessionFactory.getConfiguration();
> String createStatementName = "create_tables";
> configuration.setMapUnderscoreToCamelCase(true);
> // The ReuseExecutor will cache jdbc Statements with equivalent SQL,
> improving performance
> // slightly when redundant queries are made.
> configuration.setDefaultExecutorType(ExecutorType.REUSE);
> addMappedStatement(
> configuration,
> createStatementName,
> CharStreams.toString(new InputStreamReader(
> DbStorage.class.getResourceAsStream("schema.sql"),
> StandardCharsets.UTF_8)));
> try (SqlSession session = sessionFactory.openSession()) {
> session.update(createStatementName);
> }
> for (CronCollisionPolicy policy : CronCollisionPolicy.values()) {
> enumValueMapper.addEnumValue("cron_policies", policy.getValue(),
> policy.name());
> }
> for (MaintenanceMode mode : MaintenanceMode.values()) {
> enumValueMapper.addEnumValue("maintenance_modes", mode.getValue(),
> mode.name());
> }
> for (JobUpdateStatus status : JobUpdateStatus.values()) {
> enumValueMapper.addEnumValue("job_update_statuses", status.getValue(),
> status.name());
> }
> for (JobUpdateAction action : JobUpdateAction.values()) {
> enumValueMapper.addEnumValue("job_instance_update_actions",
> action.getValue(), action.name());
> }
> for (ScheduleStatus status : ScheduleStatus.values()) {
> enumValueMapper.addEnumValue("task_states", status.getValue(),
> status.name());
> }
> for (ResourceType resourceType : ResourceType.values()) {
> enumValueMapper.addEnumValue("resource_types", resourceType.getValue(),
> resourceType.name());
> }
> for (Mode mode : Mode.values()) {
> enumValueMapper.addEnumValue("volume_modes", mode.getValue(),
> mode.name());
> }
> createPoolMetrics();
> }
> {noformat}
> Consider the case where we add a new value to an existing enum. This means
> restoring from a snapshot will not allow us to have that value in the enum
> table.
> To fix this we should have a migration for every enum value we add. However
> to me it seems that the better idea would be to update the enum tables after
> we restore from a snapshot.
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)