Merge lp:~credativ/ocb-server/7.0-no-workers-no-listen into lp:ocb-server

Proposed by mistotebe
Status: Rejected
Rejected by: Holger Brunn (Therp)
Proposed branch: lp:~credativ/ocb-server/7.0-no-workers-no-listen
Merge into: lp:ocb-server
Diff against target: 94 lines (+19/-15)
3 files modified
openerp/cli/server.py (+1/-1)
openerp/service/workers.py (+17/-13)
openerp/tools/config.py (+1/-1)
To merge this branch: bzr merge lp:~credativ/ocb-server/7.0-no-workers-no-listen
Reviewer Review Type Date Requested Status
Holger Brunn (Therp) Disapprove
Review via email: mp+217744@code.launchpad.net

Description of the change

Do not bind sockets when starting with no workers

If wanting to run the OpenERP server split out to a cron worker and a main server, the cron worker daemon must not try to bind the server socket.

This commit lets an explicit --workers=0 mean that we still want to run multiprocess, but are not going to listen anywhere.

Rationale for raising directly against OCB:
The "openerp-server" script has been removed in favor of the "oe" script not long after 7 has been released, therefore I presume OpenERP would not be interested in integrating this into 7.0 maintenance.

To post a comment you must log in.
Revision history for this message
Holger Brunn (Therp) (hbrunn) :
review: Approve (code review)
Revision history for this message
Holger Brunn (Therp) (hbrunn) wrote :

Development for 7.0 has moved to github on https://github.com/OCA/ocb - please move your merge proposal there if it is still valid.

(I close and reject this in order to have a cleaner overview for 6.1 MPs which indeed have to be done on launchpad)

review: Disapprove

Unmerged revisions

5328. By mistotebe

[IMP] Do not bind sockets when not starting with any workers

If wanting to run the OpenERP server split out to a cron worker and a main
server, the cron worker daemon must not try to bind the server socket.

This commit lets an explicit --workers=0 mean that we still want to run
multiprocess, but are not going to listen anywhere.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'openerp/cli/server.py'
2--- openerp/cli/server.py 2014-03-19 10:48:47 +0000
3+++ openerp/cli/server.py 2014-04-30 11:22:26 +0000
4@@ -252,7 +252,7 @@
5 setup_pid_file()
6 # Some module register themselves when they are loaded so we need the
7 # services to be running before loading any registry.
8- if config['workers']:
9+ if config['workers'] is not None:
10 openerp.service.start_services_workers()
11 else:
12 openerp.service.start_services()
13
14=== modified file 'openerp/service/workers.py'
15--- openerp/service/workers.py 2014-04-10 09:36:29 +0000
16+++ openerp/service/workers.py 2014-04-30 11:22:26 +0000
17@@ -35,7 +35,7 @@
18 def __init__(self, app):
19 # config
20 self.address = (config['xmlrpc_interface'] or '0.0.0.0', config['xmlrpc_port'])
21- self.population = config['workers']
22+ self.population = config['workers'] or 0
23 self.timeout = config['limit_time_real']
24 self.limit_request = config['limit_request']
25 # working vars
26@@ -48,6 +48,7 @@
27 self.workers = {}
28 self.generation = 0
29 self.queue = []
30+ self.socket = None
31
32 def pipe_new(self):
33 pipe = os.pipe()
34@@ -172,12 +173,13 @@
35 signal.signal(signal.SIGINT, self.signal_handler)
36 signal.signal(signal.SIGTERM, self.signal_handler)
37 signal.signal(signal.SIGCHLD, self.signal_handler)
38- # listen to socket
39- self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
40- self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
41- self.socket.setblocking(0)
42- self.socket.bind(self.address)
43- self.socket.listen(8*self.population)
44+ if self.population:
45+ # listen to socket
46+ self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
47+ self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
48+ self.socket.setblocking(0)
49+ self.socket.bind(self.address)
50+ self.socket.listen(8*self.population)
51
52 def stop(self, graceful=True):
53 if graceful:
54@@ -192,7 +194,8 @@
55 _logger.info("Stopping forcefully")
56 for pid in self.workers.keys():
57 self.worker_kill(pid, signal.SIGTERM)
58- self.socket.close()
59+ if self.socket:
60+ self.socket.close()
61 openerp.cli.server.quit_signals_received = 1
62
63 def run(self):
64@@ -285,11 +288,12 @@
65 _logger.info("Worker %s (%s) alive", self.__class__.__name__, self.pid)
66 # Reseed the random number generator
67 random.seed()
68- # Prevent fd inherientence close_on_exec
69- flags = fcntl.fcntl(self.multi.socket, fcntl.F_GETFD) | fcntl.FD_CLOEXEC
70- fcntl.fcntl(self.multi.socket, fcntl.F_SETFD, flags)
71- # reset blocking status
72- self.multi.socket.setblocking(0)
73+ if self.multi.socket:
74+ # Prevent fd inherientence close_on_exec
75+ flags = fcntl.fcntl(self.multi.socket, fcntl.F_GETFD) | fcntl.FD_CLOEXEC
76+ fcntl.fcntl(self.multi.socket, fcntl.F_SETFD, flags)
77+ # reset blocking status
78+ self.multi.socket.setblocking(0)
79 signal.signal(signal.SIGINT, self.signal_handler)
80 signal.signal(signal.SIGTERM, signal.SIG_DFL)
81 signal.signal(signal.SIGCHLD, signal.SIG_DFL)
82
83=== modified file 'openerp/tools/config.py'
84--- openerp/tools/config.py 2013-11-25 10:38:42 +0000
85+++ openerp/tools/config.py 2014-04-30 11:22:26 +0000
86@@ -279,7 +279,7 @@
87
88 group = optparse.OptionGroup(parser, "Multiprocessing options")
89 # TODO sensible default for the three following limits.
90- group.add_option("--workers", dest="workers", my_default=0,
91+ group.add_option("--workers", dest="workers", my_default=None,
92 help="Specify the number of workers, 0 disable prefork mode.",
93 type="int")
94 group.add_option("--limit-memory-soft", dest="limit_memory_soft", my_default=640 * 1024 * 1024,

Subscribers

People subscribed via source and target branches

to status/vote changes: