1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 2009 Oracle.  All rights reserved.
5 *
6 */
7using System;
8using System.Collections.Generic;
9using System.Text;
10
11namespace BerkeleyDB {
12    /// <summary>
13    /// Statistical information about the memory pool subsystem
14    /// </summary>
15    public class MPoolStats {
16        private Internal.MPoolStatStruct st;
17        private CacheInfo ci;
18        private List<MPoolFileStats> mempfiles;
19
20        internal MPoolStats(Internal.MempStatStruct stats) {
21            st = stats.st;
22            ci = new CacheInfo(st.st_gbytes, st.st_bytes, (int)st.st_max_ncache);
23            mempfiles = new List<MPoolFileStats>();
24            foreach (Internal.MPoolFileStatStruct file in stats.files)
25                mempfiles.Add(new MPoolFileStats(file));
26        }
27        /// <summary>
28        /// Total cache size and number of regions
29        /// </summary>
30        public CacheInfo CacheSettings { get { return ci; } }
31        /// <summary>
32        /// Maximum number of regions.
33        /// </summary>
34        public uint CacheRegions { get { return st.st_ncache; } }
35        /// <summary>
36        /// Maximum file size for mmap.
37        /// </summary>
38        public ulong MaxMMapSize { get { return (ulong)st.st_mmapsize.ToInt64(); } }
39        /// <summary>
40        /// Maximum number of open fd's.
41        /// </summary>
42        public int MaxOpenFileDescriptors { get { return st.st_maxopenfd; } }
43        /// <summary>
44        /// Maximum buffers to write.
45        /// </summary>
46        public int MaxBufferWrites { get { return st.st_maxwrite; } }
47        /// <summary>
48        /// Sleep after writing max buffers.
49        /// </summary>
50        public uint MaxBufferWritesSleep { get { return st.st_maxwrite_sleep; } }
51        /// <summary>
52        /// Total number of pages.
53        /// </summary>
54        public uint Pages { get { return st.st_pages; } }
55        /// <summary>
56        /// Pages from mapped files.
57        /// </summary>
58        public uint MappedPages { get { return st.st_map; } }
59        /// <summary>
60        /// Pages found in the cache.
61        /// </summary>
62        public ulong PagesInCache { get { return st.st_cache_hit; } }
63        /// <summary>
64        /// Pages not found in the cache.
65        /// </summary>
66        public ulong PagesNotInCache { get { return st.st_cache_miss; } }
67        /// <summary>
68        /// Pages created in the cache.
69        /// </summary>
70        public ulong PagesCreatedInCache { get { return st.st_page_create; } }
71        /// <summary>
72        /// Pages read in.
73        /// </summary>
74        public ulong PagesRead { get { return st.st_page_in; } }
75        /// <summary>
76        /// Pages written out.
77        /// </summary>
78        public ulong PagesWritten { get { return st.st_page_out; } }
79        /// <summary>
80        /// Clean pages forced from the cache.
81        /// </summary>
82        public ulong CleanPagesEvicted { get { return st.st_ro_evict; } }
83        /// <summary>
84        /// Dirty pages forced from the cache.
85        /// </summary>
86        public ulong DirtyPagesEvicted { get { return st.st_rw_evict; } }
87        /// <summary>
88        /// Pages written by memp_trickle.
89        /// </summary>
90        public ulong PagesTrickled { get { return st.st_page_trickle; } }
91        /// <summary>
92        /// Clean pages.
93        /// </summary>
94        public uint CleanPages { get { return st.st_page_clean; } }
95        /// <summary>
96        /// Dirty pages.
97        /// </summary>
98        public uint DirtyPages { get { return st.st_page_dirty; } }
99        /// <summary>
100        /// Number of hash buckets.
101        /// </summary>
102        public uint HashBuckets { get { return st.st_hash_buckets; } }
103        /// <summary>
104        /// Assumed page size.
105        /// </summary>
106        public uint PageSize { get { return st.st_pagesize; } }
107        /// <summary>
108        /// Total hash chain searches.
109        /// </summary>
110        public uint HashChainSearches { get { return st.st_hash_searches; } }
111        /// <summary>
112        /// Longest hash chain searched.
113        /// </summary>
114        public uint LongestHashChainSearch { get { return st.st_hash_longest; } }
115        /// <summary>
116        /// Total hash entries searched.
117        /// </summary>
118        public ulong HashEntriesSearched { get { return st.st_hash_examined; } }
119        /// <summary>
120        /// Hash lock granted with nowait.
121        /// </summary>
122        public ulong HashLockNoWait { get { return st.st_hash_nowait; } }
123        /// <summary>
124        /// Hash lock granted after wait.
125        /// </summary>
126        public ulong HashLockWait { get { return st.st_hash_wait; } }
127        /// <summary>
128        /// Max hash lock granted with nowait.
129        /// </summary>
130        public ulong MaxHashLockNoWait { get { return st.st_hash_max_nowait; } }
131        /// <summary>
132        /// Max hash lock granted after wait.
133        /// </summary>
134        public ulong MaxHashLockWait { get { return st.st_hash_max_wait; } }
135        /// <summary>
136        /// Region lock granted with nowait.
137        /// </summary>
138        public ulong RegionLockNoWait { get { return st.st_region_nowait; } }
139        /// <summary>
140        /// Region lock granted after wait.
141        /// </summary>
142        public ulong RegionLockWait { get { return st.st_region_wait; } }
143        /// <summary>
144        /// Buffers frozen.
145        /// </summary>
146        public ulong FrozenBuffers { get { return st.st_mvcc_frozen; } }
147        /// <summary>
148        /// Buffers thawed.
149        /// </summary>
150        public ulong ThawedBuffers { get { return st.st_mvcc_thawed; } }
151        /// <summary>
152        /// Frozen buffers freed.
153        /// </summary>
154        public ulong FrozenBuffersFreed { get { return st.st_mvcc_freed; } }
155        /// <summary>
156        /// Number of page allocations.
157        /// </summary>
158        public ulong PageAllocations { get { return st.st_alloc; } }
159        /// <summary>
160        /// Buckets checked during allocation.
161        /// </summary>
162        public ulong BucketsCheckedDuringAlloc { get { return st.st_alloc_buckets; } }
163        /// <summary>
164        /// Max checked during allocation.
165        /// </summary>
166        public ulong MaxBucketsCheckedDuringAlloc { get { return st.st_alloc_max_buckets; } }
167        /// <summary>
168        /// Pages checked during allocation.
169        /// </summary>
170        public ulong PagesCheckedDuringAlloc { get { return st.st_alloc_pages; } }
171        /// <summary>
172        /// Max checked during allocation.
173        /// </summary>
174        public ulong MaxPagesCheckedDuringAlloc { get { return st.st_alloc_max_pages; } }
175        /// <summary>
176        /// Thread waited on buffer I/O.
177        /// </summary>
178        public ulong BlockedOperations { get { return st.st_io_wait; } }
179        /// <summary>
180        /// Number of times sync interrupted.
181        /// </summary>
182        public ulong SyncInterrupted { get { return st.st_sync_interrupted; } }
183        /// <summary>
184        /// Region size.
185        /// </summary>
186        public ulong RegionSize { get { return (ulong)st.st_regsize.ToInt64(); } }
187        /// <summary>
188        /// Stats for files open in the memory pool
189        /// </summary>
190        public List<MPoolFileStats> Files { get { return mempfiles; } }
191    }
192}