1212#include "storage.h"
1313
1414
15- typedef struct
16- {
17- int magic ;
18- uint32 total_size ;
19- uint32 delta ;
20- } dsm_seg_hdr ;
21-
22- #define free_space (hdr ) (uint32) (temp_storage_size - sizeof(dsm_seg_hdr) - hdr->delta)
23- #define addr (delta ) ((char *) dsm_segment_address(seg) + sizeof(dsm_seg_hdr) + delta)
24-
2515shmem_startup_hook_type prev_shmem_startup_hook = NULL ;
2616AQOSharedState * aqo_state = NULL ;
27- HTAB * fss_htab = NULL ;
28- static int aqo_htab_max_items = 1000 ;
2917int fs_max_items = 10000 ; /* Max number of different feature spaces in ML model */
3018int fss_max_items = 100000 ; /* Max number of different feature subspaces in ML model */
31- static uint32 temp_storage_size = 1024 * 1024 * 10 ; /* Storage size, in bytes */
32- static dsm_segment * seg = NULL ;
33-
3419
35- static void aqo_detach_shmem (int code , Datum arg );
3620static void on_shmem_shutdown (int code , Datum arg );
3721
38-
39- void *
40- get_dsm_all (uint32 * size )
41- {
42- dsm_seg_hdr * hdr ;
43-
44- Assert (LWLockHeldByMeInMode (& aqo_state -> lock , LW_EXCLUSIVE ));
45-
46- if (aqo_state -> dsm_handler == DSM_HANDLE_INVALID )
47- {
48- /* Fast path. No any cached data exists. */
49- * size = 0 ;
50- return NULL ;
51- }
52-
53- if (!seg )
54- {
55- /* if segment exists we should connect to */
56- seg = dsm_attach (aqo_state -> dsm_handler );
57- Assert (seg );
58- dsm_pin_mapping (seg );
59- before_shmem_exit (aqo_detach_shmem , (Datum ) & aqo_state -> dsm_handler );
60- }
61-
62- hdr = (dsm_seg_hdr * ) dsm_segment_address (seg );
63- * size = hdr -> delta ;
64- return (char * ) hdr + sizeof (dsm_seg_hdr );
65- }
66-
67- /*
68- * Cleanup of DSM cache: set header into default state and zero the memory block.
69- * This operation can be coupled with the cache dump, so we do it under an external
70- * hold of the lock.
71- */
72- void
73- reset_dsm_cache (void )
74- {
75- dsm_seg_hdr * hdr ;
76- char * start ;
77-
78- Assert (LWLockHeldByMeInMode (& aqo_state -> lock , LW_EXCLUSIVE ));
79-
80- if (aqo_state -> dsm_handler == DSM_HANDLE_INVALID || !seg )
81- /* Fast path. No any cached data exists. */
82- return ;
83-
84- hdr = (dsm_seg_hdr * ) dsm_segment_address (seg );
85- start = (char * ) hdr + sizeof (dsm_seg_hdr );
86-
87- /* Reset the cache */
88- memset (start , 0 , hdr -> delta );
89-
90- hdr -> delta = 0 ;
91- hdr -> total_size = temp_storage_size - sizeof (dsm_seg_hdr );
92- }
93-
94- char *
95- get_cache_address (void )
96- {
97- dsm_seg_hdr * hdr ;
98-
99- Assert (LWLockHeldByMeInMode (& aqo_state -> lock , LW_EXCLUSIVE ) ||
100- LWLockHeldByMeInMode (& aqo_state -> lock , LW_SHARED ));
101-
102- if (aqo_state -> dsm_handler != DSM_HANDLE_INVALID )
103- {
104- if (!seg )
105- {
106- /* Another process created the segment yet. Just attach to. */
107- seg = dsm_attach (aqo_state -> dsm_handler );
108- dsm_pin_mapping (seg );
109- before_shmem_exit (aqo_detach_shmem , (Datum ) & aqo_state -> dsm_handler );
110- }
111-
112- hdr = (dsm_seg_hdr * ) dsm_segment_address (seg );
113- }
114- else
115- {
116- /*
117- * First request for DSM cache in this instance.
118- * Create the DSM segment. Pin it to live up to instance shutdown.
119- * Don't forget to detach DSM segment before an exit.
120- */
121- seg = dsm_create (temp_storage_size , 0 );
122- dsm_pin_mapping (seg );
123- dsm_pin_segment (seg );
124- aqo_state -> dsm_handler = dsm_segment_handle (seg );
125- before_shmem_exit (aqo_detach_shmem , (Datum ) & aqo_state -> dsm_handler );
126-
127- hdr = (dsm_seg_hdr * ) dsm_segment_address (seg );
128- hdr -> magic = AQO_SHARED_MAGIC ;
129- hdr -> delta = 0 ;
130- hdr -> total_size = temp_storage_size - sizeof (dsm_seg_hdr );
131- }
132-
133- Assert (seg );
134- Assert (hdr -> magic == AQO_SHARED_MAGIC && hdr -> total_size > 0 );
135-
136- return (char * ) hdr + sizeof (dsm_seg_hdr );
137- }
138-
139- uint32
140- get_dsm_cache_pos (uint32 size )
141- {
142- dsm_seg_hdr * hdr ;
143- uint32 pos ;
144-
145- Assert (LWLockHeldByMeInMode (& aqo_state -> lock , LW_EXCLUSIVE ) ||
146- LWLockHeldByMeInMode (& aqo_state -> lock , LW_SHARED ));
147-
148- (void ) get_cache_address ();
149- hdr = (dsm_seg_hdr * ) dsm_segment_address (seg );
150-
151- if (free_space (hdr ) < size || size == 0 )
152- elog (ERROR ,
153- "DSM cache can't allcoate a mem block. Required: %u, free: %u" ,
154- size , free_space (hdr ));
155-
156- pos = hdr -> delta ;
157- hdr -> delta += size ;
158- Assert (free_space (hdr ) >= 0 );
159- return pos ;
160- }
161-
162- static void
163- aqo_detach_shmem (int code , Datum arg )
164- {
165- if (seg != NULL )
166- dsm_detach (seg );
167- seg = NULL ;
168- }
169-
17022void
17123aqo_init_shmem (void )
17224{
@@ -177,7 +29,6 @@ aqo_init_shmem(void)
17729 prev_shmem_startup_hook ();
17830
17931 aqo_state = NULL ;
180- fss_htab = NULL ;
18132 stat_htab = NULL ;
18233 qtexts_htab = NULL ;
18334 data_htab = NULL ;
@@ -189,7 +40,6 @@ aqo_init_shmem(void)
18940 {
19041 /* First time through ... */
19142
192- aqo_state -> dsm_handler = DSM_HANDLE_INVALID ;
19343 aqo_state -> qtexts_dsa_handler = DSM_HANDLE_INVALID ;
19444 aqo_state -> data_dsa_handler = DSM_HANDLE_INVALID ;
19545
@@ -208,13 +58,6 @@ aqo_init_shmem(void)
20858 LWLockInitialize (& aqo_state -> queries_lock , LWLockNewTrancheId ());
20959 }
21060
211- info .keysize = sizeof (htab_key );
212- info .entrysize = sizeof (htab_entry );
213- fss_htab = ShmemInitHash ("AQO hash" ,
214- aqo_htab_max_items , aqo_htab_max_items ,
215- & info ,
216- HASH_ELEM | HASH_BLOBS );
217-
21861 info .keysize = sizeof (((StatEntry * ) 0 )-> queryid );
21962 info .entrysize = sizeof (StatEntry );
22063 stat_htab = ShmemInitHash ("AQO Stat HTAB" , fs_max_items , fs_max_items ,
@@ -280,7 +123,6 @@ aqo_memsize(void)
280123 Size size ;
281124
282125 size = MAXALIGN (sizeof (AQOSharedState ));
283- size = add_size (size , hash_estimate_size (aqo_htab_max_items , sizeof (htab_entry )));
284126 size = add_size (size , hash_estimate_size (fs_max_items , sizeof (AQOSharedState )));
285127 size = add_size (size , hash_estimate_size (fs_max_items , sizeof (StatEntry )));
286128 size = add_size (size , hash_estimate_size (fs_max_items , sizeof (QueryTextEntry )));
0 commit comments