summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/server/process.py
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2020-09-04 15:28:11 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2020-09-05 11:45:16 +0100
commitf6a40d457cf175eb1979f3a5bc62c76d939a21d0 (patch)
treefe88ed4bdda2c9c06ad647d9deba6e81edbc00db /bitbake/lib/bb/server/process.py
parent341c5ca419b2b447e5ef5b5e13f0539694fc9132 (diff)
downloadpoky-f6a40d457cf175eb1979f3a5bc62c76d939a21d0.tar.gz
bitbake: server/process: Ensure logging is flushed
The cookerlog output goes to a file and its misleading to look at it and not have it up to date with what the cooker is actually doing. Ensure written data is flushed. Ultimately this should be using python's logging but that is for another day, we need simple fixes right now. (Bitbake rev: d95c3dd2b8ac50423976a7baf0a51e9580871761) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/server/process.py')
-rw-r--r--bitbake/lib/bb/server/process.py44
1 files changed, 23 insertions, 21 deletions
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py
index 5b4d92dc80..2be4588a4f 100644
--- a/bitbake/lib/bb/server/process.py
+++ b/bitbake/lib/bb/server/process.py
@@ -35,6 +35,10 @@ logger = logging.getLogger('BitBake')
35class ProcessTimeout(SystemExit): 35class ProcessTimeout(SystemExit):
36 pass 36 pass
37 37
38def serverlog(msg):
39 print(msg)
40 sys.stdout.flush()
41
38class ProcessServer(): 42class ProcessServer():
39 profile_filename = "profile.log" 43 profile_filename = "profile.log"
40 profile_processed_filename = "profile.log.processed" 44 profile_processed_filename = "profile.log.processed"
@@ -73,7 +77,7 @@ class ProcessServer():
73 if self.xmlrpcinterface[0]: 77 if self.xmlrpcinterface[0]:
74 self.xmlrpc = bb.server.xmlrpcserver.BitBakeXMLRPCServer(self.xmlrpcinterface, self.cooker, self) 78 self.xmlrpc = bb.server.xmlrpcserver.BitBakeXMLRPCServer(self.xmlrpcinterface, self.cooker, self)
75 79
76 print("Bitbake XMLRPC server address: %s, server port: %s" % (self.xmlrpc.host, self.xmlrpc.port)) 80 serverlog("Bitbake XMLRPC server address: %s, server port: %s" % (self.xmlrpc.host, self.xmlrpc.port))
77 81
78 try: 82 try:
79 self.bitbake_lock.seek(0) 83 self.bitbake_lock.seek(0)
@@ -84,7 +88,7 @@ class ProcessServer():
84 self.bitbake_lock.write("%s\n" % (os.getpid())) 88 self.bitbake_lock.write("%s\n" % (os.getpid()))
85 self.bitbake_lock.flush() 89 self.bitbake_lock.flush()
86 except Exception as e: 90 except Exception as e:
87 print("Error writing to lock file: %s" % str(e)) 91 serverlog("Error writing to lock file: %s" % str(e))
88 pass 92 pass
89 93
90 if self.cooker.configuration.profile: 94 if self.cooker.configuration.profile:
@@ -98,7 +102,7 @@ class ProcessServer():
98 102
99 prof.dump_stats("profile.log") 103 prof.dump_stats("profile.log")
100 bb.utils.process_profilelog("profile.log") 104 bb.utils.process_profilelog("profile.log")
101 print("Raw profiling information saved to profile.log and processed statistics to profile.log.processed") 105 serverlog("Raw profiling information saved to profile.log and processed statistics to profile.log.processed")
102 106
103 else: 107 else:
104 ret = self.main() 108 ret = self.main()
@@ -118,10 +122,10 @@ class ProcessServer():
118 if self.xmlrpc: 122 if self.xmlrpc:
119 fds.append(self.xmlrpc) 123 fds.append(self.xmlrpc)
120 seendata = False 124 seendata = False
121 print("Entering server connection loop") 125 serverlog("Entering server connection loop")
122 126
123 def disconnect_client(self, fds): 127 def disconnect_client(self, fds):
124 print("Disconnecting Client") 128 serverlog("Disconnecting Client")
125 if self.controllersock: 129 if self.controllersock:
126 fds.remove(self.controllersock) 130 fds.remove(self.controllersock)
127 self.controllersock.close() 131 self.controllersock.close()
@@ -139,12 +143,12 @@ class ProcessServer():
139 self.haveui = False 143 self.haveui = False
140 ready = select.select(fds,[],[],0)[0] 144 ready = select.select(fds,[],[],0)[0]
141 if newconnections: 145 if newconnections:
142 print("Starting new client") 146 serverlog("Starting new client")
143 conn = newconnections.pop(-1) 147 conn = newconnections.pop(-1)
144 fds.append(conn) 148 fds.append(conn)
145 self.controllersock = conn 149 self.controllersock = conn
146 elif self.timeout is None and not ready: 150 elif self.timeout is None and not ready:
147 print("No timeout, exiting.") 151 serverlog("No timeout, exiting.")
148 self.quit = True 152 self.quit = True
149 153
150 self.lastui = time.time() 154 self.lastui = time.time()
@@ -153,17 +157,17 @@ class ProcessServer():
153 while select.select([self.sock],[],[],0)[0]: 157 while select.select([self.sock],[],[],0)[0]:
154 controllersock, address = self.sock.accept() 158 controllersock, address = self.sock.accept()
155 if self.controllersock: 159 if self.controllersock:
156 print("Queuing %s (%s)" % (str(ready), str(newconnections))) 160 serverlog("Queuing %s (%s)" % (str(ready), str(newconnections)))
157 newconnections.append(controllersock) 161 newconnections.append(controllersock)
158 else: 162 else:
159 print("Accepting %s (%s)" % (str(ready), str(newconnections))) 163 serverlog("Accepting %s (%s)" % (str(ready), str(newconnections)))
160 self.controllersock = controllersock 164 self.controllersock = controllersock
161 fds.append(controllersock) 165 fds.append(controllersock)
162 if self.controllersock in ready: 166 if self.controllersock in ready:
163 try: 167 try:
164 print("Processing Client") 168 serverlog("Processing Client")
165 ui_fds = recvfds(self.controllersock, 3) 169 ui_fds = recvfds(self.controllersock, 3)
166 print("Connecting Client") 170 serverlog("Connecting Client")
167 171
168 # Where to write events to 172 # Where to write events to
169 writer = ConnectionWriter(ui_fds[0]) 173 writer = ConnectionWriter(ui_fds[0])
@@ -187,14 +191,14 @@ class ProcessServer():
187 191
188 if not self.timeout == -1.0 and not self.haveui and self.timeout and \ 192 if not self.timeout == -1.0 and not self.haveui and self.timeout and \
189 (self.lastui + self.timeout) < time.time(): 193 (self.lastui + self.timeout) < time.time():
190 print("Server timeout, exiting.") 194 serverlog("Server timeout, exiting.")
191 self.quit = True 195 self.quit = True
192 196
193 # If we don't see a UI connection within maxuiwait, its unlikely we're going to see 197 # If we don't see a UI connection within maxuiwait, its unlikely we're going to see
194 # one. We have had issue with processes hanging indefinitely so timing out UI-less 198 # one. We have had issue with processes hanging indefinitely so timing out UI-less
195 # servers is useful. 199 # servers is useful.
196 if not self.hadanyui and not self.xmlrpc and not self.timeout and (self.lastui + self.maxuiwait) < time.time(): 200 if not self.hadanyui and not self.xmlrpc and not self.timeout and (self.lastui + self.maxuiwait) < time.time():
197 print("No UI connection within max timeout, exiting to avoid infinite loop.") 201 serverlog("No UI connection within max timeout, exiting to avoid infinite loop.")
198 self.quit = True 202 self.quit = True
199 203
200 if self.command_channel in ready: 204 if self.command_channel in ready:
@@ -209,7 +213,7 @@ class ProcessServer():
209 self.quit = True 213 self.quit = True
210 continue 214 continue
211 try: 215 try:
212 print("Running command %s" % command) 216 serverlog("Running command %s" % command)
213 self.command_channel_reply.send(self.cooker.command.runCommand(command)) 217 self.command_channel_reply.send(self.cooker.command.runCommand(command))
214 except Exception as e: 218 except Exception as e:
215 logger.exception('Exception in server main event loop running command %s (%s)' % (command, str(e))) 219 logger.exception('Exception in server main event loop running command %s (%s)' % (command, str(e)))
@@ -236,9 +240,9 @@ class ProcessServer():
236 ready = self.idle_commands(.1, fds) 240 ready = self.idle_commands(.1, fds)
237 241
238 if len(threading.enumerate()) != 1: 242 if len(threading.enumerate()) != 1:
239 print("More than one thread left?: " + str(threading.enumerate())) 243 serverlog("More than one thread left?: " + str(threading.enumerate()))
240 244
241 print("Exiting") 245 serverlog("Exiting")
242 # Remove the socket file so we don't get any more connections to avoid races 246 # Remove the socket file so we don't get any more connections to avoid races
243 try: 247 try:
244 os.unlink(self.sockname) 248 os.unlink(self.sockname)
@@ -296,7 +300,7 @@ class ProcessServer():
296 msg = "Delaying shutdown due to active processes which appear to be holding bitbake.lock" 300 msg = "Delaying shutdown due to active processes which appear to be holding bitbake.lock"
297 if procs: 301 if procs:
298 msg += ":\n%s" % str(procs.decode("utf-8")) 302 msg += ":\n%s" % str(procs.decode("utf-8"))
299 print(msg) 303 serverlog(msg)
300 304
301 def idle_commands(self, delay, fds=None): 305 def idle_commands(self, delay, fds=None):
302 nextsleep = delay 306 nextsleep = delay
@@ -485,8 +489,7 @@ def execServer(lockfd, readypipeinfd, lockname, sockname, server_timeout, xmlrpc
485 import bb.cookerdata 489 import bb.cookerdata
486 import bb.cooker 490 import bb.cooker
487 491
488 print(start_log_format % (os.getpid(), datetime.datetime.now().strftime(start_log_datetime_format))) 492 serverlog(start_log_format % (os.getpid(), datetime.datetime.now().strftime(start_log_datetime_format)))
489 sys.stdout.flush()
490 493
491 try: 494 try:
492 bitbake_lock = os.fdopen(lockfd, "w") 495 bitbake_lock = os.fdopen(lockfd, "w")
@@ -515,8 +518,7 @@ def execServer(lockfd, readypipeinfd, lockname, sockname, server_timeout, xmlrpc
515 writer.send("r") 518 writer.send("r")
516 writer.close() 519 writer.close()
517 server.cooker = cooker 520 server.cooker = cooker
518 print("Started bitbake server pid %d" % os.getpid()) 521 serverlog("Started bitbake server pid %d" % os.getpid())
519 sys.stdout.flush()
520 522
521 server.run() 523 server.run()
522 finally: 524 finally: