Утечка соединений Reactivemongo во время горячей перезагрузки Play

У меня есть приложение Play на основе Scala, которое использует ReactiveMongo. Когда в режиме разработки происходит горячая перезагрузка, ReactiveMongo пропускает соединения. Например, вот фрагмент файлов журнала Mongo; Я добавил разрыв строки в журналы, чтобы указать каждый раз, когда происходила горячая перезагрузка (т.е. я сделал тривиальное изменение приложения и перезагрузил страницу в браузере)

2015-09-26T09:43:43.353-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58612 #1 (1 connection now open)

2015-09-26T09:43:43.725-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58613 #2 (2 connections now open)

2015-09-26T09:43:43.725-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58614 #3 (3 connections now open)

2015-09-26T09:43:43.725-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58615 #4 (4 connections now open)

2015-09-26T09:43:43.725-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58616 #5 (5 connections now open)

2015-09-26T09:43:43.726-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58617 #6 (6 connections now open)

2015-09-26T09:43:43.726-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58618 #7 (7 connections now open)

2015-09-26T09:43:43.726-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58619 #8 (8 connections now open)

2015-09-26T09:43:43.726-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58620 #9 (9 connections now open)

2015-09-26T09:43:43.726-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58621 #10 (10 connections now open)

2015-09-26T09:43:43.810-0700 I INDEX    [conn1] build index on: sma.destination properties: { v: 1, unique: true, key: { id: 1 }, name: "idx_destination_id", ns: "sma.destination" }

2015-09-26T09:43:43.810-0700 I INDEX    [conn1]      building index using bulk method



2015-09-26T09:43:57.164-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58640 #11 (11 connections now open)

2015-09-26T09:43:57.169-0700 I NETWORK  [conn11] end connection 127.0.0.1:58640 (10 connections now open)

2015-09-26T09:43:57.431-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58641 #12 (11 connections now open)

2015-09-26T09:43:57.435-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58642 #13 (12 connections now open)

2015-09-26T09:43:57.436-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58643 #14 (13 connections now open)

2015-09-26T09:43:57.436-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58644 #15 (14 connections now open)

2015-09-26T09:43:57.437-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58645 #16 (15 connections now open)

2015-09-26T09:43:57.437-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58646 #17 (16 connections now open)

2015-09-26T09:43:57.437-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58647 #18 (17 connections now open)

2015-09-26T09:43:57.437-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58648 #19 (18 connections now open)

2015-09-26T09:43:57.437-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58649 #20 (19 connections now open)

2015-09-26T09:43:57.437-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58650 #21 (20 connections now open)

2015-09-26T09:43:57.487-0700 I INDEX    [conn14] build index on: sma.destination properties: { v: 1, unique: true, key: { id: 1 }, name: "idx_destination_id", ns: "sma.destination" }

2015-09-26T09:43:57.487-0700 I INDEX    [conn14]     building index using bulk method



2015-09-26T09:44:16.559-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58677 #22 (21 connections now open)

2015-09-26T09:44:16.560-0700 I NETWORK  [conn22] end connection 127.0.0.1:58677 (20 connections now open)

2015-09-26T09:44:16.766-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58678 #23 (21 connections now open)

2015-09-26T09:44:16.770-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58679 #24 (22 connections now open)

2015-09-26T09:44:16.771-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58680 #25 (23 connections now open)

2015-09-26T09:44:16.771-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58681 #26 (24 connections now open)

2015-09-26T09:44:16.771-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58682 #27 (25 connections now open)

2015-09-26T09:44:16.772-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58683 #28 (26 connections now open)

2015-09-26T09:44:16.772-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58684 #29 (27 connections now open)

2015-09-26T09:44:16.772-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58685 #30 (28 connections now open)

2015-09-26T09:44:16.772-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58686 #31 (29 connections now open)

2015-09-26T09:44:16.772-0700 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58687 #32 (30 connections now open)

2015-09-26T09:44:16.791-0700 I INDEX    [conn24] build index on: sma.destination properties: { v: 1, unique: true, key: { id: 1 }, name: "idx_destination_id", ns: "sma.destination" }

2015-09-26T09:44:16.792-0700 I INDEX    [conn24]     building index using bulk method

Вы можете видеть, что ReactiveMongo создает пул из 10 соединений каждый раз, когда происходит горячая перезагрузка; предыдущие 10 соединений не очищаются. В конце концов он достигает максимального количества подключений (в настоящее время ~ 200), а затем монго становится недоступным, пока я не перезапущу.

Предположительно, этого не произошло бы в prod, но меня немного нервирует то, что это происходит в первую очередь в dev. Есть ли способ закрыть эти соединения, когда приложение перезагружается?


person Dave Taubler    schedule 16.10.2015    source источник
comment
Какую версию Play вы используете?   -  person Salem    schedule 17.10.2015
comment
Хороший вопрос. Я использую Play 2.4 и play2-reactivemongo_2.11 версии 0.11.6.play24.   -  person Dave Taubler    schedule 18.10.2015


Ответы (1)


Была такая же проблема после немного устаревших руководств (с использованием Play 2.6)

Из документации: http://reactivemongo.org/releases/0.12/documentation/tutorial/play.html

/*
 * Get a JSONCollection (a Collection implementation that is designed to work
 * with JsObject, Reads and Writes.)
 * Note that the `collection` is not a `val`, but a `def`. We do _not_ store
 * the collection reference to avoid potential problems in development with
 * Play hot-reloading.
 */
def collection: Future[JSONCollection] = database.map(
    _.collection[JSONCollection]("persons"))

В моем случае замена: val collection: JSonCollection на формат выше решила мою проблему.

Теперь при перезагрузке закрывает и снова открывает все соединения:

2017-08-15T15:32:50.991-0300 I -        [conn2] end connection 127.0.0.1:58489 (10 connections now open)
2017-08-15T15:32:50.992-0300 I -        [conn9] end connection 127.0.0.1:58496 (9 connections now open)
2017-08-15T15:32:50.992-0300 I -        [conn4] end connection 127.0.0.1:58491 (8 connections now open)
2017-08-15T15:32:50.993-0300 I -        [conn5] end connection 127.0.0.1:58492 (7 connections now open)
2017-08-15T15:32:50.994-0300 I -        [conn6] end connection 127.0.0.1:58493 (6 connections now open)
and so on...
person user7552    schedule 15.08.2017