Coverage Report

Created: 2025-08-26 06:30

/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() */