Skip to content

Draft: Cache pipelines in merge requests

Robert May requested to merge mr-pipeline-caching into master

What does this MR do?

Introduce caching for pipelines in the MR Pipelines tab. This massively cuts the response time, particularly with large numbers of pipelines.

The caching is per-pipeline and the full set are multi-fetched from the cache in a single call. Each entity is cached with a context that should allow the sharing of the cache between different users based on permission levels, which will make this far more effective, at the expense of a slight maintenance overhead.

Our serializer system is a bit of a nightmare for caching and so I've created a new ancestor class for serializers we want to cache, which will return pre-rendered JSON rather than the usual Hash. This requires a slightly odd-looking heredoc in the controller to wrap the rendered JSON, but again I believe the performance benefits to outweigh the cost here.

Also generalises a few cache methods from the API caching helpers so they are used in both places.

It's hard to measure this locally but I expect it to be very effective in fixing a major pain point in larger MRs. On my machine the timing for pipelines.json for 5 pipelines drops from 2.5s to 300ms, YMMV.

Screenshots (strongly suggested)

Does this MR meet the acceptance criteria?

Conformity

Availability and Testing

Security

If this MR contains changes to processing or storing of credentials or tokens, authorization and authentication methods and other items described in the security review guidelines:

  • Label as security and @ mention @gitlab-com/gl-security/appsec
  • The MR includes necessary changes to maintain consistency between UI, API, email, or other methods
  • Security reports checked/validated by a reviewer from the AppSec team
Edited by Robert May

Merge request reports