1
1
// Copyright 2016 TiKV Project Authors. Licensed under Apache-2.0.
2
2
use std:: pin:: Pin ;
3
+ use std:: cell:: RefCell ;
3
4
4
5
use kvproto:: { kvrpcpb, metapb, raft_cmdpb} ;
5
6
@@ -34,6 +35,10 @@ pub fn gen_engine_store_server_helper(
34
35
unsafe { & ( * ( engine_store_server_helper as * const EngineStoreServerHelper ) ) }
35
36
}
36
37
38
+ thread_local ! {
39
+ pub static JEMALLOC_REGISTERED : RefCell <bool > = RefCell :: new( false ) ;
40
+ }
41
+
37
42
/// # Safety
38
43
/// The lifetime of `engine_store_server_helper` is definitely longer than
39
44
/// `ENGINE_STORE_SERVER_HELPER_PTR`.
@@ -49,6 +54,31 @@ pub fn set_server_info_resp(res: &kvproto::diagnosticspb::ServerInfoResponse, pt
49
54
}
50
55
51
56
impl EngineStoreServerHelper {
57
+ pub fn maybe_jemalloc_register_alloc ( & self ) {
58
+ JEMALLOC_REGISTERED . with ( |b| {
59
+ if !* b. borrow ( ) {
60
+ unsafe {
61
+ let ptr_alloc: u64 = crate :: jemalloc_utils:: get_allocatep_on_thread_start ( ) ;
62
+ let ptr_dealloc: u64 = crate :: jemalloc_utils:: get_deallocatep_on_thread_start ( ) ;
63
+ let thread_name = std:: thread:: current ( ) . name ( ) . unwrap_or ( "<proxy-unknown>" ) . to_string ( ) ;
64
+ ( self . fn_report_thread_allocate_info . into_inner ( ) ) (
65
+ self . inner ,
66
+ BaseBuffView :: from ( thread_name. as_bytes ( ) ) ,
67
+ 0 ,
68
+ ptr_alloc
69
+ ) ;
70
+ ( self . fn_report_thread_allocate_info . into_inner ( ) ) (
71
+ self . inner ,
72
+ BaseBuffView :: from ( thread_name. as_bytes ( ) ) ,
73
+ 1 ,
74
+ ptr_dealloc
75
+ ) ;
76
+ }
77
+ * ( b. borrow_mut ( ) ) = true ;
78
+ }
79
+ } ) ;
80
+ }
81
+
52
82
pub fn gc_raw_cpp_ptr ( & self , ptr : * mut :: std:: os:: raw:: c_void , tp : RawCppPtrType ) {
53
83
debug_assert ! ( self . fn_gc_raw_cpp_ptr. is_some( ) ) ;
54
84
unsafe {
@@ -82,6 +112,7 @@ impl EngineStoreServerHelper {
82
112
83
113
pub fn handle_compute_store_stats ( & self ) -> StoreStats {
84
114
debug_assert ! ( self . fn_handle_compute_store_stats. is_some( ) ) ;
115
+ self . maybe_jemalloc_register_alloc ( ) ;
85
116
unsafe { ( self . fn_handle_compute_store_stats . into_inner ( ) ) ( self . inner ) }
86
117
}
87
118
@@ -91,16 +122,19 @@ impl EngineStoreServerHelper {
91
122
header : RaftCmdHeader ,
92
123
) -> EngineStoreApplyRes {
93
124
debug_assert ! ( self . fn_handle_write_raft_cmd. is_some( ) ) ;
125
+ self . maybe_jemalloc_register_alloc ( ) ;
94
126
unsafe { ( self . fn_handle_write_raft_cmd . into_inner ( ) ) ( self . inner , cmds. gen_view ( ) , header) }
95
127
}
96
128
97
129
pub fn handle_get_engine_store_server_status ( & self ) -> EngineStoreServerStatus {
98
130
debug_assert ! ( self . fn_handle_get_engine_store_server_status. is_some( ) ) ;
131
+ self . maybe_jemalloc_register_alloc ( ) ;
99
132
unsafe { ( self . fn_handle_get_engine_store_server_status . into_inner ( ) ) ( self . inner ) }
100
133
}
101
134
102
135
pub fn handle_set_proxy ( & self , proxy : * const RaftStoreProxyFFIHelper ) {
103
136
debug_assert ! ( self . fn_atomic_update_proxy. is_some( ) ) ;
137
+ self . maybe_jemalloc_register_alloc ( ) ;
104
138
unsafe { ( self . fn_atomic_update_proxy . into_inner ( ) ) ( self . inner , proxy as * mut _ ) }
105
139
}
106
140
@@ -129,7 +163,7 @@ impl EngineStoreServerHelper {
129
163
header : RaftCmdHeader ,
130
164
) -> EngineStoreApplyRes {
131
165
debug_assert ! ( self . fn_handle_admin_raft_cmd. is_some( ) ) ;
132
-
166
+ self . maybe_jemalloc_register_alloc ( ) ;
133
167
unsafe {
134
168
let req = ProtoMsgBaseBuff :: new ( req) ;
135
169
let resp = ProtoMsgBaseBuff :: new ( resp) ;
@@ -158,6 +192,7 @@ impl EngineStoreServerHelper {
158
192
term : u64 ,
159
193
) -> bool {
160
194
debug_assert ! ( self . fn_try_flush_data. is_some( ) ) ;
195
+ self . maybe_jemalloc_register_alloc ( ) ;
161
196
// TODO(proactive flush)
162
197
unsafe {
163
198
( self . fn_try_flush_data . into_inner ( ) ) (
@@ -187,6 +222,7 @@ impl EngineStoreServerHelper {
187
222
) -> RawCppPtr {
188
223
debug_assert ! ( self . fn_pre_handle_snapshot. is_some( ) ) ;
189
224
225
+ self . maybe_jemalloc_register_alloc ( ) ;
190
226
let snaps_view = into_sst_views ( snaps) ;
191
227
unsafe {
192
228
let region = ProtoMsgBaseBuff :: new ( region) ;
@@ -203,13 +239,15 @@ impl EngineStoreServerHelper {
203
239
204
240
pub fn apply_pre_handled_snapshot ( & self , snap : RawCppPtr ) {
205
241
debug_assert ! ( self . fn_apply_pre_handled_snapshot. is_some( ) ) ;
242
+ self . maybe_jemalloc_register_alloc ( ) ;
206
243
unsafe {
207
244
( self . fn_apply_pre_handled_snapshot . into_inner ( ) ) ( self . inner , snap. ptr , snap. type_ )
208
245
}
209
246
}
210
247
211
248
pub fn abort_pre_handle_snapshot ( & self , region_id : u64 , peer_id : u64 ) {
212
249
debug_assert ! ( self . fn_abort_pre_handle_snapshot. is_some( ) ) ;
250
+ self . maybe_jemalloc_register_alloc ( ) ;
213
251
unsafe { ( self . fn_abort_pre_handle_snapshot . into_inner ( ) ) ( self . inner , region_id, peer_id) }
214
252
}
215
253
@@ -277,6 +315,7 @@ impl EngineStoreServerHelper {
277
315
) -> EngineStoreApplyRes {
278
316
debug_assert ! ( self . fn_handle_ingest_sst. is_some( ) ) ;
279
317
318
+ self . maybe_jemalloc_register_alloc ( ) ;
280
319
let snaps_view = into_sst_views ( snaps) ;
281
320
unsafe {
282
321
( self . fn_handle_ingest_sst . into_inner ( ) ) (
@@ -290,6 +329,7 @@ impl EngineStoreServerHelper {
290
329
pub fn handle_destroy ( & self , region_id : u64 ) {
291
330
debug_assert ! ( self . fn_handle_destroy. is_some( ) ) ;
292
331
332
+ self . maybe_jemalloc_register_alloc ( ) ;
293
333
unsafe {
294
334
( self . fn_handle_destroy . into_inner ( ) ) ( self . inner , region_id) ;
295
335
}
0 commit comments