12
12
#include "storage.h"
13
13
14
14
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
-
25
15
shmem_startup_hook_type prev_shmem_startup_hook = NULL ;
26
16
AQOSharedState * aqo_state = NULL ;
27
- HTAB * fss_htab = NULL ;
28
- static int aqo_htab_max_items = 1000 ;
29
17
int fs_max_items = 10000 ; /* Max number of different feature spaces in ML model */
30
18
int 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
-
34
19
35
- static void aqo_detach_shmem (int code , Datum arg );
36
20
static void on_shmem_shutdown (int code , Datum arg );
37
21
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
-
170
22
void
171
23
aqo_init_shmem (void )
172
24
{
@@ -177,7 +29,6 @@ aqo_init_shmem(void)
177
29
prev_shmem_startup_hook ();
178
30
179
31
aqo_state = NULL ;
180
- fss_htab = NULL ;
181
32
stat_htab = NULL ;
182
33
qtexts_htab = NULL ;
183
34
data_htab = NULL ;
@@ -189,7 +40,6 @@ aqo_init_shmem(void)
189
40
{
190
41
/* First time through ... */
191
42
192
- aqo_state -> dsm_handler = DSM_HANDLE_INVALID ;
193
43
aqo_state -> qtexts_dsa_handler = DSM_HANDLE_INVALID ;
194
44
aqo_state -> data_dsa_handler = DSM_HANDLE_INVALID ;
195
45
@@ -208,13 +58,6 @@ aqo_init_shmem(void)
208
58
LWLockInitialize (& aqo_state -> queries_lock , LWLockNewTrancheId ());
209
59
}
210
60
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
-
218
61
info .keysize = sizeof (((StatEntry * ) 0 )-> queryid );
219
62
info .entrysize = sizeof (StatEntry );
220
63
stat_htab = ShmemInitHash ("AQO Stat HTAB" , fs_max_items , fs_max_items ,
@@ -280,7 +123,6 @@ aqo_memsize(void)
280
123
Size size ;
281
124
282
125
size = MAXALIGN (sizeof (AQOSharedState ));
283
- size = add_size (size , hash_estimate_size (aqo_htab_max_items , sizeof (htab_entry )));
284
126
size = add_size (size , hash_estimate_size (fs_max_items , sizeof (AQOSharedState )));
285
127
size = add_size (size , hash_estimate_size (fs_max_items , sizeof (StatEntry )));
286
128
size = add_size (size , hash_estimate_size (fs_max_items , sizeof (QueryTextEntry )));
0 commit comments