@@ -50,7 +50,7 @@ module(...)
50
50
51
51
_VERSION = ' 0.1'
52
52
53
- local renderdsock = ' unix:/var/run/renderd/renderd.socket'
53
+ local renderd_sock = ' unix:/var/run/renderd/renderd.socket'
54
54
local renderd_cmd_size = 64
55
55
56
56
-- ------------------------------------
231
231
--
232
232
local renderd_bk_handler
233
233
renderd_bk_handler = function (premature )
234
- local renderdsock = ' unix:/var/run/renderd/renderd.socket'
234
+ local renderd_sock = ' unix:/var/run/renderd/renderd.socket'
235
235
local renderd_cmd_size = 64
236
236
local shmem = ngx .shared .osm_renderd
237
237
@@ -261,55 +261,73 @@ renderd_bk_handler = function (premature)
261
261
return msg
262
262
end
263
263
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
+
264
293
if premature then
265
294
-- clean up
266
295
shmem :delete (' _renderd_handler' )
267
296
return
268
297
end
269
298
270
- local tcpsock = ngx .socket .tcp ()
271
- tcpsock :connect (renderdsock )
272
- tcpsock :settimeout (100 )
273
-
299
+ -- repeat this in single background light thread
274
300
while true do
275
- -- send requests first...
301
+ local req = nil
302
+
303
+ -- get request
276
304
local indexes = shmem :get_keys ()
277
305
for key ,index in pairs (indexes ) do
278
- local req , flag = shmem :get (index )
306
+ local request , flag = shmem :get (index )
279
307
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
286
309
end
287
310
end
288
311
289
312
sleep (0.1 )
290
313
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
296
320
local index = get_key (msg [" map" ], msg [" x" ], msg [" y" ], msg [" z" ])
297
321
local res = msg [" cmd" ]
298
- -- send_signal to client context
299
- local ok
300
322
if res == PROT_DONE then
301
- shmem :set (index , res , 300 , SUCCEEDED )
323
+ print (' res done ' , index )
324
+ send_signal (index , 300 , SUCCEEDED )
302
325
else
303
- print (' bkres failed ' ,index )
304
- shmem : set (index , res , 300 , FAILED )
326
+ print (' res failed ' , index )
327
+ send_signal (index , 300 , FAILED )
305
328
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
310
329
end
311
330
end
312
- tcpsock :close ()
313
331
end
314
332
315
333
local function background_enqueue_request (map , x , y , z )
@@ -333,7 +351,6 @@ local function background_enqueue_request(map, x, y, z)
333
351
-- only single light thread can handle Renderd
334
352
timerat (0 , renderd_bk_handler )
335
353
end
336
- return true
337
354
end
338
355
339
356
343
360
local function send_renderd_request (req )
344
361
local tcpsock = tcp ()
345
362
tcpsock :settimeout (100 )
346
- tcpsock :connect (renderdsock )
363
+ tcpsock :connect (renderd_sock )
347
364
local ok ,err = tcpsock :send (req )
348
365
if not ok then
349
366
print (' send ' ,err )
@@ -396,13 +413,10 @@ function enqueue_request (map, x, y, z)
396
413
end
397
414
end
398
415
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
405
418
-- return: true or nil
419
+ --
406
420
function request (map , x , y , z1 , z2 , background )
407
421
local background = background or false
408
422
local z2 = tonumber (z2 )
@@ -412,8 +426,7 @@ function request (map, x, y, z1, z2, background)
412
426
end
413
427
414
428
if background then
415
- background_enqueue_request (map , x , y , z1 )
416
- return true
429
+ return background_enqueue_request (map , x , y , z1 )
417
430
end
418
431
419
432
local res = enqueue_request (map , x , y , z1 )
0 commit comments