Skip to content

Commit 84c5bef

Browse files
committed
restore: pipeline bstream integrity hashing
Adds a new 'snapwh' tile dedicated to computing database block integrity hashes to the snapshot loading pipeline.
1 parent 5fbc37d commit 84c5bef

File tree

20 files changed

+478
-32
lines changed

20 files changed

+478
-32
lines changed

book/api/metrics-generated.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1116,3 +1116,13 @@
11161116
| <span class="metrics-name">benchs_&#8203;transactions_&#8203;sent</span> | counter | Number of benchmark packets sent |
11171117

11181118
</div>
1119+
1120+
## Snapwh Tile
1121+
1122+
<div class="metrics">
1123+
1124+
| Metric | Type | Description |
1125+
|--------|------|-------------|
1126+
| <span class="metrics-name">snapwh_&#8203;state</span> | gauge | State of the tile. 0=IDLE, 1=PROCESSING, 4=SHUTDOWN |
1127+
1128+
</div>

src/app/firedancer-dev/commands/snapshot_load.c

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,14 @@ snapshot_load_topo( config_t * config ) {
7676

7777
/* "snapwr": Snapshot writer tile */
7878
int vinyl_enabled = config->firedancer.vinyl.enabled;
79+
fd_topo_tile_t * snapwr_tile = NULL;
7980
if( vinyl_enabled ) {
81+
fd_topob_wksp( topo, "snapwh" );
82+
fd_topo_tile_t * snapwh_tile = fd_topob_tile( topo, "snapwh", "snapwh", "metric_in", ULONG_MAX, 0, 0 );
83+
snapwh_tile->allow_shutdown = 1;
84+
8085
fd_topob_wksp( topo, "snapwr" );
81-
fd_topo_tile_t * snapwr_tile = fd_topob_tile( topo, "snapwr", "snapwr", "metric_in", ULONG_MAX, 0, 0 );
86+
snapwr_tile = fd_topob_tile( topo, "snapwr", "snapwr", "metric_in", ULONG_MAX, 0, 0 );
8287
snapwr_tile->allow_shutdown = 1;
8388
}
8489

@@ -88,7 +93,9 @@ snapshot_load_topo( config_t * config ) {
8893
fd_topob_wksp( topo, "snapin_ct" );
8994
fd_topob_wksp( topo, "snapin_manif" );
9095
fd_topob_wksp( topo, "snapct_repr" );
91-
if( vinyl_enabled ) fd_topob_wksp( topo, "snapin_wr" );
96+
if( vinyl_enabled ) {
97+
fd_topob_wksp( topo, "snapin_wr" );
98+
}
9299

93100
fd_topob_link( topo, "snapct_ld", "snapct_ld", 128UL, sizeof(fd_ssctrl_init_t), 1UL );
94101
fd_topob_link( topo, "snapld_dc", "snapld_dc", 16384UL, USHORT_MAX, 1UL );
@@ -97,7 +104,9 @@ snapshot_load_topo( config_t * config ) {
97104
fd_topob_link( topo, "snapin_manif", "snapin_manif", 2UL, sizeof(fd_snapshot_manifest_t), 1UL )->permit_no_consumers = 1;
98105
fd_topob_link( topo, "snapct_repr", "snapct_repr", 128UL, 0UL, 1UL )->permit_no_consumers = 1;
99106
if( vinyl_enabled ) {
100-
fd_topob_link( topo, "snapin_wr", "snapin_wr", 4UL, 16UL<<20, 1UL );
107+
fd_topo_link_t * snapin_wh = fd_topob_link( topo, "snapin_wh", "snapin_wr", 4UL, 16UL<<20, 1UL );
108+
fd_topob_link( topo, "snapwh_wr", "snapin_wr", 4UL, 0UL, 1UL );
109+
fd_pod_insertf_ulong( topo->props, 8UL, "obj.%lu.app_sz", snapin_wh->dcache_obj_id );
101110
}
102111

103112
fd_topob_tile_in ( topo, "snapct", 0UL, "metric_in", "snapin_ct", 0UL, FD_TOPOB_RELIABLE, FD_TOPOB_POLLED );
@@ -112,8 +121,11 @@ snapshot_load_topo( config_t * config ) {
112121
fd_topob_tile_out( topo, "snapin", 0UL, "snapin_ct", 0UL );
113122
fd_topob_tile_out( topo, "snapin", 0UL, "snapin_manif", 0UL );
114123
if( vinyl_enabled ) {
115-
fd_topob_tile_out( topo, "snapin", 0UL, "snapin_wr", 0UL );
116-
fd_topob_tile_in ( topo, "snapwr", 0UL, "metric_in", "snapin_wr", 0UL, FD_TOPOB_RELIABLE, FD_TOPOB_POLLED );
124+
fd_topob_tile_out( topo, "snapin", 0UL, "snapin_wh", 0UL );
125+
fd_topob_tile_in ( topo, "snapwh", 0UL, "metric_in", "snapin_wh", 0UL, FD_TOPOB_RELIABLE, FD_TOPOB_POLLED );
126+
fd_topob_tile_out( topo, "snapwh", 0UL, "snapwh_wr", 0UL );
127+
fd_topob_tile_in ( topo, "snapwr", 0UL, "metric_in", "snapwh_wr", 0UL, FD_TOPOB_RELIABLE, FD_TOPOB_POLLED );
128+
fd_topob_tile_uses( topo, snapwr_tile, &topo->objs[ topo->links[ fd_topo_find_link( topo, "snapin_wh", 0UL ) ].dcache_obj_id ], FD_SHMEM_JOIN_MODE_READ_ONLY );
117129
}
118130

119131
/* snapin funk / txncache access */
@@ -246,7 +258,9 @@ snapshot_load_cmd_fn( args_t * args,
246258
fd_topo_tile_t * snapld_tile = &topo->tiles[ fd_topo_find_tile( topo, "snapld", 0UL ) ];
247259
fd_topo_tile_t * snapdc_tile = &topo->tiles[ fd_topo_find_tile( topo, "snapdc", 0UL ) ];
248260
fd_topo_tile_t * snapin_tile = &topo->tiles[ fd_topo_find_tile( topo, "snapin", 0UL ) ];
261+
ulong snapwh_idx = fd_topo_find_tile( topo, "snapwh", 0UL );
249262
ulong snapwr_idx = fd_topo_find_tile( topo, "snapwr", 0UL );
263+
fd_topo_tile_t * snapwh_tile = snapwh_idx!=ULONG_MAX ? &topo->tiles[ snapwh_idx ] : NULL;
250264
fd_topo_tile_t * snapwr_tile = snapwr_idx!=ULONG_MAX ? &topo->tiles[ snapwr_idx ] : NULL;
251265
if( args->snapshot_load.snapshot_path[0] ) {
252266
strcpy( snapct_tile->snapct.snapshots_path, args->snapshot_load.snapshot_path );
@@ -263,6 +277,7 @@ snapshot_load_cmd_fn( args_t * args,
263277
ulong volatile * const snapld_metrics = fd_metrics_tile( snapld_tile->metrics );
264278
ulong volatile * const snapdc_metrics = fd_metrics_tile( snapdc_tile->metrics );
265279
ulong volatile * const snapin_metrics = fd_metrics_tile( snapin_tile->metrics );
280+
ulong volatile * const snapwh_metrics = snapwh_tile ? fd_metrics_tile( snapwh_tile->metrics ) : NULL;
266281
ulong volatile * const snapwr_metrics = snapwr_tile ? fd_metrics_tile( snapwr_tile->metrics ) : NULL;
267282

268283
ulong total_off_old = 0UL;
@@ -276,21 +291,23 @@ snapshot_load_cmd_fn( args_t * args,
276291
ulong snapdc_wait_old = 0UL;
277292
ulong snapin_backp_old = 0UL;
278293
ulong snapin_wait_old = 0UL;
294+
ulong snapwh_wait_old = 0UL;
279295
ulong snapwr_wait_old = 0UL;
280296
ulong acc_cnt_old = 0UL;
281297
sleep( 1 );
282298
puts( "" );
283299
puts( "Columns:" );
284300
puts( "- comp: Compressed bandwidth" );
285-
puts( "- raw: Uncompressed bandwidth" );
301+
puts( "- snap: Uncompressed bandwidth" );
302+
if( snapwr_tile ) puts( "- vinyl: Database write speed" );
286303
puts( "- backp: Backpressured by downstream tile" );
287-
puts( "- stall: Waiting on upstream tile" );
304+
puts( "- busy: Tile utilization" );
288305
puts( "- acc: Number of accounts" );
289306
puts( "" );
290307
fputs( "--------------------------------------------", stdout );
291308
if( snapwr_tile ) fputs( "--------------", stdout );
292309
fputs( "[ct],[ld],[dc],[in]--------[ct],[ld],[dc],[in]", stdout );
293-
if( snapwr_tile ) fputs( ",[wr]" , stdout );
310+
if( snapwr_tile ) fputs( ",[wh],[wr]" , stdout );
294311
puts( "--------------" );
295312
long next = start+1000L*1000L*1000L;
296313
for(;;) {
@@ -321,8 +338,11 @@ snapshot_load_cmd_fn( args_t * args,
321338
ulong snapdc_wait = snapdc_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_CAUGHT_UP_POSTFRAG ) ] + snapdc_backp;
322339
ulong snapin_backp = snapin_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_BACKPRESSURE_PREFRAG ) ];
323340
ulong snapin_wait = snapin_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_CAUGHT_UP_POSTFRAG ) ] + snapin_backp;
341+
ulong snapwh_wait = 0UL;
324342
ulong snapwr_wait = 0UL;
325343
if( snapwr_tile ) {
344+
snapwh_wait = snapwh_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_CAUGHT_UP_POSTFRAG ) ] +
345+
snapwh_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_BACKPRESSURE_PREFRAG ) ];
326346
snapwr_wait = snapwr_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_CAUGHT_UP_POSTFRAG ) ] +
327347
snapwr_metrics[ MIDX( COUNTER, TILE, REGIME_DURATION_NANOS_BACKPRESSURE_PREFRAG ) ];
328348
}
@@ -348,7 +368,8 @@ snapshot_load_cmd_fn( args_t * args,
348368
100-( ( (double)( snapdc_wait-snapdc_wait_old )*ns_per_tick )/1e7 ),
349369
100-( ( (double)( snapin_wait-snapin_wait_old )*ns_per_tick )/1e7 ) );
350370
if( snapwr_tile ) {
351-
printf( ",%3.0f%%",
371+
printf( ",%3.0f%%,%3.0f%%",
372+
100-( ( (double)( snapwh_wait-snapwh_wait_old )*ns_per_tick )/1e7 ),
352373
100-( ( (double)( snapwr_wait-snapwr_wait_old )*ns_per_tick )/1e7 ) );
353374
}
354375
printf( ") acc=%4.1f M/s\n",
@@ -365,6 +386,7 @@ snapshot_load_cmd_fn( args_t * args,
365386
snapdc_wait_old = snapdc_wait;
366387
snapin_backp_old = snapin_backp;
367388
snapin_wait_old = snapin_wait;
389+
snapwh_wait_old = snapwh_wait;
368390
snapwr_wait_old = snapwr_wait;
369391
acc_cnt_old = acc_cnt;
370392

src/app/firedancer-dev/main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ extern fd_topo_run_tile_t fd_tile_snapct;
111111
extern fd_topo_run_tile_t fd_tile_snapld;
112112
extern fd_topo_run_tile_t fd_tile_snapdc;
113113
extern fd_topo_run_tile_t fd_tile_snapin;
114+
extern fd_topo_run_tile_t fd_tile_snapwh;
114115
extern fd_topo_run_tile_t fd_tile_snapwr;
115116

116117
fd_topo_run_tile_t * TILES[] = {
@@ -158,6 +159,7 @@ fd_topo_run_tile_t * TILES[] = {
158159
&fd_tile_snapld,
159160
&fd_tile_snapdc,
160161
&fd_tile_snapin,
162+
&fd_tile_snapwh,
161163
&fd_tile_snapwr,
162164
&fd_tile_genesi,
163165
&fd_tile_ipecho,

src/app/firedancer/main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ extern fd_topo_run_tile_t fd_tile_snapct;
9090
extern fd_topo_run_tile_t fd_tile_snapld;
9191
extern fd_topo_run_tile_t fd_tile_snapdc;
9292
extern fd_topo_run_tile_t fd_tile_snapin;
93+
extern fd_topo_run_tile_t fd_tile_snapwh;
9394
extern fd_topo_run_tile_t fd_tile_snapwr;
9495

9596
fd_topo_run_tile_t * TILES[] = {
@@ -122,6 +123,7 @@ fd_topo_run_tile_t * TILES[] = {
122123
&fd_tile_snapld,
123124
&fd_tile_snapdc,
124125
&fd_tile_snapin,
126+
&fd_tile_snapwh,
125127
&fd_tile_snapwr,
126128
&fd_tile_genesi,
127129
&fd_tile_ipecho,

src/app/firedancer/topology.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ fd_topo_initialize( config_t * config ) {
363363
fd_topob_wksp( topo, "snapdc" );
364364
fd_topob_wksp( topo, "snapin" );
365365
if( vinyl_enabled ) {
366+
fd_topob_wksp( topo, "snapwh" );
366367
fd_topob_wksp( topo, "snapwr" );
367368
}
368369

@@ -404,7 +405,10 @@ fd_topo_initialize( config_t * config ) {
404405
/**/ fd_topob_link( topo, "snapct_gui", "snapct_gui", 128UL, sizeof(fd_snapct_update_t), 1UL );
405406
}
406407
if( vinyl_enabled ) {
407-
/**/ fd_topob_link( topo, "snapin_wr", "snapin_wr", 4UL, 16UL<<20, 1UL );
408+
fd_topo_link_t * snapin_wh =
409+
/**/ fd_topob_link( topo, "snapin_wh", "snapin_wr", 4UL, 16UL<<20, 1UL );
410+
/**/ fd_topob_link( topo, "snapwh_wr", "snapin_wr", 4UL, 0UL, 1UL );
411+
fd_pod_insertf_ulong( topo->props, 8UL, "obj.%lu.app_sz", snapin_wh->dcache_obj_id );
408412
}
409413
}
410414

@@ -491,6 +495,7 @@ fd_topo_initialize( config_t * config ) {
491495
/**/ fd_topob_tile( topo, "snapld", "snapld", "metric_in", tile_to_cpu[ topo->tile_cnt ], 0, 0 )->allow_shutdown = 1;
492496
/**/ fd_topob_tile( topo, "snapdc", "snapdc", "metric_in", tile_to_cpu[ topo->tile_cnt ], 0, 0 )->allow_shutdown = 1;
493497
/**/ fd_topob_tile( topo, "snapin", "snapin", "metric_in", tile_to_cpu[ topo->tile_cnt ], 0, 0 )->allow_shutdown = 1;
498+
if(vinyl_enabled) fd_topob_tile( topo, "snapwh", "snapwh", "metric_in", tile_to_cpu[ topo->tile_cnt ], 0, 0 )->allow_shutdown = 1;
494499
if(vinyl_enabled) fd_topob_tile( topo, "snapwr", "snapwr", "metric_in", tile_to_cpu[ topo->tile_cnt ], 0, 0 )->allow_shutdown = 1;
495500
}
496501

@@ -564,8 +569,11 @@ fd_topo_initialize( config_t * config ) {
564569
/**/ fd_topob_tile_out( topo, "snapct", 0UL, "snapct_gui", 0UL );
565570
}
566571
if( vinyl_enabled ) {
567-
/**/ fd_topob_tile_out( topo, "snapin", 0UL, "snapin_wr", 0UL );
568-
/**/ fd_topob_tile_in ( topo, "snapwr", 0UL, "metric_in", "snapin_wr", 0UL, FD_TOPOB_RELIABLE, FD_TOPOB_POLLED );
572+
/**/ fd_topob_tile_out( topo, "snapin", 0UL, "snapin_wh", 0UL );
573+
/**/ fd_topob_tile_in ( topo, "snapwh", 0UL, "metric_in", "snapin_wh", 0UL, FD_TOPOB_RELIABLE, FD_TOPOB_POLLED );
574+
/**/ fd_topob_tile_out( topo, "snapwh", 0UL, "snapwh_wr", 0UL );
575+
/**/ fd_topob_tile_in ( topo, "snapwr", 0UL, "metric_in", "snapwh_wr", 0UL, FD_TOPOB_RELIABLE, FD_TOPOB_POLLED );
576+
fd_topob_tile_uses( topo, &topo->tiles[ fd_topo_find_tile( topo, "snapwr", 0UL ) ], &topo->objs[ topo->links[ fd_topo_find_link( topo, "snapin_wh", 0UL ) ].dcache_obj_id ], FD_SHMEM_JOIN_MODE_READ_ONLY );
569577
}
570578

571579
/**/ fd_topob_tile_in ( topo, "snapld", 0UL, "metric_in", "snapct_ld", 0UL, FD_TOPOB_RELIABLE, FD_TOPOB_POLLED );
@@ -1043,15 +1051,21 @@ fd_topo_configure_tile( fd_topo_tile_t * tile,
10431051
tile->snapin.vinyl_meta_map_obj_id = fd_pod_query_ulong( config->topo.props, "vinyl.meta_map", ULONG_MAX );
10441052
tile->snapin.vinyl_meta_pool_obj_id = fd_pod_query_ulong( config->topo.props, "vinyl.meta_pool", ULONG_MAX );
10451053

1046-
ulong in_wr_link_id = fd_topo_find_link( &config->topo, "snapin_wr", 0UL );
1054+
ulong in_wr_link_id = fd_topo_find_link( &config->topo, "snapin_wh", 0UL );
10471055
FD_TEST( in_wr_link_id!=ULONG_MAX );
10481056
fd_topo_link_t * in_wr_link = &config->topo.links[ in_wr_link_id ];
10491057
tile->snapin.snapwr_depth = in_wr_link->depth;
10501058
}
10511059

1060+
} else if( FD_UNLIKELY( !strcmp( tile->name, "snapwh" ) ) ) {
1061+
10521062
} else if( FD_UNLIKELY( !strcmp( tile->name, "snapwr" ) ) ) {
10531063

10541064
strcpy( tile->snapwr.vinyl_path, config->paths.accounts );
1065+
ulong in_wr_link_id = fd_topo_find_link( &config->topo, "snapin_wh", 0UL );
1066+
FD_TEST( in_wr_link_id!=ULONG_MAX );
1067+
fd_topo_link_t * in_wr_link = &config->topo.links[ in_wr_link_id ];
1068+
tile->snapwr.dcache_obj_id = in_wr_link->dcache_obj_id;
10551069

10561070
} else if( FD_UNLIKELY( !strcmp( tile->name, "repair" ) ) ) {
10571071
tile->repair.max_pending_shred_sets = config->tiles.shred.max_pending_shred_sets;

src/disco/metrics/generate/types.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class Tile(Enum):
3939
EXEC = 33
4040
SNAPWR = 34
4141
BENCHS = 35
42+
SNAPWH = 36
4243

4344
class MetricType(Enum):
4445
COUNTER = 0

src/disco/metrics/generated/fd_metrics_all.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ const char * FD_METRICS_TILE_KIND_NAMES[FD_METRICS_TILE_KIND_CNT] = {
6868
"exec",
6969
"snapwr",
7070
"benchs",
71+
"snapwh",
7172
};
7273

7374
const ulong FD_METRICS_TILE_KIND_SIZES[FD_METRICS_TILE_KIND_CNT] = {
@@ -103,6 +104,7 @@ const ulong FD_METRICS_TILE_KIND_SIZES[FD_METRICS_TILE_KIND_CNT] = {
103104
FD_METRICS_EXEC_TOTAL,
104105
FD_METRICS_SNAPWR_TOTAL,
105106
FD_METRICS_BENCHS_TOTAL,
107+
FD_METRICS_SNAPWH_TOTAL,
106108
};
107109
const fd_metrics_meta_t * FD_METRICS_TILE_KIND_METRICS[FD_METRICS_TILE_KIND_CNT] = {
108110
FD_METRICS_NET,
@@ -137,4 +139,5 @@ const fd_metrics_meta_t * FD_METRICS_TILE_KIND_METRICS[FD_METRICS_TILE_KIND_CNT]
137139
FD_METRICS_EXEC,
138140
FD_METRICS_SNAPWR,
139141
FD_METRICS_BENCHS,
142+
FD_METRICS_SNAPWH,
140143
};

src/disco/metrics/generated/fd_metrics_all.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "fd_metrics_snapdc.h"
3333
#include "fd_metrics_snapin.h"
3434
#include "fd_metrics_snapwr.h"
35+
#include "fd_metrics_snapwh.h"
3536
#include "fd_metrics_metric.h"
3637
#include "fd_metrics_ipecho.h"
3738
#include "fd_metrics_backt.h"
@@ -173,7 +174,7 @@ extern const fd_metrics_meta_t FD_METRICS_ALL_LINK_OUT[FD_METRICS_ALL_LINK_OUT_T
173174

174175
#define FD_METRICS_TOTAL_SZ (8UL*254UL)
175176

176-
#define FD_METRICS_TILE_KIND_CNT 32
177+
#define FD_METRICS_TILE_KIND_CNT 33
177178
extern const char * FD_METRICS_TILE_KIND_NAMES[FD_METRICS_TILE_KIND_CNT];
178179
extern const ulong FD_METRICS_TILE_KIND_SIZES[FD_METRICS_TILE_KIND_CNT];
179180
extern const fd_metrics_meta_t * FD_METRICS_TILE_KIND_METRICS[FD_METRICS_TILE_KIND_CNT];
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/* THIS FILE IS GENERATED BY gen_metrics.py. DO NOT HAND EDIT. */
2+
#include "fd_metrics_snapwh.h"
3+
4+
const fd_metrics_meta_t FD_METRICS_SNAPWH[FD_METRICS_SNAPWH_TOTAL] = {
5+
DECLARE_METRIC( SNAPWH_STATE, GAUGE ),
6+
};
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#ifndef HEADER_fd_src_disco_metrics_generated_fd_metrics_snapwh_h
2+
#define HEADER_fd_src_disco_metrics_generated_fd_metrics_snapwh_h
3+
4+
/* THIS FILE IS GENERATED BY gen_metrics.py. DO NOT HAND EDIT. */
5+
6+
#include "../fd_metrics_base.h"
7+
#include "fd_metrics_enums.h"
8+
9+
#define FD_METRICS_GAUGE_SNAPWH_STATE_OFF (16UL)
10+
#define FD_METRICS_GAUGE_SNAPWH_STATE_NAME "snapwh_state"
11+
#define FD_METRICS_GAUGE_SNAPWH_STATE_TYPE (FD_METRICS_TYPE_GAUGE)
12+
#define FD_METRICS_GAUGE_SNAPWH_STATE_DESC "State of the tile. 0=IDLE, 1=PROCESSING, 4=SHUTDOWN"
13+
#define FD_METRICS_GAUGE_SNAPWH_STATE_CVT (FD_METRICS_CONVERTER_NONE)
14+
15+
#define FD_METRICS_SNAPWH_TOTAL (1UL)
16+
extern const fd_metrics_meta_t FD_METRICS_SNAPWH[FD_METRICS_SNAPWH_TOTAL];
17+
18+
#endif /* HEADER_fd_src_disco_metrics_generated_fd_metrics_snapwh_h */

0 commit comments

Comments
 (0)