Skip to content

Commit c984c6d

Browse files
committed
osm.renderd: rewrite renderd_bk_handler for working with unix socket
1 parent 5d632c6 commit c984c6d

File tree

1 file changed

+52
-39
lines changed

1 file changed

+52
-39
lines changed

osm/renderd.lua

Lines changed: 52 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ module(...)
5050

5151
_VERSION = '0.1'
5252

53-
local renderdsock = 'unix:/var/run/renderd/renderd.socket'
53+
local renderd_sock = 'unix:/var/run/renderd/renderd.socket'
5454
local renderd_cmd_size = 64
5555

5656
-- ------------------------------------
@@ -231,7 +231,7 @@ end
231231
--
232232
local renderd_bk_handler
233233
renderd_bk_handler = function (premature)
234-
local renderdsock = 'unix:/var/run/renderd/renderd.socket'
234+
local renderd_sock = 'unix:/var/run/renderd/renderd.socket'
235235
local renderd_cmd_size = 64
236236
local shmem = ngx.shared.osm_renderd
237237

@@ -261,55 +261,73 @@ renderd_bk_handler = function (premature)
261261
return msg
262262
end
263263

264+
local function send_renderd_request(req)
265+
local tcpsock = tcp()
266+
tcpsock:settimeout(100)
267+
tcpsock:connect(renderd_sock)
268+
local ok,err=tcpsock:send(req)
269+
if not ok then
270+
print('send ',err)
271+
tcpsock:close()
272+
return nil
273+
end
274+
tcpsock:settimeout(30000)
275+
local data, err = tcpsock:receive(renderd_cmd_size)
276+
tcpsock:close()
277+
if not data then
278+
print('recv ',err)
279+
return nil
280+
end
281+
local msg = deserialize_msg(data)
282+
return msg
283+
end
284+
285+
local function send_signal(key, timeout, flag)
286+
local ok, err = shmem:set(key, 0, timeout, flag)
287+
if not ok then
288+
return nil
289+
end
290+
return true
291+
end
292+
264293
if premature then
265294
-- clean up
266295
shmem:delete('_renderd_handler')
267296
return
268297
end
269298

270-
local tcpsock = ngx.socket.tcp()
271-
tcpsock:connect(renderdsock)
272-
tcpsock:settimeout(100)
273-
299+
-- repeat this in single background light thread
274300
while true do
275-
-- send requests first...
301+
local req = nil
302+
303+
-- get request
276304
local indexes = shmem:get_keys()
277305
for key,index in pairs(indexes) do
278-
local req, flag = shmem:get(index)
306+
local request, flag = shmem:get(index)
279307
if flag == REQUEST then
280-
local ok,err=tcpsock:send(req)
281-
if ok then
282-
shmem:replace(index, req, 300, SEND)
283-
else
284-
print('bkreq failed ',index)
285-
end
308+
req = request
286309
end
287310
end
288311

289312
sleep(0.1)
290313

291-
-- then receive response
292-
tcpsock:settimeout(100)
293-
local data, err = tcpsock:receive(renderd_cmd_size)
294-
if data then
295-
local msg = deserialize_msg(data)
314+
if req then
315+
local msg = send_renderd_request(req)
316+
if not msg then
317+
print('req failed ',index)
318+
send_signal(index, 300, FAILED)
319+
end
296320
local index = get_key(msg["map"], msg["x"], msg["y"], msg["z"])
297321
local res = msg["cmd"]
298-
--send_signal to client context
299-
local ok
300322
if res == PROT_DONE then
301-
shmem:set(index, res, 300, SUCCEEDED)
323+
print('res done ', index)
324+
send_signal(index, 300, SUCCEEDED)
302325
else
303-
print('bkres failed ',index)
304-
shmem:set(index, res, 300, FAILED)
326+
print('res failed ', index)
327+
send_signal(index, 300, FAILED)
305328
end
306-
else
307-
-- err can be 'timeout', 'partial write', 'closed',
308-
-- 'buffer too small' or 'out of memory'
309-
-- do nothing at this time
310329
end
311330
end
312-
tcpsock:close()
313331
end
314332

315333
local function background_enqueue_request(map, x, y, z)
@@ -333,7 +351,6 @@ local function background_enqueue_request(map, x, y, z)
333351
-- only single light thread can handle Renderd
334352
timerat(0, renderd_bk_handler)
335353
end
336-
return true
337354
end
338355

339356

@@ -343,7 +360,7 @@ end
343360
local function send_renderd_request(req)
344361
local tcpsock = tcp()
345362
tcpsock:settimeout(100)
346-
tcpsock:connect(renderdsock)
363+
tcpsock:connect(renderd_sock)
347364
local ok,err=tcpsock:send(req)
348365
if not ok then
349366
print('send ',err)
@@ -396,13 +413,10 @@ function enqueue_request (map, x, y, z)
396413
end
397414
end
398415

399-
-- enqueue command to rendering tile with map/z1/x/y coordinates. If background=true, do no wait for
400-
-- rendering complete and return true. And also request to render in background between zoom z1 to
401-
-- z2. If request fails return nil.
402-
--
403-
-- argument: map (string), x, y, z1=zoom, z2=maxzoom (int),
404-
-- background (bool, optional, default=false)
416+
-- funtion: request
417+
-- argument: map, x, y, zoom, maxzoom
405418
-- return: true or nil
419+
--
406420
function request (map, x, y, z1, z2, background)
407421
local background = background or false
408422
local z2 = tonumber(z2)
@@ -412,8 +426,7 @@ function request (map, x, y, z1, z2, background)
412426
end
413427

414428
if background then
415-
background_enqueue_request(map, x, y, z1)
416-
return true
429+
return background_enqueue_request(map, x, y, z1)
417430
end
418431

419432
local res = enqueue_request(map, x, y, z1)

0 commit comments

Comments
 (0)