Skip to content

PostgreSQL: notification handler is not triggered immediately on push #17

@Bogdanp

Description

@Bogdanp

I set up a notification handler on a pg connection, then made that connection LISTEN on a channel and I expected the handler to get called whenever something got published on the channel. Instead, it only gets called the next time I perform an operation on that connection after something gets published.

Looking at the code for the PostgreSQL driver, I can see that there isn't a background thread waiting on incoming data from the connection, so async notifications are only processed during/after other interactions with the connection, which explains what I'm seeing.

I was able to get around this by relying on the undocumented async-message-evt method, by spawning a thread and continually syncing on that evt:

;; The DB library needs a little push to handle async events as soon as
;; they occur. If its `async-message-evt' isnt't being synced, then it
;; won't detect async messages until the next time it gets queried.
(define (make-async-message-waiter conn)
  (thread
   (lambda _
     (let loop ()
       (sync
        (handle-evt
         (send+ conn
                (get-base)
                (async-message-evt))
         (lambda _ (loop)))
        (handle-evt
         (thread-receive-evt)
         (lambda _ (void))))))))

This works, but it would be better if the connection itself did this. At the very least, this behavior and the workaround should be documented. I'd be happy to contribute either of those things; just let me know which you prefer!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions