Thread: spi in bgworker

spi in bgworker

From
James Harper
Date:
The docs say I'm supposed to call BackgroundWorkerInitializeConnection in a bgworker and then I can start using spi
functions,but they aren't clear on if I should call SPI_connect too. 

If I call BackgroundWorkerInitializeConnection and then SPI_execute I get a return code of SPI_ERROR_UNCONNECTED. If I
callBackgroundWorkerInitializeConnection then SPI_connect I get a segfault. 

I'm initialising my worker as:

    strncpy(worker.bgw_name, "tds handler", sizeof(worker.bgw_name));
    worker.bgw_flags = BGWORKER_SHMEM_ACCESS | BGWORKER_BACKEND_DATABASE_CONNECTION;
    worker.bgw_start_time = BgWorkerStart_RecoveryFinished;
    worker.bgw_restart_time = BGW_NEVER_RESTART;
    //worker.bgw_main_arg = 1433;
    worker.bgw_main = tdsworker;
    RegisterDynamicBackgroundWorker(&worker, &handle);

What am I missing? (this is 9.4 obviously, as I'm using a dynamic bgworker)

Thanks

James


Re: spi in bgworker

From
Alvaro Herrera
Date:
James Harper wrote:
> The docs say I'm supposed to call BackgroundWorkerInitializeConnection in a bgworker and then I can start using spi
functions,but they aren't clear on if I should call SPI_connect too. 
>
> If I call BackgroundWorkerInitializeConnection and then SPI_execute I get a return code of SPI_ERROR_UNCONNECTED. If
Icall BackgroundWorkerInitializeConnection then SPI_connect I get a segfault. 

You need to start a transaction after initializing the database
connection.  Did you see the sample worker_spi code in contrib?

--
Álvaro Herrera                http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services


Re: spi in bgworker

From
James Harper
Date:
>
> James Harper wrote:
> > The docs say I'm supposed to call BackgroundWorkerInitializeConnection in
> a bgworker and then I can start using spi functions, but they aren't clear on if
> I should call SPI_connect too.
> >
> > If I call BackgroundWorkerInitializeConnection and then SPI_execute I get a
> return code of SPI_ERROR_UNCONNECTED. If I call
> BackgroundWorkerInitializeConnection then SPI_connect I get a segfault.
>
> You need to start a transaction after initializing the database
> connection.  Did you see the sample worker_spi code in contrib?
>

I have now. Thanks!

Is the documentation here a bit light because background workers are a new feature? Or is this general postgres
knowledgeI just haven't picked up on yet? 

Could SPI_connect return an error rather than crashing?

Thanks again

James