@@ -4,12 +4,14 @@ pub mod upgrade;
44pub unsafe fn init ( ) {
55 use pgrx:: bgworkers:: BackgroundWorkerBuilder ;
66 use pgrx:: bgworkers:: BgWorkerStartTime ;
7+ use std:: time:: Duration ;
78 BackgroundWorkerBuilder :: new ( "vectors" )
89 . set_function ( "vectors_main" )
910 . set_library ( "vectors" )
1011 . set_argument ( None )
1112 . enable_shmem_access ( None )
1213 . set_start_time ( BgWorkerStartTime :: PostmasterStart )
14+ . set_restart_time ( Some ( Duration :: from_secs ( 1 ) ) )
1315 . load ( ) ;
1416}
1517
@@ -19,6 +21,9 @@ extern "C" fn vectors_main(_arg: pgrx::pg_sys::Datum) {
1921}
2022
2123pub fn main ( ) {
24+ pub struct AllocErrorPanicPayload {
25+ pub layout : std:: alloc:: Layout ,
26+ }
2227 {
2328 let mut builder = env_logger:: builder ( ) ;
2429 builder. target ( env_logger:: Target :: Stderr ) ;
@@ -33,6 +38,10 @@ pub fn main() {
3338 builder. init ( ) ;
3439 }
3540 std:: panic:: set_hook ( Box :: new ( |info| {
41+ if let Some ( oom) = info. payload ( ) . downcast_ref :: < AllocErrorPanicPayload > ( ) {
42+ log:: error!( "Out of memory. Layout: {:?}." , oom. layout) ;
43+ return ;
44+ }
3645 let backtrace;
3746 #[ cfg( not( debug_assertions) ) ]
3847 {
@@ -44,6 +53,9 @@ pub fn main() {
4453 }
4554 log:: error!( "Panickied. Info: {:?}. Backtrace: {}." , info, backtrace) ;
4655 } ) ) ;
56+ std:: alloc:: set_alloc_error_hook ( |layout| {
57+ std:: panic:: panic_any ( AllocErrorPanicPayload { layout } ) ;
58+ } ) ;
4759 use service:: worker:: Worker ;
4860 use std:: path:: Path ;
4961 let path = Path :: new ( "pg_vectors" ) ;
0 commit comments