/src/hdf5/src/H5Clog_trace.c
Line | Count | Source |
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 | int log_file_fd = -1; |
203 | 0 | herr_t ret_value = SUCCEED; /* Return value */ |
204 | |
|
205 | 0 | FUNC_ENTER_PACKAGE |
206 | | |
207 | | /* Sanity checks */ |
208 | 0 | assert(log_info); |
209 | 0 | assert(log_location); |
210 | | |
211 | | /* Set up the class struct */ |
212 | 0 | log_info->cls = &H5C_trace_log_class_g; |
213 | | |
214 | | /* Allocate memory for the JSON-specific data */ |
215 | 0 | if (NULL == (log_info->udata = H5MM_calloc(sizeof(H5C_log_trace_udata_t)))) |
216 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "memory allocation failed"); |
217 | 0 | trace_udata = (H5C_log_trace_udata_t *)(log_info->udata); |
218 | | |
219 | | /* Allocate memory for the message buffer */ |
220 | 0 | if (NULL == (trace_udata->message = (char *)H5MM_calloc(H5C_MAX_TRACE_LOG_MSG_SIZE * sizeof(char)))) |
221 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "memory allocation failed"); |
222 | | |
223 | | /* Possibly fix up the log file name. |
224 | | * The extra 39 characters are for adding the rank to the file name |
225 | | * under parallel HDF5. 39 characters allows > 2^127 processes which |
226 | | * should be enough for anybody. |
227 | | * |
228 | | * allocation size = <path length> + dot + <rank # length> + \0 |
229 | | */ |
230 | 0 | n_chars = strlen(log_location) + 1 + 39 + 1; |
231 | 0 | if (NULL == (file_name = (char *)H5MM_calloc(n_chars * sizeof(char)))) |
232 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, |
233 | 0 | "can't allocate memory for mdc log file name manipulation"); |
234 | | |
235 | | /* Add the rank to the log file name when MPI is in use */ |
236 | 0 | if (-1 == mpi_rank) |
237 | 0 | snprintf(file_name, n_chars, "%s", log_location); |
238 | 0 | else |
239 | 0 | snprintf(file_name, n_chars, "%s.%d", log_location, mpi_rank); |
240 | | |
241 | | /* Open log file and set it to be unbuffered */ |
242 | 0 | if ((log_file_fd = HDopen(file_name, O_WRONLY | O_CREAT | O_TRUNC, H5_POSIX_CREATE_MODE_URWGROR)) < 0) |
243 | 0 | HSYS_GOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "can't create mdc log file"); |
244 | 0 | if (NULL == (trace_udata->outfile = HDfdopen(log_file_fd, "w"))) { |
245 | 0 | HDclose(log_file_fd); |
246 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "can't create mdc log file"); |
247 | 0 | } |
248 | 0 | setbuf(trace_udata->outfile, NULL); |
249 | | |
250 | | /* Write the header */ |
251 | 0 | fprintf(trace_udata->outfile, "### HDF5 metadata cache trace file version 1 ###\n"); |
252 | |
|
253 | 0 | done: |
254 | 0 | if (file_name) |
255 | 0 | H5MM_xfree(file_name); |
256 | | |
257 | | /* Free and reset the log info struct on errors */ |
258 | 0 | if (FAIL == ret_value) { |
259 | | /* Free */ |
260 | 0 | if (trace_udata && trace_udata->message) |
261 | 0 | H5MM_xfree(trace_udata->message); |
262 | 0 | if (trace_udata) |
263 | 0 | H5MM_xfree(trace_udata); |
264 | | |
265 | | /* Reset */ |
266 | 0 | log_info->udata = NULL; |
267 | 0 | log_info->cls = NULL; |
268 | 0 | } |
269 | |
|
270 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
271 | 0 | } /* H5C__log_trace_set_up() */ |
272 | | |
273 | | /*------------------------------------------------------------------------- |
274 | | * Function: H5C__trace_tear_down_logging |
275 | | * |
276 | | * Purpose: Tear-down for metadata cache logging. |
277 | | * |
278 | | * Return: SUCCEED/FAIL |
279 | | * |
280 | | *------------------------------------------------------------------------- |
281 | | */ |
282 | | static herr_t |
283 | | H5C__trace_tear_down_logging(H5C_log_info_t *log_info) |
284 | 0 | { |
285 | 0 | H5C_log_trace_udata_t *trace_udata = NULL; |
286 | 0 | herr_t ret_value = SUCCEED; /* Return value */ |
287 | |
|
288 | 0 | FUNC_ENTER_PACKAGE |
289 | | |
290 | | /* Sanity checks */ |
291 | 0 | assert(log_info); |
292 | | |
293 | | /* Alias */ |
294 | 0 | trace_udata = (H5C_log_trace_udata_t *)(log_info->udata); |
295 | | |
296 | | /* Free the message buffer */ |
297 | 0 | H5MM_xfree(trace_udata->message); |
298 | | |
299 | | /* Close log file */ |
300 | 0 | if (EOF == fclose(trace_udata->outfile)) |
301 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "problem closing mdc log file"); |
302 | 0 | trace_udata->outfile = NULL; |
303 | | |
304 | | /* Fre the udata */ |
305 | 0 | H5MM_xfree(trace_udata); |
306 | | |
307 | | /* Reset the log class info and udata */ |
308 | 0 | log_info->cls = NULL; |
309 | 0 | log_info->udata = NULL; |
310 | |
|
311 | 0 | done: |
312 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
313 | 0 | } /* H5C__trace_tear_down_logging() */ |
314 | | |
315 | | /*------------------------------------------------------------------------- |
316 | | * Function: H5C__trace_write_expunge_entry_log_msg |
317 | | * |
318 | | * Purpose: Write a log message for expunge of cache entries. |
319 | | * |
320 | | * Return: SUCCEED/FAIL |
321 | | * |
322 | | *------------------------------------------------------------------------- |
323 | | */ |
324 | | static herr_t |
325 | | H5C__trace_write_expunge_entry_log_msg(void *udata, haddr_t address, int type_id, herr_t fxn_ret_value) |
326 | 0 | { |
327 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
328 | 0 | herr_t ret_value = SUCCEED; |
329 | |
|
330 | 0 | FUNC_ENTER_PACKAGE |
331 | | |
332 | | /* Sanity checks */ |
333 | 0 | assert(trace_udata); |
334 | 0 | assert(trace_udata->message); |
335 | | |
336 | | /* Create the log message string */ |
337 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_expunge_entry 0x%lx %d %d\n", |
338 | 0 | (unsigned long)address, type_id, (int)fxn_ret_value); |
339 | | |
340 | | /* Write the log message to the file */ |
341 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
342 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
343 | | |
344 | 0 | done: |
345 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
346 | 0 | } /* H5C__trace_write_expunge_entry_log_msg() */ |
347 | | |
348 | | /*------------------------------------------------------------------------- |
349 | | * Function: H5C__trace_write_flush_cache_log_msg |
350 | | * |
351 | | * Purpose: Write a log message for cache flushes. |
352 | | * |
353 | | * Return: SUCCEED/FAIL |
354 | | * |
355 | | *------------------------------------------------------------------------- |
356 | | */ |
357 | | static herr_t |
358 | | H5C__trace_write_flush_cache_log_msg(void *udata, herr_t fxn_ret_value) |
359 | 0 | { |
360 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
361 | 0 | herr_t ret_value = SUCCEED; |
362 | |
|
363 | 0 | FUNC_ENTER_PACKAGE |
364 | | |
365 | | /* Sanity checks */ |
366 | 0 | assert(trace_udata); |
367 | 0 | assert(trace_udata->message); |
368 | | |
369 | | /* Create the log message string */ |
370 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_flush %d\n", (int)fxn_ret_value); |
371 | | |
372 | | /* Write the log message to the file */ |
373 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
374 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
375 | | |
376 | 0 | done: |
377 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
378 | 0 | } /* H5C__trace_write_flush_cache_log_msg() */ |
379 | | |
380 | | /*------------------------------------------------------------------------- |
381 | | * Function: H5C__trace_write_insert_entry_log_msg |
382 | | * |
383 | | * Purpose: Write a log message for insertion of cache entries. |
384 | | * |
385 | | * Return: SUCCEED/FAIL |
386 | | * |
387 | | *------------------------------------------------------------------------- |
388 | | */ |
389 | | static herr_t |
390 | | H5C__trace_write_insert_entry_log_msg(void *udata, haddr_t address, int type_id, unsigned flags, size_t size, |
391 | | herr_t fxn_ret_value) |
392 | 0 | { |
393 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
394 | 0 | herr_t ret_value = SUCCEED; |
395 | |
|
396 | 0 | FUNC_ENTER_PACKAGE |
397 | | |
398 | | /* Sanity checks */ |
399 | 0 | assert(trace_udata); |
400 | 0 | assert(trace_udata->message); |
401 | | |
402 | | /* Create the log message string */ |
403 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_insert_entry 0x%lx %d 0x%x %d %d\n", |
404 | 0 | (unsigned long)address, type_id, flags, (int)size, (int)fxn_ret_value); |
405 | | |
406 | | /* Write the log message to the file */ |
407 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
408 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
409 | | |
410 | 0 | done: |
411 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
412 | 0 | } /* H5C__trace_write_insert_entry_log_msg() */ |
413 | | |
414 | | /*------------------------------------------------------------------------- |
415 | | * Function: H5C__trace_write_mark_entry_dirty_log_msg |
416 | | * |
417 | | * Purpose: Write a log message for marking cache entries as dirty. |
418 | | * |
419 | | * Return: SUCCEED/FAIL |
420 | | * |
421 | | *------------------------------------------------------------------------- |
422 | | */ |
423 | | static herr_t |
424 | | H5C__trace_write_mark_entry_dirty_log_msg(void *udata, const H5C_cache_entry_t *entry, herr_t fxn_ret_value) |
425 | 0 | { |
426 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
427 | 0 | herr_t ret_value = SUCCEED; |
428 | |
|
429 | 0 | FUNC_ENTER_PACKAGE |
430 | | |
431 | | /* Sanity checks */ |
432 | 0 | assert(trace_udata); |
433 | 0 | assert(trace_udata->message); |
434 | 0 | assert(entry); |
435 | | |
436 | | /* Create the log message string */ |
437 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_mark_entry_dirty 0x%lx %d\n", |
438 | 0 | (unsigned long)(entry->addr), (int)fxn_ret_value); |
439 | | |
440 | | /* Write the log message to the file */ |
441 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
442 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
443 | | |
444 | 0 | done: |
445 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
446 | 0 | } /* H5C__trace_write_mark_entry_dirty_log_msg() */ |
447 | | |
448 | | /*------------------------------------------------------------------------- |
449 | | * Function: H5C__trace_write_mark_entry_clean_log_msg |
450 | | * |
451 | | * Purpose: Write a log message for marking cache entries as clean. |
452 | | * |
453 | | * Return: SUCCEED/FAIL |
454 | | * |
455 | | *------------------------------------------------------------------------- |
456 | | */ |
457 | | static herr_t |
458 | | H5C__trace_write_mark_entry_clean_log_msg(void *udata, const H5C_cache_entry_t *entry, herr_t fxn_ret_value) |
459 | 0 | { |
460 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
461 | 0 | herr_t ret_value = SUCCEED; /* Return value */ |
462 | |
|
463 | 0 | FUNC_ENTER_PACKAGE |
464 | | |
465 | | /* Sanity checks */ |
466 | 0 | assert(trace_udata); |
467 | 0 | assert(trace_udata->message); |
468 | 0 | assert(entry); |
469 | | |
470 | | /* Create the log message string */ |
471 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_mark_entry_clean 0x%lx %d\n", |
472 | 0 | (unsigned long)(entry->addr), (int)fxn_ret_value); |
473 | | |
474 | | /* Write the log message to the file */ |
475 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
476 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
477 | | |
478 | 0 | done: |
479 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
480 | 0 | } /* H5C__trace_write_mark_entry_clean_log_msg() */ |
481 | | |
482 | | /*------------------------------------------------------------------------- |
483 | | * Function: H5C__trace_write_mark_unserialized_entry_log_msg |
484 | | * |
485 | | * Purpose: Write a log message for marking cache entries as unserialized. |
486 | | * |
487 | | * Return: SUCCEED/FAIL |
488 | | * |
489 | | *------------------------------------------------------------------------- |
490 | | */ |
491 | | static herr_t |
492 | | H5C__trace_write_mark_unserialized_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, |
493 | | herr_t fxn_ret_value) |
494 | 0 | { |
495 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
496 | 0 | herr_t ret_value = SUCCEED; |
497 | |
|
498 | 0 | FUNC_ENTER_PACKAGE |
499 | | |
500 | | /* Sanity checks */ |
501 | 0 | assert(trace_udata); |
502 | 0 | assert(trace_udata->message); |
503 | 0 | assert(entry); |
504 | | |
505 | | /* Create the log message string */ |
506 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_mark_entry_unserialized 0x%lx %d\n", |
507 | 0 | (unsigned long)(entry->addr), (int)fxn_ret_value); |
508 | | |
509 | | /* Write the log message to the file */ |
510 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
511 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
512 | | |
513 | 0 | done: |
514 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
515 | 0 | } /* H5C__trace_write_mark_unserialized_entry_log_msg() */ |
516 | | |
517 | | /*------------------------------------------------------------------------- |
518 | | * Function: H5C__trace_write_mark_serialized_entry_log_msg |
519 | | * |
520 | | * Purpose: Write a log message for marking cache entries as serialize. |
521 | | * |
522 | | * Return: SUCCEED/FAIL |
523 | | * |
524 | | *------------------------------------------------------------------------- |
525 | | */ |
526 | | static herr_t |
527 | | H5C__trace_write_mark_serialized_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, |
528 | | herr_t fxn_ret_value) |
529 | 0 | { |
530 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
531 | 0 | herr_t ret_value = SUCCEED; /* Return value */ |
532 | |
|
533 | 0 | FUNC_ENTER_PACKAGE |
534 | | |
535 | | /* Sanity checks */ |
536 | 0 | assert(trace_udata); |
537 | 0 | assert(trace_udata->message); |
538 | 0 | assert(entry); |
539 | | |
540 | | /* Create the log message string */ |
541 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_mark_entry_serialized 0x%lx %d\n", |
542 | 0 | (unsigned long)(entry->addr), (int)fxn_ret_value); |
543 | | |
544 | | /* Write the log message to the file */ |
545 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
546 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
547 | | |
548 | 0 | done: |
549 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
550 | 0 | } /* H5C__trace_write_mark_serialized_entry_log_msg() */ |
551 | | |
552 | | /*------------------------------------------------------------------------- |
553 | | * Function: H5C__trace_write_move_entry_log_msg |
554 | | * |
555 | | * Purpose: Write a log message for moving a cache entry. |
556 | | * |
557 | | * Return: SUCCEED/FAIL |
558 | | * |
559 | | *------------------------------------------------------------------------- |
560 | | */ |
561 | | static herr_t |
562 | | H5C__trace_write_move_entry_log_msg(void *udata, haddr_t old_addr, haddr_t new_addr, int type_id, |
563 | | herr_t fxn_ret_value) |
564 | 0 | { |
565 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
566 | 0 | herr_t ret_value = SUCCEED; |
567 | |
|
568 | 0 | FUNC_ENTER_PACKAGE |
569 | | |
570 | | /* Sanity checks */ |
571 | 0 | assert(trace_udata); |
572 | 0 | assert(trace_udata->message); |
573 | | |
574 | | /* Create the log message string */ |
575 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_move_entry 0x%lx 0x%lx %d %d\n", |
576 | 0 | (unsigned long)old_addr, (unsigned long)new_addr, type_id, (int)fxn_ret_value); |
577 | | |
578 | | /* Write the log message to the file */ |
579 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
580 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
581 | | |
582 | 0 | done: |
583 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
584 | 0 | } /* H5C__trace_write_move_entry_log_msg() */ |
585 | | |
586 | | /*------------------------------------------------------------------------- |
587 | | * Function: H5C__trace_write_pin_entry_log_msg |
588 | | * |
589 | | * Purpose: Write a log message for pinning a cache entry. |
590 | | * |
591 | | * Return: SUCCEED/FAIL |
592 | | * |
593 | | *------------------------------------------------------------------------- |
594 | | */ |
595 | | static herr_t |
596 | | H5C__trace_write_pin_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, herr_t fxn_ret_value) |
597 | 0 | { |
598 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
599 | 0 | herr_t ret_value = SUCCEED; |
600 | |
|
601 | 0 | FUNC_ENTER_PACKAGE |
602 | | |
603 | | /* Sanity checks */ |
604 | 0 | assert(trace_udata); |
605 | 0 | assert(trace_udata->message); |
606 | 0 | assert(entry); |
607 | | |
608 | | /* Create the log message string */ |
609 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_pin_protected_entry 0x%lx %d\n", |
610 | 0 | (unsigned long)(entry->addr), (int)fxn_ret_value); |
611 | | |
612 | | /* Write the log message to the file */ |
613 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
614 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
615 | | |
616 | 0 | done: |
617 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
618 | 0 | } /* H5C__trace_write_pin_entry_log_msg() */ |
619 | | |
620 | | /*------------------------------------------------------------------------- |
621 | | * Function: H5C__trace_write_create_fd_log_msg |
622 | | * |
623 | | * Purpose: Write a log message for creating a flush dependency between |
624 | | * two cache entries. |
625 | | * |
626 | | * Return: SUCCEED/FAIL |
627 | | * |
628 | | *------------------------------------------------------------------------- |
629 | | */ |
630 | | static herr_t |
631 | | H5C__trace_write_create_fd_log_msg(void *udata, const H5C_cache_entry_t *parent, |
632 | | const H5C_cache_entry_t *child, herr_t fxn_ret_value) |
633 | 0 | { |
634 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
635 | 0 | herr_t ret_value = SUCCEED; |
636 | |
|
637 | 0 | FUNC_ENTER_PACKAGE |
638 | | |
639 | | /* Sanity checks */ |
640 | 0 | assert(trace_udata); |
641 | 0 | assert(trace_udata->message); |
642 | 0 | assert(parent); |
643 | 0 | assert(child); |
644 | | |
645 | | /* Create the log message string */ |
646 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, |
647 | 0 | "H5AC_create_flush_dependency 0x%lx 0x%lx %d\n", (unsigned long)(parent->addr), |
648 | 0 | (unsigned long)(child->addr), (int)fxn_ret_value); |
649 | | |
650 | | /* Write the log message to the file */ |
651 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
652 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
653 | | |
654 | 0 | done: |
655 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
656 | 0 | } /* H5C__trace_write_create_fd_log_msg() */ |
657 | | |
658 | | /*------------------------------------------------------------------------- |
659 | | * Function: H5C__trace_write_protect_entry_log_msg |
660 | | * |
661 | | * Purpose: Write a log message for protecting a cache entry. |
662 | | * |
663 | | * Return: SUCCEED/FAIL |
664 | | * |
665 | | *------------------------------------------------------------------------- |
666 | | */ |
667 | | static herr_t |
668 | | H5C__trace_write_protect_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, int type_id, |
669 | | unsigned flags, herr_t fxn_ret_value) |
670 | 0 | { |
671 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
672 | 0 | herr_t ret_value = SUCCEED; |
673 | |
|
674 | 0 | FUNC_ENTER_PACKAGE |
675 | | |
676 | | /* Sanity checks */ |
677 | 0 | assert(trace_udata); |
678 | 0 | assert(trace_udata->message); |
679 | 0 | assert(entry); |
680 | | |
681 | | /* Create the log message string */ |
682 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_protect 0x%lx %d 0x%x %d %d\n", |
683 | 0 | (unsigned long)(entry->addr), type_id, flags, (int)(entry->size), (int)fxn_ret_value); |
684 | | |
685 | | /* Write the log message to the file */ |
686 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
687 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
688 | | |
689 | 0 | done: |
690 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
691 | 0 | } /* H5C__trace_write_protect_entry_log_msg() */ |
692 | | |
693 | | /*------------------------------------------------------------------------- |
694 | | * Function: H5C__trace_write_resize_entry_log_msg |
695 | | * |
696 | | * Purpose: Write a log message for resizing a cache entry. |
697 | | * |
698 | | * Return: SUCCEED/FAIL |
699 | | * |
700 | | *------------------------------------------------------------------------- |
701 | | */ |
702 | | static herr_t |
703 | | H5C__trace_write_resize_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, size_t new_size, |
704 | | herr_t fxn_ret_value) |
705 | 0 | { |
706 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
707 | 0 | herr_t ret_value = SUCCEED; |
708 | |
|
709 | 0 | FUNC_ENTER_PACKAGE |
710 | | |
711 | | /* Sanity checks */ |
712 | 0 | assert(trace_udata); |
713 | 0 | assert(trace_udata->message); |
714 | 0 | assert(entry); |
715 | | |
716 | | /* Create the log message string */ |
717 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_resize_entry 0x%lx %d %d\n", |
718 | 0 | (unsigned long)(entry->addr), (int)new_size, (int)fxn_ret_value); |
719 | | |
720 | | /* Write the log message to the file */ |
721 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
722 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
723 | | |
724 | 0 | done: |
725 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
726 | 0 | } /* H5C__trace_write_resize_entry_log_msg() */ |
727 | | |
728 | | /*------------------------------------------------------------------------- |
729 | | * Function: H5C__trace_write_unpin_entry_log_msg |
730 | | * |
731 | | * Purpose: Write a log message for unpinning a cache entry. |
732 | | * |
733 | | * Return: SUCCEED/FAIL |
734 | | * |
735 | | *------------------------------------------------------------------------- |
736 | | */ |
737 | | static herr_t |
738 | | H5C__trace_write_unpin_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, herr_t fxn_ret_value) |
739 | 0 | { |
740 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
741 | 0 | herr_t ret_value = SUCCEED; |
742 | |
|
743 | 0 | FUNC_ENTER_PACKAGE |
744 | | |
745 | | /* Sanity checks */ |
746 | 0 | assert(trace_udata); |
747 | 0 | assert(trace_udata->message); |
748 | 0 | assert(entry); |
749 | | |
750 | | /* Create the log message string */ |
751 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_unpin_entry 0x%lx %d\n", |
752 | 0 | (unsigned long)(entry->addr), (int)fxn_ret_value); |
753 | | |
754 | | /* Write the log message to the file */ |
755 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
756 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
757 | | |
758 | 0 | done: |
759 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
760 | 0 | } /* H5C__trace_write_unpin_entry_log_msg() */ |
761 | | |
762 | | /*------------------------------------------------------------------------- |
763 | | * Function: H5C__trace_write_destroy_fd_log_msg |
764 | | * |
765 | | * Purpose: Write a log message for destroying a flush dependency |
766 | | * between two cache entries. |
767 | | * |
768 | | * Return: SUCCEED/FAIL |
769 | | * |
770 | | *------------------------------------------------------------------------- |
771 | | */ |
772 | | static herr_t |
773 | | H5C__trace_write_destroy_fd_log_msg(void *udata, const H5C_cache_entry_t *parent, |
774 | | const H5C_cache_entry_t *child, herr_t fxn_ret_value) |
775 | 0 | { |
776 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
777 | 0 | herr_t ret_value = SUCCEED; |
778 | |
|
779 | 0 | FUNC_ENTER_PACKAGE |
780 | | |
781 | | /* Sanity checks */ |
782 | 0 | assert(trace_udata); |
783 | 0 | assert(trace_udata->message); |
784 | 0 | assert(parent); |
785 | 0 | assert(child); |
786 | | |
787 | | /* Create the log message string */ |
788 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, |
789 | 0 | "H5AC_destroy_flush_dependency 0x%lx 0x%lx %d\n", (unsigned long)(parent->addr), |
790 | 0 | (unsigned long)(child->addr), (int)fxn_ret_value); |
791 | | |
792 | | /* Write the log message to the file */ |
793 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
794 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
795 | | |
796 | 0 | done: |
797 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
798 | 0 | } /* H5C__trace_write_destroy_fd_log_msg() */ |
799 | | |
800 | | /*------------------------------------------------------------------------- |
801 | | * Function: H5C__trace_write_unprotect_entry_log_msg |
802 | | * |
803 | | * Purpose: Write a log message for unprotecting a cache entry. |
804 | | * |
805 | | * Return: SUCCEED/FAIL |
806 | | * |
807 | | *------------------------------------------------------------------------- |
808 | | */ |
809 | | static herr_t |
810 | | H5C__trace_write_unprotect_entry_log_msg(void *udata, haddr_t address, int type_id, unsigned flags, |
811 | | herr_t fxn_ret_value) |
812 | 0 | { |
813 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
814 | 0 | herr_t ret_value = SUCCEED; |
815 | |
|
816 | 0 | FUNC_ENTER_PACKAGE |
817 | | |
818 | | /* Sanity checks */ |
819 | 0 | assert(trace_udata); |
820 | 0 | assert(trace_udata->message); |
821 | | |
822 | | /* Create the log message string */ |
823 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_unprotect 0x%lx %d 0x%x %d\n", |
824 | 0 | (unsigned long)(address), type_id, flags, (int)fxn_ret_value); |
825 | | |
826 | | /* Write the log message to the file */ |
827 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
828 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
829 | | |
830 | 0 | done: |
831 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
832 | 0 | } /* H5C__trace_write_unprotect_entry_log_msg() */ |
833 | | |
834 | | /*------------------------------------------------------------------------- |
835 | | * Function: H5C__trace_write_set_cache_config_log_msg |
836 | | * |
837 | | * Purpose: Write a log message for setting the cache configuration. |
838 | | * |
839 | | * Return: SUCCEED/FAIL |
840 | | * |
841 | | *------------------------------------------------------------------------- |
842 | | */ |
843 | | static herr_t |
844 | | H5C__trace_write_set_cache_config_log_msg(void *udata, const H5AC_cache_config_t *config, |
845 | | herr_t fxn_ret_value) |
846 | 0 | { |
847 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
848 | 0 | herr_t ret_value = SUCCEED; |
849 | |
|
850 | 0 | FUNC_ENTER_PACKAGE |
851 | | |
852 | | /* Sanity checks */ |
853 | 0 | assert(trace_udata); |
854 | 0 | assert(trace_udata->message); |
855 | 0 | assert(config); |
856 | | |
857 | | /* Create the log message string */ |
858 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, |
859 | 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 " |
860 | 0 | "%d %d %d %f %f %d %d %d %d %f %zu %d %d\n", |
861 | 0 | config->version, (int)(config->rpt_fcn_enabled), (int)(config->open_trace_file), |
862 | 0 | (int)(config->close_trace_file), config->trace_file_name, (int)(config->evictions_enabled), |
863 | 0 | (int)(config->set_initial_size), (int)(config->initial_size), config->min_clean_fraction, |
864 | 0 | (int)(config->max_size), (int)(config->min_size), config->epoch_length, (int)(config->incr_mode), |
865 | 0 | config->lower_hr_threshold, config->increment, (int)(config->flash_incr_mode), |
866 | 0 | config->flash_multiple, config->flash_threshold, (int)(config->apply_max_increment), |
867 | 0 | (int)(config->max_increment), (int)(config->decr_mode), config->upper_hr_threshold, |
868 | 0 | config->decrement, (int)(config->apply_max_decrement), (int)(config->max_decrement), |
869 | 0 | config->epochs_before_eviction, (int)(config->apply_empty_reserve), config->empty_reserve, |
870 | 0 | config->dirty_bytes_threshold, config->metadata_write_strategy, (int)fxn_ret_value); |
871 | | |
872 | | /* Write the log message to the file */ |
873 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
874 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
875 | | |
876 | 0 | done: |
877 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
878 | 0 | } /* H5C__trace_write_set_cache_config_log_msg() */ |
879 | | |
880 | | /*------------------------------------------------------------------------- |
881 | | * Function: H5C__trace_write_remove_entry_log_msg |
882 | | * |
883 | | * Purpose: Write a log message for removing a cache entry. |
884 | | * |
885 | | * Return: SUCCEED/FAIL |
886 | | * |
887 | | *------------------------------------------------------------------------- |
888 | | */ |
889 | | static herr_t |
890 | | H5C__trace_write_remove_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, herr_t fxn_ret_value) |
891 | 0 | { |
892 | 0 | H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata); |
893 | 0 | herr_t ret_value = SUCCEED; |
894 | |
|
895 | 0 | FUNC_ENTER_PACKAGE |
896 | | |
897 | | /* Sanity checks */ |
898 | 0 | assert(trace_udata); |
899 | 0 | assert(trace_udata->message); |
900 | 0 | assert(entry); |
901 | | |
902 | | /* Create the log message string */ |
903 | 0 | snprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_remove_entry 0x%lx %d\n", |
904 | 0 | (unsigned long)(entry->addr), (int)fxn_ret_value); |
905 | | |
906 | | /* Write the log message to the file */ |
907 | 0 | if (H5C__trace_write_log_message(trace_udata) < 0) |
908 | 0 | HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message"); |
909 | | |
910 | 0 | done: |
911 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
912 | 0 | } /* H5C__trace_write_remove_entry_log_msg() */ |