Module: FastDestroyAll

Extended by:
ActiveSupport::Concern
Included in:
Ci::BuildTraceChunk, Deployment
Defined in:
app/models/concerns/fast_destroy_all.rb

Overview

This module is for replacing `dependent: :destroy` and `before_destroy` hooks.

In general, `destroy_all` is inefficient because it calls each callback with `DELETE` queries i.e. O(n), whereas, `delete_all` is efficient as it deletes all rows with a single `DELETE` query.

It's better to use `delete_all` as our best practice, however, if external data (e.g. ObjectStorage, FileStorage or Redis) are associated with database records, it is difficult to accomplish it.

This module defines a format to use `delete_all` and delete associated external data. Here is an example

Situation

  • `Project` has many `Ci::BuildTraceChunk` through `Ci::Build`

  • `Ci::BuildTraceChunk` stores associated data in Redis, so it relies on `dependent: :destroy` and `before_destroy` for the deletion

How to use

  • Define `use_fast_destroy :build_trace_chunks` in `Project` model.

  • Define `begin_fast_destroy` and `finalize_fast_destroy(params)` in `Ci::BuildTraceChunk` model.

  • Use `fast_destroy_all` instead of `destroy` and `destroy_all`

  • Remove `dependent: :destroy` and `before_destroy` as it's no longer need

Expectation

  • When a project is `destroy`ed, the associated trace_chunks will be deleted by `delete_all`, and the associated data will be removed, too.

  • When `fast_destroy_all` is called, it also performns as same.

Defined Under Namespace

Modules: Helpers

Constant Summary collapse

ForbiddenActionError =
Class.new(StandardError)