/src/hdf5/src/H5Clog_trace.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
2 | | * Copyright by The HDF Group. * |
3 | | * All rights reserved. * |
4 | | * * |
5 | | * This file is part of HDF5. The full HDF5 copyright notice, including * |
6 | | * terms governing use, modification, and redistribution, is contained in * |
7 | | * the LICENSE file, which can be found at the root of the source code * |
8 | | * distribution tree, or in https://www.hdfgroup.org/licenses. * |
9 | | * If you do not have access to either file, you may request a copy from * |
10 | | * help@hdfgroup.org. * |
11 | | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ |
12 | | |
13 | | /*------------------------------------------------------------------------- |
14 | | * |
15 | | * Created: H5Clog_trace.c |
16 | | * |
17 | | * Purpose: Cache log implementation that emits trace entries intended |
18 | | * for consumption by a future 'cache replay' feature. |
19 | | * |
20 | | *------------------------------------------------------------------------- |
21 | | */ |
22 | | |
23 | | /****************/ |
24 | | /* Module Setup */ |
25 | | /****************/ |
26 | | #include "H5Cmodule.h" /* This source code file is part of the H5C module */ |
27 | | |
28 | | /***********/ |
29 | | /* Headers */ |
30 | | /***********/ |
31 | | #include "H5private.h" /* Generic Functions */ |
32 | | #include "H5Cpkg.h" /* Cache */ |
33 | | #include "H5Clog.h" /* Cache logging */ |
34 | | #include "H5Eprivate.h" /* Error handling */ |
35 | | #include "H5MMprivate.h" /* Memory management */ |
36 | | |
37 | | /****************/ |
38 | | /* Local Macros */ |
39 | | /****************/ |
40 | | |
41 | | /* Max log message size */ |
42 | 0 | #define H5C_MAX_TRACE_LOG_MSG_SIZE 4096 |
43 | | |
44 | | /******************/ |
45 | | /* Local Typedefs */ |
46 | | /******************/ |
47 | | |
48 | | /********************/ |
49 | | /* Package Typedefs */ |
50 | | /********************/ |
51 | | |
52 | | typedef struct H5C_log_trace_udata_t { |
53 | | FILE *outfile; |
54 | | char *message; |
55 | | } H5C_log_trace_udata_t; |
56 | | |
57 | | /********************/ |
58 | | /* Local Prototypes */ |
59 | | /********************/ |
60 | | |
61 | | /* Internal message handling calls */ |
62 | | static herr_t H5C__trace_write_log_message(H5C_log_trace_udata_t *trace_udata); |
63 | | |
64 | | /* Log message callbacks */ |
65 | | static herr_t H5C__trace_tear_down_logging(H5C_log_info_t *log_info); |
66 | | static herr_t H5C__trace_write_expunge_entry_log_msg(void *udata, haddr_t address, int type_id, |
67 | | herr_t fxn_ret_value); |
68 | | static herr_t H5C__trace_write_flush_cache_log_msg(void *udata, herr_t fxn_ret_value); |
69 | | static herr_t H5C__trace_write_insert_entry_log_msg(void *udata, haddr_t address, int type_id, unsigned flags, |
70 | | size_t size, herr_t fxn_ret_value); |
71 | | static herr_t H5C__trace_write_mark_entry_dirty_log_msg(void *udata, const H5C_cache_entry_t *entry, |
72 | | herr_t fxn_ret_value); |
73 | | static herr_t H5C__trace_write_mark_entry_clean_log_msg(void *udata, const H5C_cache_entry_t *entry, |
74 | | herr_t fxn_ret_value); |
75 | | static herr_t H5C__trace_write_mark_unserialized_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, |
76 | | herr_t fxn_ret_value); |
77 | | static herr_t H5C__trace_write_mark_serialized_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, |
78 | | herr_t fxn_ret_value); |
79 | | static herr_t H5C__trace_write_move_entry_log_msg(void *udata, haddr_t old_addr, haddr_t new_addr, |
80 | | int type_id, herr_t fxn_ret_value); |
81 | | static herr_t H5C__trace_write_pin_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, |
82 | | herr_t fxn_ret_value); |
83 | | static herr_t H5C__trace_write_create_fd_log_msg(void *udata, const H5C_cache_entry_t *parent, |
84 | | const H5C_cache_entry_t *child, herr_t fxn_ret_value); |
85 | | static herr_t H5C__trace_write_protect_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, int type_id, |
86 | | unsigned flags, herr_t fxn_ret_value); |
87 | | static herr_t H5C__trace_write_resize_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, |
88 | | size_t new_size, herr_t fxn_ret_value); |
89 | | static herr_t H5C__trace_write_unpin_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, |
90 | | herr_t fxn_ret_value); |
91 | | static herr_t H5C__trace_write_destroy_fd_log_msg(void *udata, const H5C_cache_entry_t *parent, |
92 | | const H5C_cache_entry_t *child, herr_t fxn_ret_value); |
93 | | static herr_t H5C__trace_write_unprotect_entry_log_msg(void *udata, haddr_t address, int type_id, |
94 | | unsigned flags, herr_t fxn_ret_value); |
95 | | static herr_t H5C__trace_write_set_cache_config_log_msg(void *udata, const H5AC_cache_config_t *config, |
96 | | herr_t fxn_ret_value); |
97 | | static herr_t H5C__trace_write_remove_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, |
98 | | herr_t fxn_ret_value); |
99 | | |
100 | | /*********************/ |
101 | | /* Package Variables */ |
102 | | /*********************/ |
103 | | |
104 | | /*****************************/ |
105 | | /* Library Private Variables */ |
106 | | /*****************************/ |
107 | | |
108 | | /*******************/ |
109 | | /* Local Variables */ |
110 | | /*******************/ |
111 | | |
112 | | /* Note that there's no cache set up call since that's the |
113 | | * place where this struct is wired into the cache. |
114 | | */ |
115 | | static const H5C_log_class_t H5C_trace_log_class_g = {"trace", |
116 | | H5C__trace_tear_down_logging, |
117 | | NULL, /* start logging */ |
118 | | NULL, /* stop logging */ |
119 | | NULL, /* write start message */ |
120 | | NULL, /* write stop message */ |
121 | | NULL, /* write create cache message */ |
122 | | NULL, /* write destroy cache message */ |
123 | | NULL, /* write evict cache message */ |
124 | | H5C__trace_write_expunge_entry_log_msg, |
125 | | H5C__trace_write_flush_cache_log_msg, |
126 | | H5C__trace_write_insert_entry_log_msg, |
127 | | H5C__trace_write_mark_entry_dirty_log_msg, |
128 | | H5C__trace_write_mark_entry_clean_log_msg, |
129 | | H5C__trace_write_mark_unserialized_entry_log_msg, |
130 | | H5C__trace_write_mark_serialized_entry_log_msg, |
131 | | H5C__trace_write_move_entry_log_msg, |
132 | | H5C__trace_write_pin_entry_log_msg, |
133 | | H5C__trace_write_create_fd_log_msg, |
134 | | H5C__trace_write_protect_entry_log_msg, |
135 | | H5C__trace_write_resize_entry_log_msg, |
136 | | H5C__trace_write_unpin_entry_log_msg, |
137 | | H5C__trace_write_destroy_fd_log_msg, |
138 | | H5C__trace_write_unprotect_entry_log_msg, |
139 | | H5C__trace_write_set_cache_config_log_msg, |
140 | | H5C__trace_write_remove_entry_log_msg}; |
141 | | |
142 | | /*------------------------------------------------------------------------- |
143 | | * Function: H5C__trace_write_log_message |
144 | | * |
145 | | * Purpose: Write a message to the log file and flush the file. |
146 | | * The message string is neither modified nor freed. |
147 | | * |
148 | | * Return: SUCCEED/FAIL |
149 | | * |
150 | | *------------------------------------------------------------------------- |
151 | | */ |
152 | | static herr_t |
153 | | H5C__trace_write_log_message(H5C_log_trace_udata_t *trace_udata) |
154 | 0 | { |
155 | 0 | size_t n_chars; |
156 | 0 | herr_t ret_value = SUCCEED; /* Return value */ |
157 | |
|
158 | 0 | FUNC_ENTER_PACKAGE |
159 | | |
160 | | /* Sanity checks */ |
161 | 0 | assert(trace_udata); |
162 | 0 | assert(trace_udata->outfile); |
163 | 0 | assert(trace_udata->message); |
164 | | |
165 | | /* Write the log message and flush */ |
166 | 0 | n_chars = strlen(trace_udata->message); |
167 | 0 | if ((int)n_chars != fprintf(trace_udata->outfile, "%s", trace_udata->message)) |
168 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "error writing log message"); |
169 | 0 | memset((void *)(trace_udata->message), 0, (size_t)(n_chars * sizeof(char))); |
170 | |
|
171 | 0 | done: |
172 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
173 | 0 | } /* H5C__trace_write_log_message() */ |
174 | | |
175 | | /*------------------------------------------------------------------------- |
176 | | * Function: H5C__log_trace_set_up |
177 | | * |
178 | | * Purpose: Setup for metadata cache logging. |
179 | | * |
180 | | * Metadata logging is enabled and disabled at two levels. This |
181 | | * function and the associated tear_down function open and close |
182 | | * the log file. the start_ and stop_logging functions are then |
183 | | * used to switch logging on/off. Optionally, logging can begin |
184 | | * as soon as the log file is opened (set via the start_immediately |
185 | | * parameter to this function). |
186 | | * |
187 | | * The log functionality is split between the H5C and H5AC |
188 | | * packages. Log state and direct log manipulation resides in |
189 | | * H5C. Log messages are generated in H5AC and sent to |
190 | | * the H5C__trace_write_log_message function. |
191 | | * |
192 | | * Return: SUCCEED/FAIL |
193 | | * |
194 | | *------------------------------------------------------------------------- |
195 | | */ |
196 | | herr_t |
197 | | H5C__log_trace_set_up(H5C_log_info_t *log_info, const char log_location[], int mpi_rank) |
198 | 0 | { |
199 | 0 | H5C_log_trace_udata_t *trace_udata = NULL; |
200 | 0 | char *file_name = NULL; |
201 | 0 | size_t n_chars; |
202 | 0 | herr_t ret_value = SUCCEED; /* Return value */ |
203 | |
|
204 | 0 | FUNC_ENTER_PACKAGE |
205 | | |
206 | | /* Sanity checks */ |
207 | 0 | assert(log_info); |
208 | 0 | assert(log_location); |
209 | | |
210 | | /* Set up the class struct */ |
211 | 0 | log_info->cls = &H5C_trace_log_class_g; |
212 | | |
213 | | /* Allocate memory for the JSON-specific data */ |
214 | 0 | if (NULL == (log_info->udata = H5MM_calloc(sizeof(H5C_log_trace_udata_t)))) |
215 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "memory allocation failed"); |
216 | 0 | trace_udata = (H5C_log_trace_udata_t *)(log_info->udata); |
217 | | |
218 | | /* Allocate memory for the message buffer */ |
219 | 0 | if (NULL == (trace_udata->message = (char *)H5MM_calloc(H5C_MAX_TRACE_LOG_MSG_SIZE * sizeof(char)))) |
220 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "memory allocation failed"); |
221 | | |
222 | | /* Possibly fix up the log file name. |
223 | | * The extra 39 characters are for adding the rank to the file name |
224 | | * under parallel HDF5. 39 characters allows > 2^127 processes which |
225 | | * should be enough for anybody. |
226 | | * |
227 | | * allocation size = <path length> + dot + <rank # length> + \0 |
228 | | */ |
229 | 0 | n_chars = strlen(log_location) + 1 + 39 + 1; |
230 | 0 | if (NULL == (file_name = (char *)H5MM_calloc(n_chars * sizeof(char)))) |
231 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, |
232 | 0 | "can't allocate memory for mdc log file name manipulation"); |
233 | | |
234 | | /* Add the rank to the log file name when MPI is in use */ |
235 | 0 | if (-1 == mpi_rank) |
236 | 0 | snprintf(file_name, n_chars, "%s", log_location); |
237 | 0 | else |
238 | 0 | snprintf(file_name, n_chars, "%s.%d", log_location, mpi_rank); |
239 | | |
240 | | /* Open log file and set it to be unbuffered */ |
241 | 0 | if (NULL == (trace_udata->outfile = fopen(file_name, "w"))) |
242 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "can't create mdc log file"); |
243 | 0 | setbuf(trace_udata->outfile, NULL); |
244 | | |
245 | | /* Write the header */ |
246 | 0 | fprintf(trace_udata->outfile, "### HDF5 metadata cache trace file version 1 ###\n"); |
247 | |
|
248 | 0 | done: |
249 | 0 | if (file_name) |
250 | 0 | H5MM_xfree(file_name); |
251 | | |
252 | | /* Free and reset the log info struct on errors */ |
253 | 0 | if (FAIL == ret_value) { |
254 | | /* Free */ |
255 | 0 | if (trace_udata && trace_udata->message) |
256 | 0 | H5MM_xfree(trace_udata->message); |
257 | 0 | if (trace_udata) |
258 | 0 | H5MM_xfree(trace_udata); |
259 | | |
260 | | /* Reset */ |
261 | 0 | log_info->udata = NULL; |
262 | 0 | log_info->cls = NULL; |
263 | 0 | } |
264 | |
|
265 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
266 | 0 | } /* H5C__log_trace_set_up() */ |
267 | | |
268 | | /*------------------------------------------------------------------------- |
269 | | * Function: H5C__trace_tear_down_logging |
270 | | * |
271 | | * Purpose: Tear-down for metadata cache logging. |
272 | | * |
273 | | * Return: SUCCEED/FAIL |
274 | | * |
275 | | *------------------------------------------------------------------------- |
276 | | */ |
277 | | static herr_t |
278 | | H5C__trace_tear_down_logging(H5C_log_info_t *log_info) |
279 | 0 | { |
280 | 0 | H5C_log_trace_udata_t *trace_udata = NULL; |
281 | 0 | herr_t ret_value = SUCCEED; /* Return value */ |
282 | |
|
283 | 0 | FUNC_ENTER_PACKAGE |
284 | | |
285 | | /* Sanity checks */ |
286 | 0 | assert(log_info); |
287 | | |
288 | | /* Alias */ |
289 | 0 | trace_udata = (H5C_log_trace_udata_t *)(log_info->udata); |
290 | | |
291 | | /* Free the message buffer */ |
292 | 0 | H5MM_xfree(trace_udata->message); |
293 | | |
294 | | /* Close log file */ |
295 | 0 | if (EOF == fclose(trace_udata->outfile)) |
296 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "problem closing mdc log file"); |
297 | 0 | trace_udata->outfile = NULL; |
298 | | |
299 | | /* Fre the udata */ |
300 | 0 | H5MM_xfree(trace_udata); |
301 | | |
302 | | /* Reset the log class info and udata */ |
303 | 0 | log_info->cls = NULL; |
304 | 0 | log_info->udata = NULL; |
305 | |
|
306 | 0 | done: |
307 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
308 | 0 | } /* H5C__trace_tear_down_logging() */ |
309 | | |
310 | | /*------------------------------------------------------------------------- |
311 | | * Function: H5C__trace_write_expunge_entry_log_msg |
312 | | * |
313 | | * Purpose: Write a log message for expunge of cache entries. |
314 | | * |
315 | | * Return: SUCCEED/FAIL |
316 | | * |
317 | | *------------------------------------------------------------------------- |
318 | | */ |
319 | | static herr_t |
320 | | H5C__trace_write_expunge_entry_log_msg(void *udata, haddr_t address, int type_id, herr_t fxn_ret_value) |
321 | 0 | { |
322 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
323 | 0 | herr_t ret_value = SUCCEED; |
324 | |
|
325 | 0 | FUNC_ENTER_PACKAGE |
326 | | |
327 | | /* Sanity checks */ |
328 | 0 | assert(trace_udata); |
329 | 0 | assert(trace_udata->message); |
330 | | |
331 | | /* Create the log message string */ |
332 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_expunge_entry 0x%lx %d %d\n", |
333 | 0 | (unsigned long)address, type_id, (int)fxn_ret_value); |
334 | | |
335 | | /* Write the log message to the file */ |
336 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
337 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
338 | | |
339 | 0 | done: |
340 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
341 | 0 | } /* H5C__trace_write_expunge_entry_log_msg() */ |
342 | | |
343 | | /*------------------------------------------------------------------------- |
344 | | * Function: H5C__trace_write_flush_cache_log_msg |
345 | | * |
346 | | * Purpose: Write a log message for cache flushes. |
347 | | * |
348 | | * Return: SUCCEED/FAIL |
349 | | * |
350 | | *------------------------------------------------------------------------- |
351 | | */ |
352 | | static herr_t |
353 | | H5C__trace_write_flush_cache_log_msg(void *udata, herr_t fxn_ret_value) |
354 | 0 | { |
355 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
356 | 0 | herr_t ret_value = SUCCEED; |
357 | |
|
358 | 0 | FUNC_ENTER_PACKAGE |
359 | | |
360 | | /* Sanity checks */ |
361 | 0 | assert(trace_udata); |
362 | 0 | assert(trace_udata->message); |
363 | | |
364 | | /* Create the log message string */ |
365 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_flush %d\n", (int)fxn_ret_value); |
366 | | |
367 | | /* Write the log message to the file */ |
368 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
369 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
370 | | |
371 | 0 | done: |
372 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
373 | 0 | } /* H5C__trace_write_flush_cache_log_msg() */ |
374 | | |
375 | | /*------------------------------------------------------------------------- |
376 | | * Function: H5C__trace_write_insert_entry_log_msg |
377 | | * |
378 | | * Purpose: Write a log message for insertion of cache entries. |
379 | | * |
380 | | * Return: SUCCEED/FAIL |
381 | | * |
382 | | *------------------------------------------------------------------------- |
383 | | */ |
384 | | static herr_t |
385 | | H5C__trace_write_insert_entry_log_msg(void *udata, haddr_t address, int type_id, unsigned flags, size_t size, |
386 | | herr_t fxn_ret_value) |
387 | 0 | { |
388 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
389 | 0 | herr_t ret_value = SUCCEED; |
390 | |
|
391 | 0 | FUNC_ENTER_PACKAGE |
392 | | |
393 | | /* Sanity checks */ |
394 | 0 | assert(trace_udata); |
395 | 0 | assert(trace_udata->message); |
396 | | |
397 | | /* Create the log message string */ |
398 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_insert_entry 0x%lx %d 0x%x %d %d\n", |
399 | 0 | (unsigned long)address, type_id, flags, (int)size, (int)fxn_ret_value); |
400 | | |
401 | | /* Write the log message to the file */ |
402 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
403 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
404 | | |
405 | 0 | done: |
406 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
407 | 0 | } /* H5C__trace_write_insert_entry_log_msg() */ |
408 | | |
409 | | /*------------------------------------------------------------------------- |
410 | | * Function: H5C__trace_write_mark_entry_dirty_log_msg |
411 | | * |
412 | | * Purpose: Write a log message for marking cache entries as dirty. |
413 | | * |
414 | | * Return: SUCCEED/FAIL |
415 | | * |
416 | | *------------------------------------------------------------------------- |
417 | | */ |
418 | | static herr_t |
419 | | H5C__trace_write_mark_entry_dirty_log_msg(void *udata, const H5C_cache_entry_t *entry, herr_t fxn_ret_value) |
420 | 0 | { |
421 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
422 | 0 | herr_t ret_value = SUCCEED; |
423 | |
|
424 | 0 | FUNC_ENTER_PACKAGE |
425 | | |
426 | | /* Sanity checks */ |
427 | 0 | assert(trace_udata); |
428 | 0 | assert(trace_udata->message); |
429 | 0 | assert(entry); |
430 | | |
431 | | /* Create the log message string */ |
432 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_mark_entry_dirty 0x%lx %d\n", |
433 | 0 | (unsigned long)(entry->addr), (int)fxn_ret_value); |
434 | | |
435 | | /* Write the log message to the file */ |
436 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
437 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
438 | | |
439 | 0 | done: |
440 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
441 | 0 | } /* H5C__trace_write_mark_entry_dirty_log_msg() */ |
442 | | |
443 | | /*------------------------------------------------------------------------- |
444 | | * Function: H5C__trace_write_mark_entry_clean_log_msg |
445 | | * |
446 | | * Purpose: Write a log message for marking cache entries as clean. |
447 | | * |
448 | | * Return: SUCCEED/FAIL |
449 | | * |
450 | | *------------------------------------------------------------------------- |
451 | | */ |
452 | | static herr_t |
453 | | H5C__trace_write_mark_entry_clean_log_msg(void *udata, const H5C_cache_entry_t *entry, herr_t fxn_ret_value) |
454 | 0 | { |
455 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
456 | 0 | herr_t ret_value = SUCCEED; /* Return value */ |
457 | |
|
458 | 0 | FUNC_ENTER_PACKAGE |
459 | | |
460 | | /* Sanity checks */ |
461 | 0 | assert(trace_udata); |
462 | 0 | assert(trace_udata->message); |
463 | 0 | assert(entry); |
464 | | |
465 | | /* Create the log message string */ |
466 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_mark_entry_clean 0x%lx %d\n", |
467 | 0 | (unsigned long)(entry->addr), (int)fxn_ret_value); |
468 | | |
469 | | /* Write the log message to the file */ |
470 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
471 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
472 | | |
473 | 0 | done: |
474 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
475 | 0 | } /* H5C__trace_write_mark_entry_clean_log_msg() */ |
476 | | |
477 | | /*------------------------------------------------------------------------- |
478 | | * Function: H5C__trace_write_mark_unserialized_entry_log_msg |
479 | | * |
480 | | * Purpose: Write a log message for marking cache entries as unserialized. |
481 | | * |
482 | | * Return: SUCCEED/FAIL |
483 | | * |
484 | | *------------------------------------------------------------------------- |
485 | | */ |
486 | | static herr_t |
487 | | H5C__trace_write_mark_unserialized_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, |
488 | | herr_t fxn_ret_value) |
489 | 0 | { |
490 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
491 | 0 | herr_t ret_value = SUCCEED; |
492 | |
|
493 | 0 | FUNC_ENTER_PACKAGE |
494 | | |
495 | | /* Sanity checks */ |
496 | 0 | assert(trace_udata); |
497 | 0 | assert(trace_udata->message); |
498 | 0 | assert(entry); |
499 | | |
500 | | /* Create the log message string */ |
501 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_mark_entry_unserialized 0x%lx %d\n", |
502 | 0 | (unsigned long)(entry->addr), (int)fxn_ret_value); |
503 | | |
504 | | /* Write the log message to the file */ |
505 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
506 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
507 | | |
508 | 0 | done: |
509 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
510 | 0 | } /* H5C__trace_write_mark_unserialized_entry_log_msg() */ |
511 | | |
512 | | /*------------------------------------------------------------------------- |
513 | | * Function: H5C__trace_write_mark_serialized_entry_log_msg |
514 | | * |
515 | | * Purpose: Write a log message for marking cache entries as serialize. |
516 | | * |
517 | | * Return: SUCCEED/FAIL |
518 | | * |
519 | | *------------------------------------------------------------------------- |
520 | | */ |
521 | | static herr_t |
522 | | H5C__trace_write_mark_serialized_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, |
523 | | herr_t fxn_ret_value) |
524 | 0 | { |
525 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
526 | 0 | herr_t ret_value = SUCCEED; /* Return value */ |
527 | |
|
528 | 0 | FUNC_ENTER_PACKAGE |
529 | | |
530 | | /* Sanity checks */ |
531 | 0 | assert(trace_udata); |
532 | 0 | assert(trace_udata->message); |
533 | 0 | assert(entry); |
534 | | |
535 | | /* Create the log message string */ |
536 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_mark_entry_serialized 0x%lx %d\n", |
537 | 0 | (unsigned long)(entry->addr), (int)fxn_ret_value); |
538 | | |
539 | | /* Write the log message to the file */ |
540 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
541 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
542 | | |
543 | 0 | done: |
544 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
545 | 0 | } /* H5C__trace_write_mark_serialized_entry_log_msg() */ |
546 | | |
547 | | /*------------------------------------------------------------------------- |
548 | | * Function: H5C__trace_write_move_entry_log_msg |
549 | | * |
550 | | * Purpose: Write a log message for moving a cache entry. |
551 | | * |
552 | | * Return: SUCCEED/FAIL |
553 | | * |
554 | | *------------------------------------------------------------------------- |
555 | | */ |
556 | | static herr_t |
557 | | H5C__trace_write_move_entry_log_msg(void *udata, haddr_t old_addr, haddr_t new_addr, int type_id, |
558 | | herr_t fxn_ret_value) |
559 | 0 | { |
560 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
561 | 0 | herr_t ret_value = SUCCEED; |
562 | |
|
563 | 0 | FUNC_ENTER_PACKAGE |
564 | | |
565 | | /* Sanity checks */ |
566 | 0 | assert(trace_udata); |
567 | 0 | assert(trace_udata->message); |
568 | | |
569 | | /* Create the log message string */ |
570 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_move_entry 0x%lx 0x%lx %d %d\n", |
571 | 0 | (unsigned long)old_addr, (unsigned long)new_addr, type_id, (int)fxn_ret_value); |
572 | | |
573 | | /* Write the log message to the file */ |
574 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
575 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
576 | | |
577 | 0 | done: |
578 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
579 | 0 | } /* H5C__trace_write_move_entry_log_msg() */ |
580 | | |
581 | | /*------------------------------------------------------------------------- |
582 | | * Function: H5C__trace_write_pin_entry_log_msg |
583 | | * |
584 | | * Purpose: Write a log message for pinning a cache entry. |
585 | | * |
586 | | * Return: SUCCEED/FAIL |
587 | | * |
588 | | *------------------------------------------------------------------------- |
589 | | */ |
590 | | static herr_t |
591 | | H5C__trace_write_pin_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, herr_t fxn_ret_value) |
592 | 0 | { |
593 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
594 | 0 | herr_t ret_value = SUCCEED; |
595 | |
|
596 | 0 | FUNC_ENTER_PACKAGE |
597 | | |
598 | | /* Sanity checks */ |
599 | 0 | assert(trace_udata); |
600 | 0 | assert(trace_udata->message); |
601 | 0 | assert(entry); |
602 | | |
603 | | /* Create the log message string */ |
604 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_pin_protected_entry 0x%lx %d\n", |
605 | 0 | (unsigned long)(entry->addr), (int)fxn_ret_value); |
606 | | |
607 | | /* Write the log message to the file */ |
608 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
609 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
610 | | |
611 | 0 | done: |
612 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
613 | 0 | } /* H5C__trace_write_pin_entry_log_msg() */ |
614 | | |
615 | | /*------------------------------------------------------------------------- |
616 | | * Function: H5C__trace_write_create_fd_log_msg |
617 | | * |
618 | | * Purpose: Write a log message for creating a flush dependency between |
619 | | * two cache entries. |
620 | | * |
621 | | * Return: SUCCEED/FAIL |
622 | | * |
623 | | *------------------------------------------------------------------------- |
624 | | */ |
625 | | static herr_t |
626 | | H5C__trace_write_create_fd_log_msg(void *udata, const H5C_cache_entry_t *parent, |
627 | | const H5C_cache_entry_t *child, herr_t fxn_ret_value) |
628 | 0 | { |
629 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
630 | 0 | herr_t ret_value = SUCCEED; |
631 | |
|
632 | 0 | FUNC_ENTER_PACKAGE |
633 | | |
634 | | /* Sanity checks */ |
635 | 0 | assert(trace_udata); |
636 | 0 | assert(trace_udata->message); |
637 | 0 | assert(parent); |
638 | 0 | assert(child); |
639 | | |
640 | | /* Create the log message string */ |
641 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, |
642 | 0 | "H5AC_create_flush_dependency 0x%lx 0x%lx %d\n", (unsigned long)(parent->addr), |
643 | 0 | (unsigned long)(child->addr), (int)fxn_ret_value); |
644 | | |
645 | | /* Write the log message to the file */ |
646 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
647 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
648 | | |
649 | 0 | done: |
650 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
651 | 0 | } /* H5C__trace_write_create_fd_log_msg() */ |
652 | | |
653 | | /*------------------------------------------------------------------------- |
654 | | * Function: H5C__trace_write_protect_entry_log_msg |
655 | | * |
656 | | * Purpose: Write a log message for protecting a cache entry. |
657 | | * |
658 | | * Return: SUCCEED/FAIL |
659 | | * |
660 | | *------------------------------------------------------------------------- |
661 | | */ |
662 | | static herr_t |
663 | | H5C__trace_write_protect_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, int type_id, |
664 | | unsigned flags, herr_t fxn_ret_value) |
665 | 0 | { |
666 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
667 | 0 | herr_t ret_value = SUCCEED; |
668 | |
|
669 | 0 | FUNC_ENTER_PACKAGE |
670 | | |
671 | | /* Sanity checks */ |
672 | 0 | assert(trace_udata); |
673 | 0 | assert(trace_udata->message); |
674 | 0 | assert(entry); |
675 | | |
676 | | /* Create the log message string */ |
677 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_protect 0x%lx %d 0x%x %d %d\n", |
678 | 0 | (unsigned long)(entry->addr), type_id, flags, (int)(entry->size), (int)fxn_ret_value); |
679 | | |
680 | | /* Write the log message to the file */ |
681 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
682 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
683 | | |
684 | 0 | done: |
685 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
686 | 0 | } /* H5C__trace_write_protect_entry_log_msg() */ |
687 | | |
688 | | /*------------------------------------------------------------------------- |
689 | | * Function: H5C__trace_write_resize_entry_log_msg |
690 | | * |
691 | | * Purpose: Write a log message for resizing a cache entry. |
692 | | * |
693 | | * Return: SUCCEED/FAIL |
694 | | * |
695 | | *------------------------------------------------------------------------- |
696 | | */ |
697 | | static herr_t |
698 | | H5C__trace_write_resize_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, size_t new_size, |
699 | | herr_t fxn_ret_value) |
700 | 0 | { |
701 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
702 | 0 | herr_t ret_value = SUCCEED; |
703 | |
|
704 | 0 | FUNC_ENTER_PACKAGE |
705 | | |
706 | | /* Sanity checks */ |
707 | 0 | assert(trace_udata); |
708 | 0 | assert(trace_udata->message); |
709 | 0 | assert(entry); |
710 | | |
711 | | /* Create the log message string */ |
712 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_resize_entry 0x%lx %d %d\n", |
713 | 0 | (unsigned long)(entry->addr), (int)new_size, (int)fxn_ret_value); |
714 | | |
715 | | /* Write the log message to the file */ |
716 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
717 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
718 | | |
719 | 0 | done: |
720 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
721 | 0 | } /* H5C__trace_write_resize_entry_log_msg() */ |
722 | | |
723 | | /*------------------------------------------------------------------------- |
724 | | * Function: H5C__trace_write_unpin_entry_log_msg |
725 | | * |
726 | | * Purpose: Write a log message for unpinning a cache entry. |
727 | | * |
728 | | * Return: SUCCEED/FAIL |
729 | | * |
730 | | *------------------------------------------------------------------------- |
731 | | */ |
732 | | static herr_t |
733 | | H5C__trace_write_unpin_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, herr_t fxn_ret_value) |
734 | 0 | { |
735 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
736 | 0 | herr_t ret_value = SUCCEED; |
737 | |
|
738 | 0 | FUNC_ENTER_PACKAGE |
739 | | |
740 | | /* Sanity checks */ |
741 | 0 | assert(trace_udata); |
742 | 0 | assert(trace_udata->message); |
743 | 0 | assert(entry); |
744 | | |
745 | | /* Create the log message string */ |
746 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_unpin_entry 0x%lx %d\n", |
747 | 0 | (unsigned long)(entry->addr), (int)fxn_ret_value); |
748 | | |
749 | | /* Write the log message to the file */ |
750 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
751 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
752 | | |
753 | 0 | done: |
754 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
755 | 0 | } /* H5C__trace_write_unpin_entry_log_msg() */ |
756 | | |
757 | | /*------------------------------------------------------------------------- |
758 | | * Function: H5C__trace_write_destroy_fd_log_msg |
759 | | * |
760 | | * Purpose: Write a log message for destroying a flush dependency |
761 | | * between two cache entries. |
762 | | * |
763 | | * Return: SUCCEED/FAIL |
764 | | * |
765 | | *------------------------------------------------------------------------- |
766 | | */ |
767 | | static herr_t |
768 | | H5C__trace_write_destroy_fd_log_msg(void *udata, const H5C_cache_entry_t *parent, |
769 | | const H5C_cache_entry_t *child, herr_t fxn_ret_value) |
770 | 0 | { |
771 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
772 | 0 | herr_t ret_value = SUCCEED; |
773 | |
|
774 | 0 | FUNC_ENTER_PACKAGE |
775 | | |
776 | | /* Sanity checks */ |
777 | 0 | assert(trace_udata); |
778 | 0 | assert(trace_udata->message); |
779 | 0 | assert(parent); |
780 | 0 | assert(child); |
781 | | |
782 | | /* Create the log message string */ |
783 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, |
784 | 0 | "H5AC_destroy_flush_dependency 0x%lx 0x%lx %d\n", (unsigned long)(parent->addr), |
785 | 0 | (unsigned long)(child->addr), (int)fxn_ret_value); |
786 | | |
787 | | /* Write the log message to the file */ |
788 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
789 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
790 | | |
791 | 0 | done: |
792 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
793 | 0 | } /* H5C__trace_write_destroy_fd_log_msg() */ |
794 | | |
795 | | /*------------------------------------------------------------------------- |
796 | | * Function: H5C__trace_write_unprotect_entry_log_msg |
797 | | * |
798 | | * Purpose: Write a log message for unprotecting a cache entry. |
799 | | * |
800 | | * Return: SUCCEED/FAIL |
801 | | * |
802 | | *------------------------------------------------------------------------- |
803 | | */ |
804 | | static herr_t |
805 | | H5C__trace_write_unprotect_entry_log_msg(void *udata, haddr_t address, int type_id, unsigned flags, |
806 | | herr_t fxn_ret_value) |
807 | 0 | { |
808 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
809 | 0 | herr_t ret_value = SUCCEED; |
810 | |
|
811 | 0 | FUNC_ENTER_PACKAGE |
812 | | |
813 | | /* Sanity checks */ |
814 | 0 | assert(trace_udata); |
815 | 0 | assert(trace_udata->message); |
816 | | |
817 | | /* Create the log message string */ |
818 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_unprotect 0x%lx %d 0x%x %d\n", |
819 | 0 | (unsigned long)(address), type_id, flags, (int)fxn_ret_value); |
820 | | |
821 | | /* Write the log message to the file */ |
822 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
823 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
824 | | |
825 | 0 | done: |
826 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
827 | 0 | } /* H5C__trace_write_unprotect_entry_log_msg() */ |
828 | | |
829 | | /*------------------------------------------------------------------------- |
830 | | * Function: H5C__trace_write_set_cache_config_log_msg |
831 | | * |
832 | | * Purpose: Write a log message for setting the cache configuration. |
833 | | * |
834 | | * Return: SUCCEED/FAIL |
835 | | * |
836 | | *------------------------------------------------------------------------- |
837 | | */ |
838 | | static herr_t |
839 | | H5C__trace_write_set_cache_config_log_msg(void *udata, const H5AC_cache_config_t *config, |
840 | | herr_t fxn_ret_value) |
841 | 0 | { |
842 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
843 | 0 | herr_t ret_value = SUCCEED; |
844 | |
|
845 | 0 | FUNC_ENTER_PACKAGE |
846 | | |
847 | | /* Sanity checks */ |
848 | 0 | assert(trace_udata); |
849 | 0 | assert(trace_udata->message); |
850 | 0 | assert(config); |
851 | | |
852 | | /* Create the log message string */ |
853 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, |
854 | 0 | "H5AC_set_cache_auto_resize_config %d %d %d %d \"%s\" %d %d %d %f %d %d %ld %d %f %f %d %f %f " |
855 | 0 | "%d %d %d %f %f %d %d %d %d %f %zu %d %d\n", |
856 | 0 | config->version, (int)(config->rpt_fcn_enabled), (int)(config->open_trace_file), |
857 | 0 | (int)(config->close_trace_file), config->trace_file_name, (int)(config->evictions_enabled), |
858 | 0 | (int)(config->set_initial_size), (int)(config->initial_size), config->min_clean_fraction, |
859 | 0 | (int)(config->max_size), (int)(config->min_size), config->epoch_length, (int)(config->incr_mode), |
860 | 0 | config->lower_hr_threshold, config->increment, (int)(config->flash_incr_mode), |
861 | 0 | config->flash_multiple, config->flash_threshold, (int)(config->apply_max_increment), |
862 | 0 | (int)(config->max_increment), (int)(config->decr_mode), config->upper_hr_threshold, |
863 | 0 | config->decrement, (int)(config->apply_max_decrement), (int)(config->max_decrement), |
864 | 0 | config->epochs_before_eviction, (int)(config->apply_empty_reserve), config->empty_reserve, |
865 | 0 | config->dirty_bytes_threshold, config->metadata_write_strategy, (int)fxn_ret_value); |
866 | | |
867 | | /* Write the log message to the file */ |
868 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
869 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
870 | | |
871 | 0 | done: |
872 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
873 | 0 | } /* H5C__trace_write_set_cache_config_log_msg() */ |
874 | | |
875 | | /*------------------------------------------------------------------------- |
876 | | * Function: H5C__trace_write_remove_entry_log_msg |
877 | | * |
878 | | * Purpose: Write a log message for removing a cache entry. |
879 | | * |
880 | | * Return: SUCCEED/FAIL |
881 | | * |
882 | | *------------------------------------------------------------------------- |
883 | | */ |
884 | | static herr_t |
885 | | H5C__trace_write_remove_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, herr_t fxn_ret_value) |
886 | 0 | { |
887 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
888 | 0 | herr_t ret_value = SUCCEED; |
889 | |
|
890 | 0 | FUNC_ENTER_PACKAGE |
891 | | |
892 | | /* Sanity checks */ |
893 | 0 | assert(trace_udata); |
894 | 0 | assert(trace_udata->message); |
895 | 0 | assert(entry); |
896 | | |
897 | | /* Create the log message string */ |
898 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_remove_entry 0x%lx %d\n", |
899 | 0 | (unsigned long)(entry->addr), (int)fxn_ret_value); |
900 | | |
901 | | /* Write the log message to the file */ |
902 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
903 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
904 | | |
905 | 0 | done: |
906 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
907 | 0 | } /* H5C__trace_write_remove_entry_log_msg() */ |