jhead / node-svmq

Native System V message queues in Node.js
MIT License
19 stars 10 forks source link

garbage received when sending many messages #8

Open Sfinx opened 2 years ago

Sfinx commented 2 years ago

assuming dumb sender:

'use strict'

import MessageQueue from 'svmq'

let app = {}

const APP_IPC_KEY       = 31337
const fromAPP   = 100
const toAPP     = 200

function start() {
 try {
  app = new MessageQueue(APP_IPC_KEY)
  app.send = (msg) => {
   app.push(Buffer.from(msg), { type: toAPP })
  }
  let q = 0;
  while(q++ < 100000)
    app.send('msg N' + q)
 } catch(e) {
    console.log('start failed : ' +  e.message)
 }
}

start()

and reciever:

'use strict'

import MessageQueue from 'svmq'

let app = {}

const APP_IPC_KEY       = 31337
const fromAPP   = 200
const toAPP     = 100

function start() {
 try {
  app = new MessageQueue(APP_IPC_KEY)
  app.on('data', (data) => {
   console.log('rcv: ' + data.toString())
  })
 } catch(e) {
    console.log('start failed : ' +  e.message)
 }
}

start()

receiver prints garbage to console

Sfinx commented 2 years ago

env:

Sfinx commented 2 years ago

This workaround works if used as sender:

'use strict'

import MessageQueue from 'svmq'

let app = {}

const APP_IPC_KEY       = 31337
const fromAPP   = 100
const toAPP     = 200

async function start() {
 try {
  app = new MessageQueue(APP_IPC_KEY)
  app.send = async (msg) => {
   return new Promise((resolve, reject) => {
    app.push(msg, { type: toAPP }, (err) => {
     return err ? reject(err) : resolve()
    })
   })
  }
  let q = 0;
  while(q++ < 100000)
    await app.send('msg N ' + q)
 } catch(e) {
    console.log('start failed : ' +  e.message)
 }
}

start()

Sending garbage is strange in any case: if the msgsnd is using with IPC_NOWAIT - then it must return error with full queue. If msgsnd is blocking call then it must wait until queue space will be available.