Software /
code /
prosody
Annotate
net/server.lua @ 10853:0107ed6744aa
net.server: Switch to epoll backend by default
(if util.poll is found)
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Mon, 01 Jun 2020 13:43:35 +0100 |
parent | 9215:b087b5047f86 |
child | 11762:54530085dffe |
rev | line source |
---|---|
2925 | 1 -- Prosody IM |
2 -- Copyright (C) 2008-2010 Matthew Wild | |
3 -- Copyright (C) 2008-2010 Waqas Hussain | |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5531
diff
changeset
|
4 -- |
2925 | 5 -- This project is MIT/X11 licensed. Please see the |
6 -- COPYING file in the source package for more information. | |
7 -- | |
2162
22b6b1899a55
net.server: Log an error when libevent is requested, but luaevent is unavailable, and don't load luaevent when not requested.
Waqas Hussain <waqas20@gmail.com>
parents:
2136
diff
changeset
|
8 |
9215
b087b5047f86
net.server: Throw error when loading outside Prosody or Prosody config not loaded
Matthew Wild <mwild1@gmail.com>
parents:
8711
diff
changeset
|
9 if not (prosody and prosody.config_loaded) then |
b087b5047f86
net.server: Throw error when loading outside Prosody or Prosody config not loaded
Matthew Wild <mwild1@gmail.com>
parents:
8711
diff
changeset
|
10 -- This module only supports loading inside Prosody, outside Prosody |
b087b5047f86
net.server: Throw error when loading outside Prosody or Prosody config not loaded
Matthew Wild <mwild1@gmail.com>
parents:
8711
diff
changeset
|
11 -- you should directly require net.server_select or server_event, etc. |
b087b5047f86
net.server: Throw error when loading outside Prosody or Prosody config not loaded
Matthew Wild <mwild1@gmail.com>
parents:
8711
diff
changeset
|
12 error(debug.traceback("Loading outside Prosody or Prosody not yet initialized"), 0); |
b087b5047f86
net.server: Throw error when loading outside Prosody or Prosody config not loaded
Matthew Wild <mwild1@gmail.com>
parents:
8711
diff
changeset
|
13 end |
b087b5047f86
net.server: Throw error when loading outside Prosody or Prosody config not loaded
Matthew Wild <mwild1@gmail.com>
parents:
8711
diff
changeset
|
14 |
8711
9932a2a5b6de
net.server: Init a local logger (fixes traceback on attempt to warn about missing luaevent due to later loggingmanager initialization)
Kim Alvefur <zash@zash.se>
parents:
8700
diff
changeset
|
15 local log = require "util.logger".init("net.server"); |
10853
0107ed6744aa
net.server: Switch to epoll backend by default
Matthew Wild <mwild1@gmail.com>
parents:
9215
diff
changeset
|
16 |
0107ed6744aa
net.server: Switch to epoll backend by default
Matthew Wild <mwild1@gmail.com>
parents:
9215
diff
changeset
|
17 local have_util_poll = pcall(require, "util.poll"); |
0107ed6744aa
net.server: Switch to epoll backend by default
Matthew Wild <mwild1@gmail.com>
parents:
9215
diff
changeset
|
18 local default_backend = have_util_poll and "epoll" or "select"; |
0107ed6744aa
net.server: Switch to epoll backend by default
Matthew Wild <mwild1@gmail.com>
parents:
9215
diff
changeset
|
19 |
0107ed6744aa
net.server: Switch to epoll backend by default
Matthew Wild <mwild1@gmail.com>
parents:
9215
diff
changeset
|
20 local server_type = require "core.configmanager".get("*", "network_backend") or default_backend; |
9215
b087b5047f86
net.server: Throw error when loading outside Prosody or Prosody config not loaded
Matthew Wild <mwild1@gmail.com>
parents:
8711
diff
changeset
|
21 |
b087b5047f86
net.server: Throw error when loading outside Prosody or Prosody config not loaded
Matthew Wild <mwild1@gmail.com>
parents:
8711
diff
changeset
|
22 if require "core.configmanager".get("*", "use_libevent") then |
8700
d611c46c6787
Backed out changeset a0f728c3aa69 in favor of 580c13ed0ca1
Kim Alvefur <zash@zash.se>
parents:
8686
diff
changeset
|
23 server_type = "event"; |
6480
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
24 end |
2094
c69cb5c171e0
net.server: New net.server to choose the appropriate library from server_select/server_event based on the availability of luaevent and the use_libevent config option
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 |
6480
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
26 if server_type == "event" then |
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
27 if not pcall(require, "luaevent.core") then |
2162
22b6b1899a55
net.server: Log an error when libevent is requested, but luaevent is unavailable, and don't load luaevent when not requested.
Waqas Hussain <waqas20@gmail.com>
parents:
2136
diff
changeset
|
28 log("error", "libevent not found, falling back to select()"); |
6480
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
29 server_type = "select" |
2162
22b6b1899a55
net.server: Log an error when libevent is requested, but luaevent is unavailable, and don't load luaevent when not requested.
Waqas Hussain <waqas20@gmail.com>
parents:
2136
diff
changeset
|
30 end |
22b6b1899a55
net.server: Log an error when libevent is requested, but luaevent is unavailable, and don't load luaevent when not requested.
Waqas Hussain <waqas20@gmail.com>
parents:
2136
diff
changeset
|
31 end |
22b6b1899a55
net.server: Log an error when libevent is requested, but luaevent is unavailable, and don't load luaevent when not requested.
Waqas Hussain <waqas20@gmail.com>
parents:
2136
diff
changeset
|
32 |
2094
c69cb5c171e0
net.server: New net.server to choose the appropriate library from server_select/server_event based on the availability of luaevent and the use_libevent config option
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 local server; |
6480
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
34 local set_config; |
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
35 if server_type == "event" then |
4811
1d1fdfa29f06
net.server: server_select != server_event (thanks Nulani, Florob)
Matthew Wild <mwild1@gmail.com>
parents:
4808
diff
changeset
|
36 server = require "net.server_event"; |
4808
07d0a3a75c8a
net.server, net.timer, net.server_select: Rearrange dependencies between these three modules. server.addtimer() is no longer a public function (renamed to _addtimer) and is not available at all from server_event (compat code removed to prevent traceback) (thanks Nulani)
Matthew Wild <mwild1@gmail.com>
parents:
3461
diff
changeset
|
37 |
5385
d663483036db
net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents:
5383
diff
changeset
|
38 local defaults = {}; |
6480
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
39 for k,v in pairs(server.cfg) do |
5385
d663483036db
net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents:
5383
diff
changeset
|
40 defaults[k] = v; |
d663483036db
net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents:
5383
diff
changeset
|
41 end |
6480
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
42 function set_config(settings) |
7543 | 43 local event_settings = { |
44 ACCEPT_DELAY = settings.accept_retry_interval; | |
45 ACCEPT_QUEUE = settings.tcp_backlog; | |
46 CLEAR_DELAY = settings.event_clear_interval; | |
47 CONNECT_TIMEOUT = settings.connect_timeout; | |
48 DEBUG = settings.debug; | |
49 HANDSHAKE_TIMEOUT = settings.ssl_handshake_timeout; | |
50 MAX_CONNECTIONS = settings.max_connections; | |
51 MAX_HANDSHAKE_ATTEMPTS = settings.max_ssl_handshake_roundtrips; | |
52 MAX_READ_LENGTH = settings.max_receive_buffer_size; | |
53 MAX_SEND_LENGTH = settings.max_send_buffer_size; | |
54 READ_TIMEOUT = settings.read_timeout; | |
55 WRITE_TIMEOUT = settings.send_timeout; | |
56 }; | |
5198
430797a8fc81
net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents:
4811
diff
changeset
|
57 |
7543 | 58 for k,default in pairs(defaults) do |
59 server.cfg[k] = event_settings[k] or default; | |
60 end | |
6480
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
61 end |
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
62 elseif server_type == "select" then |
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
63 server = require "net.server_select"; |
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
64 |
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
65 local defaults = {}; |
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
66 for k,v in pairs(server.getsettings()) do |
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
67 defaults[k] = v; |
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
68 end |
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
69 function set_config(settings) |
7543 | 70 local select_settings = {}; |
71 for k,default in pairs(defaults) do | |
72 select_settings[k] = settings[k] or default; | |
5198
430797a8fc81
net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents:
4811
diff
changeset
|
73 end |
7543 | 74 server.changesettings(select_settings); |
75 end | |
2094
c69cb5c171e0
net.server: New net.server to choose the appropriate library from server_select/server_event based on the availability of luaevent and the use_libevent config option
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 else |
7545
0941b3ab77c0
net.server: Allow arbitrary network backends to be configured
Kim Alvefur <zash@zash.se>
parents:
7544
diff
changeset
|
77 server = require("net.server_"..server_type); |
0941b3ab77c0
net.server: Allow arbitrary network backends to be configured
Kim Alvefur <zash@zash.se>
parents:
7544
diff
changeset
|
78 set_config = server.set_config; |
7546
9606a99f8617
net.server: Monkey-patch in a fallback get_backend method if missing
Kim Alvefur <zash@zash.se>
parents:
7545
diff
changeset
|
79 if not server.get_backend then |
9606a99f8617
net.server: Monkey-patch in a fallback get_backend method if missing
Kim Alvefur <zash@zash.se>
parents:
7545
diff
changeset
|
80 function server.get_backend() |
9606a99f8617
net.server: Monkey-patch in a fallback get_backend method if missing
Kim Alvefur <zash@zash.se>
parents:
7545
diff
changeset
|
81 return server_type; |
9606a99f8617
net.server: Monkey-patch in a fallback get_backend method if missing
Kim Alvefur <zash@zash.se>
parents:
7545
diff
changeset
|
82 end |
9606a99f8617
net.server: Monkey-patch in a fallback get_backend method if missing
Kim Alvefur <zash@zash.se>
parents:
7545
diff
changeset
|
83 end |
2094
c69cb5c171e0
net.server: New net.server to choose the appropriate library from server_select/server_event based on the availability of luaevent and the use_libevent config option
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 end |
c69cb5c171e0
net.server: New net.server to choose the appropriate library from server_select/server_event based on the availability of luaevent and the use_libevent config option
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 |
6482
410067cdeb2f
net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents:
6480
diff
changeset
|
86 -- If server.hook_signal exists, replace signal.signal() |
6485
4224abbf0fdd
net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents:
6484
diff
changeset
|
87 local has_signal, signal = pcall(require, "util.signal"); |
4224abbf0fdd
net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents:
6484
diff
changeset
|
88 if has_signal then |
4224abbf0fdd
net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents:
6484
diff
changeset
|
89 if server.hook_signal then |
6482
410067cdeb2f
net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents:
6480
diff
changeset
|
90 function signal.signal(signal_id, handler) |
410067cdeb2f
net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents:
6480
diff
changeset
|
91 if type(signal_id) == "string" then |
410067cdeb2f
net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents:
6480
diff
changeset
|
92 signal_id = signal[signal_id:upper()]; |
410067cdeb2f
net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents:
6480
diff
changeset
|
93 end |
410067cdeb2f
net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents:
6480
diff
changeset
|
94 if type(signal_id) ~= "number" then |
410067cdeb2f
net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents:
6480
diff
changeset
|
95 return false, "invalid-signal"; |
410067cdeb2f
net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents:
6480
diff
changeset
|
96 end |
410067cdeb2f
net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents:
6480
diff
changeset
|
97 return server.hook_signal(signal_id, handler); |
410067cdeb2f
net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents:
6480
diff
changeset
|
98 end |
6485
4224abbf0fdd
net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents:
6484
diff
changeset
|
99 else |
4224abbf0fdd
net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents:
6484
diff
changeset
|
100 server.hook_signal = signal.signal; |
6482
410067cdeb2f
net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents:
6480
diff
changeset
|
101 end |
410067cdeb2f
net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents:
6480
diff
changeset
|
102 else |
6485
4224abbf0fdd
net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents:
6484
diff
changeset
|
103 if not server.hook_signal then |
4224abbf0fdd
net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents:
6484
diff
changeset
|
104 server.hook_signal = function() |
4224abbf0fdd
net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents:
6484
diff
changeset
|
105 return false, "signal hooking not supported" |
4224abbf0fdd
net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents:
6484
diff
changeset
|
106 end |
4224abbf0fdd
net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents:
6484
diff
changeset
|
107 end |
6482
410067cdeb2f
net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents:
6480
diff
changeset
|
108 end |
410067cdeb2f
net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents:
6480
diff
changeset
|
109 |
7544
fb68aad9dc4d
net.server: Only update configuration if server backend supports changing settings
Kim Alvefur <zash@zash.se>
parents:
7543
diff
changeset
|
110 if prosody and set_config then |
5198
430797a8fc81
net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents:
4811
diff
changeset
|
111 local config_get = require "core.configmanager".get; |
430797a8fc81
net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents:
4811
diff
changeset
|
112 local function load_config() |
5383
143670deee3e
net.server: No sections in config anymore
Kim Alvefur <zash@zash.se>
parents:
5284
diff
changeset
|
113 local settings = config_get("*", "network_settings") or {}; |
6480
37b12475f648
net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents:
5776
diff
changeset
|
114 return set_config(settings); |
5198
430797a8fc81
net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents:
4811
diff
changeset
|
115 end |
430797a8fc81
net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents:
4811
diff
changeset
|
116 load_config(); |
430797a8fc81
net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents:
4811
diff
changeset
|
117 prosody.events.add_handler("config-reloaded", load_config); |
430797a8fc81
net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents:
4811
diff
changeset
|
118 end |
430797a8fc81
net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents:
4811
diff
changeset
|
119 |
2136
23c687039652
net.server: Add some comments to explain to waqas how it all works :)
Matthew Wild <mwild1@gmail.com>
parents:
2105
diff
changeset
|
120 -- require "net.server" shall now forever return this, |
23c687039652
net.server: Add some comments to explain to waqas how it all works :)
Matthew Wild <mwild1@gmail.com>
parents:
2105
diff
changeset
|
121 -- ie. server_select or server_event as chosen above. |
2645
625d02b2a1a0
net.server: Remove redundant commented code and some trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents:
2435
diff
changeset
|
122 return server; |