Skip to content

Commit ce6004f

Browse files
committed
Use timeout with Queue#put/get
This hopefully avoids deadlock in long running RIDE processes
1 parent 52534d8 commit ce6004f

File tree

1 file changed

+23
-13
lines changed

1 file changed

+23
-13
lines changed

src/robotide/spec/librarymanager.py

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
from Queue import Queue
1615
from _sqlite3 import OperationalError
16+
import Queue
1717
import os
1818
from threading import Thread
1919

20-
from robotide.publish import RideLogException
20+
from robotide.publish import RideLogException, RideLogMessage
2121
from robotide.spec.librarydatabase import LibraryDatabase
2222
from robotide.spec.libraryfetcher import get_import_result
2323
from robotide.spec.xmlreaders import get_path, SpecInitializer
@@ -28,7 +28,7 @@ class LibraryManager(Thread):
2828
def __init__(self, database_name, spec_initializer=None):
2929
self._database_name = database_name
3030
self._database = None
31-
self._messages = Queue()
31+
self._messages = Queue.Queue()
3232
self._spec_initializer = spec_initializer or SpecInitializer()
3333
Thread.__init__(self)
3434
self.setDaemon(True)
@@ -91,17 +91,20 @@ def _handle_insert_keywords_message(self, message):
9191
_, library_name, library_args, result_queue = message
9292
keywords = self._fetch_keywords(library_name, library_args)
9393
self._insert(library_name, library_args, keywords,
94-
result_queue.put)
94+
lambda res: result_queue.put(res, timeout=3))
9595

9696
def _insert(self, library_name, library_args, keywords, callback):
97-
self._database.insert_library_keywords(library_name, library_args, keywords or [])
97+
self._database.insert_library_keywords(
98+
library_name, library_args, keywords or [])
9899
self._call(callback, keywords)
99100

100-
def _update_database_and_call_callback_if_needed(self, library_key, keywords, callback):
101+
def _update_database_and_call_callback_if_needed(
102+
self, library_key, keywords, callback):
101103
db_keywords = self._database.fetch_library_keywords(*library_key)
102104
try:
103105
if not db_keywords or self._keywords_differ(keywords, db_keywords):
104-
self._insert(library_key[0], library_key[1], keywords, callback)
106+
self._insert(
107+
library_key[0], library_key[1], keywords, callback)
105108
else:
106109
self._database.update_library_timestamp(*library_key)
107110
except OperationalError:
@@ -115,18 +118,25 @@ def _call(self, callback, *args):
115118
RideLogException(message=msg, exception=err, level='WARN').publish()
116119

117120
def fetch_keywords(self, library_name, library_args, callback):
118-
self._messages.put(('fetch', library_name, library_args, callback))
121+
self._messages.put(('fetch', library_name, library_args, callback),
122+
timeout=3)
119123

120124
def get_and_insert_keywords(self, library_name, library_args):
121-
result_queue = Queue(maxsize=1)
122-
self._messages.put(('insert', library_name, library_args, result_queue))
123-
return result_queue.get()
125+
result_queue = Queue.Queue(maxsize=1)
126+
self._messages.put(
127+
('insert', library_name, library_args, result_queue), timeout=3)
128+
try:
129+
return result_queue.get(timeout=5)
130+
except Queue.Empty as e:
131+
RideLogMessage('Failed to read keywords from library db: {}'
132+
.format(unicode(e))).publish()
133+
return []
124134

125135
def create_database(self):
126-
self._messages.put(('create',))
136+
self._messages.put(('create',), timeout=3)
127137

128138
def stop(self):
129-
self._messages.put(False)
139+
self._messages.put(False, timeout=3)
130140

131141
def _keywords_differ(self, keywords1, keywords2):
132142
if keywords1 != keywords2 and None in (keywords1, keywords2):

0 commit comments

Comments
 (0)