summaryrefslogtreecommitdiff
path: root/usr/src/cmd/fs.d/cachefs/common/stats.h
blob: f8823fcd70135a174bb88099402ec25fb314abd8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 1996-2002 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _CACHEFS_LIB_STATS_H
#define	_CACHEFS_LIB_STATS_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <rpc/types.h>
#include <rpc/xdr.h>
#include <sys/fs/cachefs_fs.h>
#include <sys/fs/cachefs_log.h>
#include <kstat.h>
#include <ndbm.h>

#ifndef DEBUG
#define	NDEBUG
#endif /* DEBUG */

#define	STATS_MAGIC	54545

typedef struct stats_cookie {
	int st_magic;

	char *st_progname;

	uint_t st_flags;	/* misc. flags */
	int st_fsid;		/* id # for kstat `cachefs.#.stat' */

	FILE *st_logstream;	/* stream for logfile */
	XDR st_logxdr;
	struct cachefs_log_logfile_header st_loghead;
	char st_asciirec[BUFSIZ];

	DBM *st_dbm;
	char st_dbm_name[MAXPATHLEN];

	int st_ws_init;
	u_offset_t st_ws_current;
	u_offset_t st_ws_high;
	int st_ws_expensive;

	char st_errorstr[BUFSIZ];
	int st_errno;

	kstat_ctl_t *st_kstat_cookie;
} stats_cookie_t;

/*
 * error types for the API (given by stats_errno())
 */

enum stats_error {
	SE_NOERROR,	/* placeholder so no errors == 0 */
	SE_INVAL,	/* invalid use of the API */
	SE_NOMEM,	/* ran out of memory */
	SE_FILE,	/* trouble with file i/o */
	SE_CORRUPT,	/* trouble with a corrupt file */
	SE_KERNEL	/* trouble coming from communication with the kernel */
};

/*
 * flags in cookie->st_flags
 */

#define	ST_VALID	0x0001 /* initialized completely */
#define	ST_BOUND	0x0002 /* bound to a particular filesystem or cache */
#define	ST_ERROR	0x0004 /* an error has occured */
#define	ST_LFOPEN	0x0008 /* logstream is open */
#define	ST_DBMOPEN	0x0010 /* dbm descriptor is open */
#define	ST_WSCOMP	0x0020 /* working set size computed */

/*
 * flags for logfile-to-workingset
 */

#define	GRI_ADD		0x01	/* we may have added to the alloc map	*/
#define	GRI_TRUNC	0x02	/* we may have truncated the alloc map	*/
#define	GRI_MODIFY	0x04	/* we modified this file		*/
#define	GRI_METADATA	0x08	/* we created metadata			*/
#define	GRI_EXPENSIVE	0x10	/* record indicates `expensive' logging */

/*
 * structures for logfile-to-workingset
 */

#define	FI_METADATA	0x01	/* this file has metadata */

/*
 * len and offset are now u_offset_t in sync with struct cachefs_allocmap in
 * file cachefs_fs.h
 */
typedef struct fid_info {
	int fi_magic;

	uint_t fi_flags;

	caddr_t fi_vfsp;

	uint_t fi_ent_n;
	struct fid_info_allocent {
		u_offset_t offset;
		u_offset_t len;
	} fi_ent[C_MAX_ALLOCINFO_SLOTS];

	u_offset_t fi_total;
} fid_info;

#define	FI_MAGIC	(3748321)

typedef struct mount_info {
	int mi_magic;

	uint_t mi_mounted:1;
	uint_t mi_used:1;

	u_offset_t mi_current;
	u_offset_t mi_high;

	uint_t mi_flags;
	uint_t mi_filegrp_size;
	char mi_path[2];
} mount_info;

#define	MI_MAGIC	(837492)

/*
 * Define the maximum size of char mi_path[]
 *
 * The maximum size of mi_path is a path (MAXPATHLEN) and a cacheid
 * (C_MAX_MOUNT_FSCDIRNAME) plus terminating nulls (2).
 *
 * Additional space is allocated to mi_path at runtime using malloc().
 */

