Coverage Report

Created: 2026-10-28 07:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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() */