[ 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)