#define	MI_MAX_MI_PATH	(MAXPATHLEN + C_MAX_MOUNT_FSCDIRNAME + 2)

typedef struct filegrp_info {
	int fg_magic;

	uint_t fg_count;  /* high-water known # of attrcache entries */
	uint_t fg_bcount; /* # of bits set in fg_bits */
	uchar_t fg_bits[DEF_FILEGRP_SIZE / NBBY];

	size_t fg_size;	 /* high-water attrcache size (MAXBSIZE ceiling) */
} fg_info;

#define	FG_MAGIC	(673492)

/*
 * the cachefs stats (stats_*) API.
 */

/* stats_create.c */
stats_cookie_t *stats_create_mountpath(char *, char *);
stats_cookie_t *stats_create_unbound(char *);
cachefs_kstat_key_t *stats_next(stats_cookie_t *);
cachefs_kstat_key_t *stats_getkey(stats_cookie_t *);
void stats_destroy(stats_cookie_t *);
int stats_good(stats_cookie_t *);
char *stats_errorstr(stats_cookie_t *);
int stats_errno(stats_cookie_t *);
int stats_inerror(stats_cookie_t *);
void stats_perror(stats_cookie_t *, int, char *, ...);

/* stats_log.c */
int stats_log_kernel_setname(stats_cookie_t *, char *);
int stats_log_which(stats_cookie_t *, int, int);
char *stats_log_kernel_getname(stats_cookie_t *);
int stats_log_logfile_open(stats_cookie_t *, char *);
void *stats_log_logfile_read(stats_cookie_t *, int *);
char *stats_log_record_toascii(stats_cookie_t *, void *);
uint_t stats_log_get_record_info(stats_cookie_t *,
    void *, caddr_t *, cfs_fid_t **, ino64_t *, u_offset_t *, u_offset_t *);
void stats_log_fi_add(stats_cookie_t *, fid_info *, u_offset_t, u_offset_t);
void stats_log_fi_trunc(stats_cookie_t *, fid_info *, u_offset_t, u_offset_t);
struct cachefs_log_logfile_header *stats_log_getheader(stats_cookie_t *);
void stats_log_compute_wssize(stats_cookie_t *);
int stats_log_wssize_init(stats_cookie_t *);
u_offset_t stats_log_wssize_current(stats_cookie_t *);
u_offset_t stats_log_wssize_high(stats_cookie_t *);
int stats_log_wssize_expensive(stats_cookie_t *);

/* stats_stats.c */
uint_t stats_hits(stats_cookie_t *);
uint_t stats_misses(stats_cookie_t *);
uint_t stats_passes(stats_cookie_t *);
uint_t stats_fails(stats_cookie_t *);
uint_t stats_modifies(stats_cookie_t *);
uint_t stats_gc_count(stats_cookie_t *);
time_t stats_gc_time(stats_cookie_t *);
time_t stats_gc_before(stats_cookie_t *);
time_t stats_gc_after(stats_cookie_t *);
int stats_zero_stats(stats_cookie_t *);

/* stats_dbm.c */
void stats_dbm_open(stats_cookie_t *);
void stats_dbm_rm(stats_cookie_t *);
void stats_dbm_close(stats_cookie_t *);
fid_info *stats_dbm_fetch_byfid(stats_cookie_t *, cfs_fid_t *);
void stats_dbm_store_byfid(stats_cookie_t *, cfs_fid_t *, fid_info *);
mount_info *stats_dbm_fetch_byvfsp(stats_cookie_t *, caddr_t);
void stats_dbm_store_byvfsp(stats_cookie_t *, caddr_t, mount_info *);
void stats_dbm_delete_byvfsp(stats_cookie_t *, caddr_t);
size_t stats_dbm_attrcache_addsize(stats_cookie_t *, mount_info *,
    ino64_t, uint_t);
datum stats_dbm_firstkey(stats_cookie_t *);
datum stats_dbm_nextkey(stats_cookie_t *);

#ifdef __cplusplus
}
#endif

#endif /* _CACHEFS_LIB_STATS_H */