@@ -44,9 +44,10 @@ static shmem_startup_hook_type prev_shmem_startup_hook = NULL;
44
44
static shm_toc * toc = NULL ;
45
45
46
46
/* global */
47
- void * workers_data = NULL ;
48
- int jsonbd_nworkers = -1 ;
49
- int jsonbd_queue_size = 0 ;
47
+ void * workers_data = NULL ;
48
+ int jsonbd_nworkers = -1 ;
49
+ int jsonbd_queue_size = 0 ;
50
+ Size jsonbd_total_queue_size = 0 ;
50
51
51
52
static void init_memory_context (bool );
52
53
static void memory_reset_callback (void * arg );
@@ -78,11 +79,14 @@ jsonbd_shmem_size(void)
78
79
/* two queues for launcher */
79
80
shm_toc_estimate_chunk (& e , shm_mq_minimum_size * 2 );
80
81
82
+ /* set total queue size */
83
+ jsonbd_total_queue_size = (Size ) (shm_mq_minimum_size + jsonbd_queue_size * 1024 );
84
+
81
85
for (i = 0 ; i < MAX_JSONBD_WORKERS ; i ++ )
82
86
{
83
87
shm_toc_estimate_chunk (& e , sizeof (jsonbd_shm_worker ));
84
- shm_toc_estimate_chunk (& e , jsonbd_get_queue_size () );
85
- shm_toc_estimate_chunk (& e , jsonbd_get_queue_size () );
88
+ shm_toc_estimate_chunk (& e , jsonbd_total_queue_size );
89
+ shm_toc_estimate_chunk (& e , jsonbd_total_queue_size );
86
90
}
87
91
88
92
/* 3 keys each worker + 3 for header (header itself and two queues) */
@@ -106,22 +110,17 @@ jsonbd_init_worker(shm_toc *toc, jsonbd_shm_worker *wd, int worker_num,
106
110
LWLockPadded * locks ;
107
111
static int mqkey = MAX_JSONBD_WORKERS + 1 ;
108
112
109
- /* each worker will have two mq, for input and output */
110
- wd -> mqin = shm_mq_create (shm_toc_allocate (toc , queue_size ), queue_size );
111
- wd -> mqout = shm_mq_create (shm_toc_allocate (toc , queue_size ), queue_size );
112
-
113
113
/* init worker context */
114
114
wd -> proc = NULL ;
115
115
wd -> dboid = InvalidOid ;
116
116
117
- shm_mq_clean_receiver (wd -> mqin );
118
- shm_mq_clean_receiver (wd -> mqout );
119
- shm_mq_clean_sender (wd -> mqin );
120
- shm_mq_clean_sender (wd -> mqout );
121
-
122
117
if (worker_num )
123
118
shm_toc_insert (toc , worker_num , wd );
124
119
120
+ /* each worker will have two mq, for input and output */
121
+ wd -> mqin = shm_mq_create (shm_toc_allocate (toc , queue_size ), queue_size );
122
+ wd -> mqout = shm_mq_create (shm_toc_allocate (toc , queue_size ), queue_size );
123
+
125
124
shm_toc_insert (toc , mqkey ++ , wd -> mqin );
126
125
shm_toc_insert (toc , mqkey ++ , wd -> mqout );
127
126
@@ -294,6 +293,8 @@ jsonbd_communicate(shm_mq_iovec *iov, int iov_len,
294
293
shm_mq_handle * mqh ;
295
294
jsonbd_shm_hdr * hdr ;
296
295
jsonbd_shm_worker * wd = NULL ;
296
+ shm_mq * mqin ,
297
+ * mqout ;
297
298
298
299
char * res ;
299
300
Size reslen ;
@@ -355,10 +356,19 @@ jsonbd_communicate(shm_mq_iovec *iov, int iov_len,
355
356
if (!LWLockAcquireOrWait (hdr -> launcher .lock , LW_EXCLUSIVE ))
356
357
continue ;
357
358
358
- shm_mq_set_sender (hdr -> launcher .mqin , MyProc );
359
- shm_mq_set_receiver (hdr -> launcher .mqout , MyProc );
359
+ mqin = shm_mq_create (hdr -> launcher .mqin , shm_mq_minimum_size );
360
+ mqout = shm_mq_create (hdr -> launcher .mqout , shm_mq_minimum_size );
361
+
362
+ /*
363
+ * important that sender on mqout should be set earlier than
364
+ * receiver on mqin
365
+ */
366
+ shm_mq_set_sender (mqout , hdr -> launcher .proc );
367
+ shm_mq_set_receiver (mqout , MyProc );
368
+ shm_mq_set_sender (mqin , MyProc );
369
+ shm_mq_set_receiver (mqin , hdr -> launcher .proc );
360
370
361
- mqh = shm_mq_attach (hdr -> launcher . mqin , NULL , NULL );
371
+ mqh = shm_mq_attach (mqin , NULL , NULL );
362
372
resmq = shm_mq_sendv (mqh ,
363
373
& ((shm_mq_iovec ) {(char * ) & MyDatabaseId , sizeof (MyDatabaseId )}), 1 , false);
364
374
if (resmq != SHM_MQ_SUCCESS )
@@ -367,7 +377,7 @@ jsonbd_communicate(shm_mq_iovec *iov, int iov_len,
367
377
368
378
if (!detached )
369
379
{
370
- mqh = shm_mq_attach (hdr -> launcher . mqout , NULL , NULL );
380
+ mqh = shm_mq_attach (mqout , NULL , NULL );
371
381
resmq = shm_mq_receive (mqh , & reslen , (void * * ) & res , false);
372
382
if (resmq != SHM_MQ_SUCCESS )
373
383
detached = true;
@@ -377,9 +387,6 @@ jsonbd_communicate(shm_mq_iovec *iov, int iov_len,
377
387
378
388
shm_mq_detach (mqh );
379
389
}
380
-
381
- shm_mq_clean_sender (hdr -> launcher .mqin );
382
- shm_mq_clean_receiver (hdr -> launcher .mqout );
383
390
LWLockRelease (hdr -> launcher .lock );
384
391
385
392
if (detached )
@@ -395,10 +402,15 @@ jsonbd_communicate(shm_mq_iovec *iov, int iov_len,
395
402
detached = false;
396
403
397
404
/* send data */
398
- shm_mq_set_sender (wd -> mqin , MyProc );
399
- shm_mq_set_receiver (wd -> mqout , MyProc );
405
+ mqin = shm_mq_create (wd -> mqin , jsonbd_total_queue_size );
406
+ mqout = shm_mq_create (wd -> mqout , jsonbd_total_queue_size );
400
407
401
- mqh = shm_mq_attach (wd -> mqin , NULL , NULL );
408
+ shm_mq_set_sender (mqin , MyProc );
409
+ shm_mq_set_receiver (mqin , wd -> proc );
410
+ shm_mq_set_sender (mqout , wd -> proc );
411
+ shm_mq_set_receiver (mqout , MyProc );
412
+
413
+ mqh = shm_mq_attach (mqin , NULL , NULL );
402
414
resmq = shm_mq_sendv (mqh , iov , iov_len , false);
403
415
if (resmq != SHM_MQ_SUCCESS )
404
416
detached = true;
@@ -407,7 +419,7 @@ jsonbd_communicate(shm_mq_iovec *iov, int iov_len,
407
419
/* get data */
408
420
if (!detached )
409
421
{
410
- mqh = shm_mq_attach (wd -> mqout , NULL , NULL );
422
+ mqh = shm_mq_attach (mqout , NULL , NULL );
411
423
resmq = shm_mq_receive (mqh , & reslen , (void * * ) & res , false);
412
424
if (resmq != SHM_MQ_SUCCESS )
413
425
detached = true;
@@ -418,10 +430,6 @@ jsonbd_communicate(shm_mq_iovec *iov, int iov_len,
418
430
shm_mq_detach (mqh );
419
431
}
420
432
421
- /* clean self as receiver and unlock mq */
422
- shm_mq_clean_sender (wd -> mqin );
423
- shm_mq_clean_receiver (wd -> mqout );
424
-
425
433
LWLockRelease (wd -> lock );
426
434
427
435
if (detached )
0 commit comments