Browse Source

Fixes #3087: Search taskbars cause DeadLocks.

Thorsten Eckel 4 years ago
parent
commit
ee1c4677ea

+ 1 - 0
app/models/taskbar.rb

@@ -88,6 +88,7 @@ class Taskbar < ApplicationModel
   end
 
   def update_preferences_infos
+    return true if key == 'Search'
     return true if local_update
 
     # find other same open tasks

+ 14 - 0
db/migrate/20200617153806_issue_3087_search_taskbar_deadlock.rb

@@ -0,0 +1,14 @@
+class Issue3087SearchTaskbarDeadlock < ActiveRecord::Migration[5.2]
+  def change
+    Taskbar.where(key: 'Search').find_each do |taskbar|
+      next if taskbar.preferences.blank?
+      next if taskbar.preferences[:tasks].blank?
+
+      taskbar.preferences.delete(:tasks)
+
+      taskbar.save!
+    rescue => e
+      Rails.logger.error e
+    end
+  end
+end

+ 39 - 0
spec/models/taskbar_spec.rb

@@ -2,6 +2,45 @@ require 'rails_helper'
 
 RSpec.describe Taskbar do
 
+  context 'key = Search' do
+
+    context 'multiple taskbars', current_user_id: 1 do
+      let(:key) { 'Search' }
+      let(:other_taskbar) { create(:taskbar, key: key) }
+
+      describe '#create' do
+
+        it "doesn't update other taskbar" do
+          expect do
+            create(:taskbar, key: key)
+          end.not_to change { other_taskbar.reload.updated_at }
+        end
+      end
+
+      context 'existing taskbar' do
+
+        subject(:taskbar) { create(:taskbar, key: key) }
+
+        describe '#update' do
+
+          it "doesn't update other taskbar" do
+            expect do
+              taskbar.update!(state: { foo: :bar })
+            end.not_to change { other_taskbar.reload.updated_at }
+          end
+        end
+
+        describe '#destroy' do
+          it "doesn't update other taskbar" do
+            expect do
+              taskbar.destroy!
+            end.not_to change { other_taskbar.reload.updated_at }
+          end
+        end
+      end
+    end
+  end
+
   context 'single creation' do
 
     let(:taskbar) do