Content
View differences
Updated by Christophe Bliard about 1 year ago
### Steps to reproduce
* Create 3 work packages: 1 parent and 2 children.
* Go to work packages list view
* Use the left handle on the parent and drag&drop it between the 2 children
* This will try to set itself as a parent
Alternate reproduction path:
* Create 2 work packages, one parent and one child
* Note the id of the parent
* Select them in work packages list (Ctrl/Command + Click to multi-select in work packages list) and select bulk edit
* In bulk edit, in Parent, enter the id of the parent work package noted before
* Click Save
### What is the buggy behavior?
* Error 500 (after after 30 seconds of lag for me in dev). lag.
* It tries to set itself as a parent (or as a child, it depends how you see things), and somewhere in the process, it tries to compute some scheduling information which leads to an endless loop (trying to find its ancestors) which ultimately leads to a SystemStackError and a 500.
### What is the expected behavior?
* Drag and dropping a parent to make it a child of itself should be prohibited, or detected early.
### **Screenshots**
A video recording demonstrating the issue is attached to this bug.
### **Logs**
This has been seen on AppSignal:
* [https://appsignal.com/openproject-gmbh/sites/674718f1d2a5e4a7cb8b2298/exceptions/incidents/1024](https://appsignal.com/openproject-gmbh/sites/674718f1d2a5e4a7cb8b2298/exceptions/incidents/1024)
* [https://appsignal.com/openproject-gmbh/sites/674718f1d2a5e4a7cb8b2298/exceptions/incidents/969](https://appsignal.com/openproject-gmbh/sites/674718f1d2a5e4a7cb8b2298/exceptions/incidents/969)
* [https://appsignal.com/openproject-gmbh/sites/673c8be183eb67dcd6c4e75d/exceptions/incidents/1177](https://appsignal.com/openproject-gmbh/sites/673c8be183eb67dcd6c4e75d/exceptions/incidents/1177)
* https://appsignal.com/openproject-gmbh/sites/673c8be183eb67dcd6c4e75d/exceptions/incidents/1176
```text
app/services/work_packages/schedule_dependency.rb:122 Array#each
app/services/work_packages/schedule_dependency.rb:122 Enumerable#flat_map
app/services/work_packages/schedule_dependency.rb:122 WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 block in WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 Array#each
app/services/work_packages/schedule_dependency.rb:122 Enumerable#flat_map
app/services/work_packages/schedule_dependency.rb:122 WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 block in WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 Array#each
app/services/work_packages/schedule_dependency.rb:122 Enumerable#flat_map
app/services/work_packages/schedule_dependency.rb:122 WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 block in WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 Array#each
app/services/work_packages/schedule_dependency.rb:122 Enumerable#flat_map
app/services/work_packages/schedule_dependency.rb:122 WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 block in WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 Array#each
app/services/work_packages/schedule_dependency.rb:122 Enumerable#flat_map
app/services/work_packages/schedule_dependency.rb:122 WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 block in WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 Array#each
app/services/work_packages/schedule_dependency.rb:122 Enumerable#flat_map
app/services/work_packages/schedule_dependency.rb:122 WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 block in WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 Array#each
app/services/work_packages/schedule_dependency.rb:122 Enumerable#flat_map
app/services/work_packages/schedule_dependency.rb:122 WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 block in WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 Array#each
app/services/work_packages/schedule_dependency.rb:122 Enumerable#flat_map
app/services/work_packages/schedule_dependency.rb:122 WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 block in WorkPackages::ScheduleDependency#descendants
...
app/services/work_packages/schedule_dependency.rb:122:in 'block in WorkPackages::ScheduleDependency#descendants'
app/services/work_packages/schedule_dependency.rb:122:in 'Array#each'
app/services/work_packages/schedule_dependency.rb:122:in 'Enumerable#flat_map'
app/services/work_packages/schedule_dependency.rb:122:in 'WorkPackages::ScheduleDependency#descendants'
app/services/work_packages/schedule_dependency/dependency.rb:81:in 'WorkPackages::ScheduleDependency::Dependency#descendants'
app/services/work_packages/schedule_dependency/dependency.rb:85:in 'WorkPackages::ScheduleDependency::Dependency#alive_descendants'
app/services/work_packages/schedule_dependency/dependency.rb:71:in 'WorkPackages::ScheduleDependency::Dependency#has_descendants?'
app/services/work_packages/set_schedule_service.rb:111:in 'WorkPackages::SetScheduleService#reschedule'
app/services/work_packages/set_schedule_service.rb:88:in 'block in WorkPackages::SetScheduleService#schedule_following'
app/services/work_packages/schedule_dependency.rb:62:in 'block in WorkPackages::ScheduleDependency#in_schedule_order'
app/services/work_packages/schedule_dependency.rb:61:in 'Array#each'
app/services/work_packages/schedule_dependency.rb:61:in 'WorkPackages::ScheduleDependency#in_schedule_order'
app/services/work_packages/set_schedule_service.rb:85:in 'WorkPackages::SetScheduleService#schedule_following'
app/services/work_packages/set_schedule_service.rb:43:in 'WorkPackages::SetScheduleService#call'
app/services/work_packages/set_attributes_service.rb:292:in 'WorkPackages::SetAttributesService#update_dates_from_rescheduled_children'
app/services/work_packages/set_attributes_service.rb:275:in 'WorkPackages::SetAttributesService#update_dates'
app/services/work_packages/set_attributes_service.rb:70:in 'WorkPackages::SetAttributesService#set_calculated_attributes'
app/services/work_packages/set_attributes_service.rb:44:in 'block in WorkPackages::SetAttributesService#set_attributes'
lib/open_project/changed_by_system.rb:87:in 'OpenProject::ChangedBySystem#change_by_system'
app/services/work_packages/set_attributes_service.rb:43:in 'WorkPackages::SetAttributesService#set_attributes'
modules/backlogs/lib/open_project/backlogs/patches/set_attributes_service_patch.rb:36:in 'OpenProject::Backlogs::Patches::SetAttributesServicePatch::InstanceMethods#set_attributes'
app/services/base_services/set_attributes.rb:44:in 'BaseServices::SetAttributes#perform'
app/services/base_services/base_callable.rb:40:in 'block in BaseServices::BaseCallable#call'
app/services/concerns/with_reversible_state.rb:53:in 'BaseServices::BaseCallable#assign_state'
app/services/base_services/base_callable.rb:39:in 'BaseServices::BaseCallable#call'
app/services/base_services/write.rb:60:in 'BaseServices::Write#set_attributes'
app/services/attachments/replace_attachments.rb:37:in 'WorkPackages::UpdateService#set_attributes'
app/services/base_services/write.rb:51:in 'BaseServices::Write#before_perform'
app/services/base_services/base_contracted.rb:61:in 'block in BaseServices::BaseContracted#perform'
app/models/journal/notification_configuration.rb:62:in 'Journal::NotificationConfiguration.with_first'
app/models/journal/notification_configuration.rb:45:in 'Journal::NotificationConfiguration.with'
app/services/shared/service_context.rb:67:in 'block in Shared::ServiceContext#without_context_transaction'
lib/open_project/locale_helper.rb:36:in 'OpenProject::LocaleHelper.with_locale_for'
app/models/user.rb:538:in 'User.execute_as'
app/services/shared/service_context.rb:66:in 'Shared::ServiceContext#without_context_transaction'
app/services/shared/service_context.rb:45:in 'block in Shared::ServiceContext#in_mutex_context'
lib/open_project/mutex.rb:71:in 'block in OpenProject::Mutex.with_advisory_lock'
lib/open_project/mutex.rb:69:in 'OpenProject::Mutex.with_advisory_lock'
lib/open_project/mutex.rb:63:in 'block in OpenProject::Mutex.with_advisory_lock_transaction'
lib/open_project/mutex.rb:62:in 'OpenProject::Mutex.with_advisory_lock_transaction'
app/services/shared/service_context.rb:44:in 'Shared::ServiceContext#in_mutex_context'
app/services/shared/service_context.rb:35:in 'Shared::ServiceContext#in_context'
app/services/base_services/base_contracted.rb:54:in 'BaseServices::BaseContracted#service_context'
app/services/base_services/base_contracted.rb:59:in 'BaseServices::BaseContracted#perform'
app/services/base_services/base_callable.rb:40:in 'block in BaseServices::BaseCallable#call'
app/services/concerns/with_reversible_state.rb:53:in 'BaseServices::BaseCallable#assign_state'
app/services/base_services/base_callable.rb:39:in 'BaseServices::BaseCallable#call'
lib/api/utilities/endpoints/bodied.rb:117:in 'API::Utilities::Endpoints::Bodied#process'
lib/api/utilities/endpoints/bodied.rb:90:in 'block in mount'
```
* Create 3 work packages: 1 parent and 2 children.
* Go to work packages list view
* Use the left handle on the parent and drag&drop it between the 2 children
* This will try to set itself as a parent
Alternate reproduction path:
* Create 2 work packages, one parent and one child
* Note the id of the parent
* Select them in work packages list (Ctrl/Command + Click to multi-select in work packages list) and select bulk edit
* In bulk edit, in Parent, enter the id of the parent work package noted before
* Click Save
### What is the buggy behavior?
* Error 500 (after
* It tries to set itself as a parent (or as a child, it depends how you see things), and somewhere in the process, it tries to compute some scheduling information which leads to an endless loop (trying to find its ancestors) which ultimately leads to a SystemStackError and a 500.
### What is the expected behavior?
* Drag and dropping a parent to make it a child of itself should be prohibited, or detected early.
### **Screenshots**
A video recording demonstrating the issue is attached to this bug.
### **Logs**
This has been seen on AppSignal:
* [https://appsignal.com/openproject-gmbh/sites/674718f1d2a5e4a7cb8b2298/exceptions/incidents/1024](https://appsignal.com/openproject-gmbh/sites/674718f1d2a5e4a7cb8b2298/exceptions/incidents/1024)
* [https://appsignal.com/openproject-gmbh/sites/674718f1d2a5e4a7cb8b2298/exceptions/incidents/969](https://appsignal.com/openproject-gmbh/sites/674718f1d2a5e4a7cb8b2298/exceptions/incidents/969)
* [https://appsignal.com/openproject-gmbh/sites/673c8be183eb67dcd6c4e75d/exceptions/incidents/1177](https://appsignal.com/openproject-gmbh/sites/673c8be183eb67dcd6c4e75d/exceptions/incidents/1177)
* https://appsignal.com/openproject-gmbh/sites/673c8be183eb67dcd6c4e75d/exceptions/incidents/1176
```text
app/services/work_packages/schedule_dependency.rb:122 Array#each
app/services/work_packages/schedule_dependency.rb:122 Enumerable#flat_map
app/services/work_packages/schedule_dependency.rb:122 WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 block in WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 Array#each
app/services/work_packages/schedule_dependency.rb:122 Enumerable#flat_map
app/services/work_packages/schedule_dependency.rb:122 WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 block in WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 Array#each
app/services/work_packages/schedule_dependency.rb:122 Enumerable#flat_map
app/services/work_packages/schedule_dependency.rb:122 WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 block in WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 Array#each
app/services/work_packages/schedule_dependency.rb:122 Enumerable#flat_map
app/services/work_packages/schedule_dependency.rb:122 WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 block in WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 Array#each
app/services/work_packages/schedule_dependency.rb:122 Enumerable#flat_map
app/services/work_packages/schedule_dependency.rb:122 WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 block in WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 Array#each
app/services/work_packages/schedule_dependency.rb:122 Enumerable#flat_map
app/services/work_packages/schedule_dependency.rb:122 WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 block in WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 Array#each
app/services/work_packages/schedule_dependency.rb:122 Enumerable#flat_map
app/services/work_packages/schedule_dependency.rb:122 WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 block in WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 Array#each
app/services/work_packages/schedule_dependency.rb:122 Enumerable#flat_map
app/services/work_packages/schedule_dependency.rb:122 WorkPackages::ScheduleDependency#descendants
app/services/work_packages/schedule_dependency.rb:122 block in WorkPackages::ScheduleDependency#descendants
...
app/services/work_packages/schedule_dependency.rb:122:in 'block in WorkPackages::ScheduleDependency#descendants'
app/services/work_packages/schedule_dependency.rb:122:in 'Array#each'
app/services/work_packages/schedule_dependency.rb:122:in 'Enumerable#flat_map'
app/services/work_packages/schedule_dependency.rb:122:in 'WorkPackages::ScheduleDependency#descendants'
app/services/work_packages/schedule_dependency/dependency.rb:81:in 'WorkPackages::ScheduleDependency::Dependency#descendants'
app/services/work_packages/schedule_dependency/dependency.rb:85:in 'WorkPackages::ScheduleDependency::Dependency#alive_descendants'
app/services/work_packages/schedule_dependency/dependency.rb:71:in 'WorkPackages::ScheduleDependency::Dependency#has_descendants?'
app/services/work_packages/set_schedule_service.rb:111:in 'WorkPackages::SetScheduleService#reschedule'
app/services/work_packages/set_schedule_service.rb:88:in 'block in WorkPackages::SetScheduleService#schedule_following'
app/services/work_packages/schedule_dependency.rb:62:in 'block in WorkPackages::ScheduleDependency#in_schedule_order'
app/services/work_packages/schedule_dependency.rb:61:in 'Array#each'
app/services/work_packages/schedule_dependency.rb:61:in 'WorkPackages::ScheduleDependency#in_schedule_order'
app/services/work_packages/set_schedule_service.rb:85:in 'WorkPackages::SetScheduleService#schedule_following'
app/services/work_packages/set_schedule_service.rb:43:in 'WorkPackages::SetScheduleService#call'
app/services/work_packages/set_attributes_service.rb:292:in 'WorkPackages::SetAttributesService#update_dates_from_rescheduled_children'
app/services/work_packages/set_attributes_service.rb:275:in 'WorkPackages::SetAttributesService#update_dates'
app/services/work_packages/set_attributes_service.rb:70:in 'WorkPackages::SetAttributesService#set_calculated_attributes'
app/services/work_packages/set_attributes_service.rb:44:in 'block in WorkPackages::SetAttributesService#set_attributes'
lib/open_project/changed_by_system.rb:87:in 'OpenProject::ChangedBySystem#change_by_system'
app/services/work_packages/set_attributes_service.rb:43:in 'WorkPackages::SetAttributesService#set_attributes'
modules/backlogs/lib/open_project/backlogs/patches/set_attributes_service_patch.rb:36:in 'OpenProject::Backlogs::Patches::SetAttributesServicePatch::InstanceMethods#set_attributes'
app/services/base_services/set_attributes.rb:44:in 'BaseServices::SetAttributes#perform'
app/services/base_services/base_callable.rb:40:in 'block in BaseServices::BaseCallable#call'
app/services/concerns/with_reversible_state.rb:53:in 'BaseServices::BaseCallable#assign_state'
app/services/base_services/base_callable.rb:39:in 'BaseServices::BaseCallable#call'
app/services/base_services/write.rb:60:in 'BaseServices::Write#set_attributes'
app/services/attachments/replace_attachments.rb:37:in 'WorkPackages::UpdateService#set_attributes'
app/services/base_services/write.rb:51:in 'BaseServices::Write#before_perform'
app/services/base_services/base_contracted.rb:61:in 'block in BaseServices::BaseContracted#perform'
app/models/journal/notification_configuration.rb:62:in 'Journal::NotificationConfiguration.with_first'
app/models/journal/notification_configuration.rb:45:in 'Journal::NotificationConfiguration.with'
app/services/shared/service_context.rb:67:in 'block in Shared::ServiceContext#without_context_transaction'
lib/open_project/locale_helper.rb:36:in 'OpenProject::LocaleHelper.with_locale_for'
app/models/user.rb:538:in 'User.execute_as'
app/services/shared/service_context.rb:66:in 'Shared::ServiceContext#without_context_transaction'
app/services/shared/service_context.rb:45:in 'block in Shared::ServiceContext#in_mutex_context'
lib/open_project/mutex.rb:71:in 'block in OpenProject::Mutex.with_advisory_lock'
lib/open_project/mutex.rb:69:in 'OpenProject::Mutex.with_advisory_lock'
lib/open_project/mutex.rb:63:in 'block in OpenProject::Mutex.with_advisory_lock_transaction'
lib/open_project/mutex.rb:62:in 'OpenProject::Mutex.with_advisory_lock_transaction'
app/services/shared/service_context.rb:44:in 'Shared::ServiceContext#in_mutex_context'
app/services/shared/service_context.rb:35:in 'Shared::ServiceContext#in_context'
app/services/base_services/base_contracted.rb:54:in 'BaseServices::BaseContracted#service_context'
app/services/base_services/base_contracted.rb:59:in 'BaseServices::BaseContracted#perform'
app/services/base_services/base_callable.rb:40:in 'block in BaseServices::BaseCallable#call'
app/services/concerns/with_reversible_state.rb:53:in 'BaseServices::BaseCallable#assign_state'
app/services/base_services/base_callable.rb:39:in 'BaseServices::BaseCallable#call'
lib/api/utilities/endpoints/bodied.rb:117:in 'API::Utilities::Endpoints::Bodied#process'
lib/api/utilities/endpoints/bodied.rb:90:in 'block in mount'
```