@@ -4,12 +4,14 @@ pub mod upgrade;
4
4
pub unsafe fn init ( ) {
5
5
use pgrx:: bgworkers:: BackgroundWorkerBuilder ;
6
6
use pgrx:: bgworkers:: BgWorkerStartTime ;
7
+ use std:: time:: Duration ;
7
8
BackgroundWorkerBuilder :: new ( "vectors" )
8
9
. set_function ( "vectors_main" )
9
10
. set_library ( "vectors" )
10
11
. set_argument ( None )
11
12
. enable_shmem_access ( None )
12
13
. set_start_time ( BgWorkerStartTime :: PostmasterStart )
14
+ . set_restart_time ( Some ( Duration :: from_secs ( 1 ) ) )
13
15
. load ( ) ;
14
16
}
15
17
@@ -19,6 +21,9 @@ extern "C" fn vectors_main(_arg: pgrx::pg_sys::Datum) {
19
21
}
20
22
21
23
pub fn main ( ) {
24
+ pub struct AllocErrorPanicPayload {
25
+ pub layout : std:: alloc:: Layout ,
26
+ }
22
27
{
23
28
let mut builder = env_logger:: builder ( ) ;
24
29
builder. target ( env_logger:: Target :: Stderr ) ;
@@ -33,6 +38,10 @@ pub fn main() {
33
38
builder. init ( ) ;
34
39
}
35
40
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
+ }
36
45
let backtrace;
37
46
#[ cfg( not( debug_assertions) ) ]
38
47
{
@@ -44,6 +53,9 @@ pub fn main() {
44
53
}
45
54
log:: error!( "Panickied. Info: {:?}. Backtrace: {}." , info, backtrace) ;
46
55
} ) ) ;
56
+ std:: alloc:: set_alloc_error_hook ( |layout| {
57
+ std:: panic:: panic_any ( AllocErrorPanicPayload { layout } ) ;
58
+ } ) ;
47
59
use service:: worker:: Worker ;
48
60
use std:: path:: Path ;
49
61
let path = Path :: new ( "pg_vectors" ) ;
0 commit comments