SystemStackError on selecting records from MySQL

Open
#309 8 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
20/100
Issue type
Bug
Clarity
Needs clarification
Activity status
Stale
Tech stack
mysql, ruby
Domain
backend, databases

Research direction

Start with rom/sql/relation.rb:64 and rom/auto_curry.rb:48, then compare them with the reported caller in lib/lf_webapp/repositories/tenants_user_repository.rb:7. Try to reproduce the recursive auto_curry behavior with composite primary keys on MySQL using the listed versions and deployment conditions. Done means identifying the trigger and verifying a fix, or documenting why the environment is required.

Written by the indexing model from the issue text.

Description

I'm using rom as ORM with Hanami.
Recently, I noticed that sometimes server hanged up raising SystemStackError.
I dug into stack trace, and found that auto_curry method was called too many times.

Here is part of the trace:

SystemStackError: stack level too deep
  from rom/sql/relation.rb:64:in `by_pk'
  from rom/auto_curry.rb:48:in `block (2 levels) in auto_curry'
         : 509 times in total
  from rom/auto_curry.rb:48:in `block (2 levels) in auto_curry'
  from lib/lf_webapp/repositories/tenants_user_repository.rb:7:in `find'

And here is the caller:

5  def find(tenant_uuid, user_uuid)
6    tenants_users  # tenants_users is the intermediate table for many_to_many association
7      .by_pk(tenant_uuid, user_uuid)
8      .one
9  end

Things that I know at this point are:

  • The error seems to happen at selecting records from table with composite primary keys
  • The error occurs at certain timing after restarting server. Once occurred, it doesn't become normal unless restarting. (requesting count or memory usage may be related?)
  • The error hasn't occurred in local environment.
  • Invoking tenants_user_repository.find method calls auto_curry only once in local env.

Here is the environment:

  • Server: AWS Elastic Container Service on two t2.micro instances with load balancing
  • Deployment: create docker container in CircleCI and push container image to ECS registry
  • Database: AWS RDS t2.micro instance running MySQL 5.7

Versions:

ruby 2.5.1
hanami 1.2.0
sequel 5.6.0
rom 4.1.3
rom-changeset 1.0.1
rom-core 4.1.2
rom-mapper 1.1.0
rom-repository 2.0.2
rom-sql 2.4.0
Dominant language
Ruby
Stars
220
Forks
97
PR merge metrics
No merged PRs in 30d

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from rom-rb/rom-sql

All issues in rom-rb/rom-sql

Similar issues

More Ruby issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.