Skip to content

Wrap current iterations at a group level into an iteration cadence

Jarka Košanová requested to merge 293921-wrap-iterations into master

What does this MR do?

  • adds the IterationCadence model and respective migration
    • association with Iteration
  • adds migration to wrap iterations under the iteration cadences
    • for every group that contains an iteration create an iteration cadence record. Set iteration_cadence_id to all iterations accordingly

Assigning iterations to a default iteration cadence

  • new iteration cadence is created if none exists for the iteration group
  • when creating, iteration cadence start_date is set to the iteration start date
  • last_run_date is nil

Migrations

Note: Iteration model -> sprints table

Running migrations

Migrations up == 20201228110136 CreateIterationsCadence: migrating ========================== -- create_table(:iterations_cadences, {}) -- quote_column_name(:title) -> 0.0000s -> 0.0162s -- quote_table_name("check_fedff82d3b") -> 0.0000s -- quote_table_name(:iterations_cadences) -> 0.0000s -- execute("ALTER TABLE \"iterations_cadences\"\nADD CONSTRAINT \"check_fedff82d3b\" CHECK (char_length(\"title\") <= 255)\n") -> 0.0013s == 20201228110136 CreateIterationsCadence: migrated (0.0253s) =================

== 20201228110238 AddIterationsCadenceToSprints: migrating ==================== -- column_exists?(:sprints, :iterations_cadence_id) -> 0.0020s -- add_column(:sprints, :iterations_cadence_id, :integer) -> 0.0016s -- transaction_open?() -> 0.0000s -- index_exists?(:sprints, :iterations_cadence_id, {:name=>"index_sprints_iterations_cadence_id", :algorithm=>:concurrently}) -> 0.0068s -- execute("SET statement_timeout TO 0") -> 0.0006s -- add_index(:sprints, :iterations_cadence_id, {:name=>"index_sprints_iterations_cadence_id", :algorithm=>:concurrently}) -> 0.0037s -- execute("RESET ALL") -> 0.0006s -- transaction_open?() -> 0.0000s -- foreign_keys(:sprints) -> 0.0041s -- execute("ALTER TABLE sprints\nADD CONSTRAINT fk_365d1db505\nFOREIGN KEY (iterations_cadence_id)\nREFERENCES iterations_cadences (id)\nON DELETE CASCADE\nNOT VALID;\n") -> 0.0014s -- execute("ALTER TABLE sprints VALIDATE CONSTRAINT fk_365d1db505;") -> 0.0024s == 20201228110238 AddIterationsCadenceToSprints: migrated (0.0294s) ===========

== 20201231133921 ScheduleSetDefaultIterationCadences: migrating ============== == 20201231133921 ScheduleSetDefaultIterationCadences: migrated (0.0380s) =====

Migrations down

== 20201231133921 ScheduleSetDefaultIterationCadences: reverting ============== == 20201231133921 ScheduleSetDefaultIterationCadences: reverted (0.0000s) =====

== 20201228110238 AddIterationsCadenceToSprints: reverting ==================== -- column_exists?(:sprints, :iterations_cadence_id) -> 0.0015s -- remove_column(:sprints, :iterations_cadence_id) -> 0.0022s == 20201228110238 AddIterationsCadenceToSprints: reverted (0.0038s) ===========

== 20201228110136 CreateIterationsCadence: reverting ========================== -- table_exists?(:iterations_cadences) -> 0.0006s -- drop_table(:iterations_cadences) -> 0.0037s == 20201228110136 CreateIterationsCadence: reverted (0.0045s) =================

Queries

Counts

gitlabhq_production=> SELECT COUNT(*) FROM sprints; 
 count
-------
  4041
(1 row)

gitlabhq_production=> SELECT COUNT(DISTINCT sprints.group_id) FROM sprints;
 count
-------
  1724
(1 row)

Scheduling the migration

SELECT DISTINCT "sprints"."group_id" FROM "sprints"

https://explain.depesz.com/s/llU6

Creating Iteration cadences (dev example)

INSERT INTO "iteration_cadences" ("group_id", "duration", "iterations_in_advance", "is_active", "automatic", "title", "start_date", "last_run_date", "created_at", "updated_at")
    VALUES (26, NULL, NULL, TRUE, FALSE, 'Default Iteration Cadence', '2021-02-19', '2021-02-19', '2021-01-25 12:31:20.503342', '2021-01-25 12:31:20.503344'), (27, NULL, NULL, TRUE, FALSE, 'Default Iteration Cadence', '2020-12-30', '2020-12-30', '2021-01-25 12:31:20.516903', '2021-01-25 12:31:20.516904')

Assigning iterations to the cadences (dev example)

  • for each affected group
Iteration Exists? (0.2ms)  SELECT 1 AS one FROM "sprints" WHERE "sprints"."group_id" = 27 LIMIT 1
  Iterations::IterationCadence Load (0.2ms)  SELECT "iteration_cadences".* FROM "iteration_cadences" WHERE "iteration_cadences"."group_id" = 27 LIMIT 1
  Iteration Update All (0.6ms)  UPDATE "sprints" SET "iteration_cadence_id" = 2 WHERE "sprints"."group_id" = 27

Does this MR meet the acceptance criteria?

Conformity

Availability and Testing

Follow-up tasks

Related to #293921 (closed)

Edited by Jarka Košanová

Merge request reports