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 replication subsystem
14    /// </summary>
15    public class ReplicationStats {
16        private Internal.ReplicationStatStruct st;
17        private LSN next;
18        private LSN waiting;
19        private LSN maxPerm;
20        private LSN winner;
21        internal ReplicationStats(Internal.ReplicationStatStruct stats) {
22            st = stats;
23            next = new LSN(st.st_next_lsn.file, st.st_next_lsn.offset);
24            waiting = new LSN(st.st_waiting_lsn.file, st.st_waiting_lsn.offset);
25            maxPerm =
26                new LSN(st.st_max_perm_lsn.file, st.st_max_perm_lsn.offset);
27            winner = new LSN(st.st_election_lsn.file, st.st_election_lsn.offset);
28
29        }
30
31        /// <summary>
32        /// Log records currently queued.
33        /// </summary>
34        public ulong CurrentQueuedLogRecords { get { return st.st_log_queued; } }
35        /// <summary>
36        /// Site completed client sync-up.
37        /// </summary>
38        public bool ClientStartupComplete { get { return st.st_startup_complete != 0; } }
39        /// <summary>
40        /// Current replication status.
41        /// </summary>
42        public uint Status { get { return st.st_status; } }
43        /// <summary>
44        /// Next LSN to use or expect.
45        /// </summary>
46        public LSN NextLSN { get { return next; } }
47        /// <summary>
48        /// LSN we're awaiting, if any.
49        /// </summary>
50        public LSN AwaitedLSN { get { return waiting; } }
51        /// <summary>
52        /// Maximum permanent LSN.
53        /// </summary>
54        public LSN MaxPermanentLSN { get { return maxPerm; } }
55        /// <summary>
56        /// Next pg we expect.
57        /// </summary>
58        public uint NextPage { get { return st.st_next_pg; } }
59        /// <summary>
60        /// pg we're awaiting, if any.
61        /// </summary>
62        public uint AwaitedPage { get { return st.st_waiting_pg; } }
63        /// <summary>
64        /// # of times a duplicate master condition was detected.
65        /// </summary>
66        public uint DupMasters { get { return st.st_dupmasters; } }
67        /// <summary>
68        /// Current environment ID.
69        /// </summary>
70        public int EnvID { get { return st.st_env_id; } }
71        /// <summary>
72        /// Current environment priority.
73        /// </summary>
74        public uint EnvPriority { get { return st.st_env_priority; } }
75        /// <summary>
76        /// Bulk buffer fills.
77        /// </summary>
78        public ulong BulkBufferFills { get { return st.st_bulk_fills; } }
79        /// <summary>
80        /// Bulk buffer overflows.
81        /// </summary>
82        public ulong BulkBufferOverflows { get { return st.st_bulk_overflows; } }
83        /// <summary>
84        /// Bulk records stored.
85        /// </summary>
86        public ulong BulkRecordsStored { get { return st.st_bulk_records; } }
87        /// <summary>
88        /// Transfers of bulk buffers.
89        /// </summary>
90        public ulong BulkBufferTransfers { get { return st.st_bulk_transfers; } }
91        /// <summary>
92        /// Number of forced rerequests.
93        /// </summary>
94        public ulong ForcedRerequests { get { return st.st_client_rerequests; } }
95        /// <summary>
96        /// Number of client service requests received by this client.
97        /// </summary>
98        public ulong ClientServiceRequests { get { return st.st_client_svc_req; } }
99        /// <summary>
100        /// Number of client service requests missing on this client.
101        /// </summary>
102        public ulong ClientServiceRequestsMissing { get { return st.st_client_svc_miss; } }
103        /// <summary>
104        /// Current generation number.
105        /// </summary>
106        public uint CurrentGenerationNumber { get { return st.st_gen; } }
107        /// <summary>
108        /// Current election gen number.
109        /// </summary>
110        public uint CurrentElectionGenerationNumber { get { return st.st_egen; } }
111        /// <summary>
112        /// Log records received multiply.
113        /// </summary>
114        public ulong DuplicateLogRecords { get { return st.st_log_duplicated; } }
115        /// <summary>
116        /// Max. log records queued at once.
117        /// </summary>
118        public ulong MaxQueuedLogRecords { get { return st.st_log_queued_max; } }
119        /// <summary>
120        /// Total # of log recs. ever queued.
121        /// </summary>
122        public ulong QueuedLogRecords { get { return st.st_log_queued_total; } }
123        /// <summary>
124        /// Log records received and put.
125        /// </summary>
126        public ulong ReceivedLogRecords { get { return st.st_log_records; } }
127        /// <summary>
128        /// Log recs. missed and requested.
129        /// </summary>
130        public ulong MissedLogRecords { get { return st.st_log_requested; } }
131        /// <summary>
132        /// Env. ID of the current master.
133        /// </summary>
134        public int MasterEnvID { get { return st.st_master; } }
135        /// <summary>
136        /// # of times we've switched masters.
137        /// </summary>
138        public ulong MasterChanges { get { return st.st_master_changes; } }
139        /// <summary>
140        /// Messages with a bad generation #.
141        /// </summary>
142        public ulong BadGenerationMessages { get { return st.st_msgs_badgen; } }
143        /// <summary>
144        /// Messages received and processed.
145        /// </summary>
146        public ulong ReceivedMessages { get { return st.st_msgs_processed; } }
147        /// <summary>
148        /// Messages ignored because this site was a client in recovery.
149        /// </summary>
150        public ulong IgnoredMessages { get { return st.st_msgs_recover; } }
151        /// <summary>
152        /// # of failed message sends.
153        /// </summary>
154        public ulong FailedMessageSends { get { return st.st_msgs_send_failures; } }
155        /// <summary>
156        /// # of successful message sends.
157        /// </summary>
158        public ulong MessagesSent { get { return st.st_msgs_sent; } }
159        /// <summary>
160        /// # of NEWSITE msgs. received.
161        /// </summary>
162        public ulong NewSiteMessages { get { return st.st_newsites; } }
163        /// <summary>
164        /// Current number of sites we will assume during elections.
165        /// </summary>
166        public uint Sites { get { return st.st_nsites; } }
167        /// <summary>
168        /// # of times we were throttled.
169        /// </summary>
170        public ulong Throttled { get { return st.st_nthrottles; } }
171        /// <summary>
172        /// # of times we detected and returned an OUTDATED condition.
173        /// </summary>
174        public ulong Outdated { get { return st.st_outdated; } }
175        /// <summary>
176        /// Pages received multiply.
177        /// </summary>
178        public ulong DuplicatePages { get { return st.st_pg_duplicated; } }
179        /// <summary>
180        /// Pages received and stored.
181        /// </summary>
182        public ulong ReceivedPages { get { return st.st_pg_records; } }
183        /// <summary>
184        /// Pages missed and requested.
185        /// </summary>
186        public ulong MissedPages { get { return st.st_pg_requested; } }
187        /// <summary>
188        /// # of transactions applied.
189        /// </summary>
190        public ulong AppliedTransactions { get { return st.st_txns_applied; } }
191        /// <summary>
192        /// # of STARTSYNC msgs delayed.
193        /// </summary>
194        public ulong StartSyncMessagesDelayed { get { return st.st_startsync_delayed; } }
195
196        /* Elections generally. */
197        /// <summary>
198        /// # of elections held.
199        /// </summary>
200        public ulong Elections { get { return st.st_elections; } }
201        /// <summary>
202        /// # of elections won by this site.
203        /// </summary>
204        public ulong ElectionsWon { get { return st.st_elections_won; } }
205
206        /* Statistics about an in-progress election. */
207        /// <summary>
208        /// Current front-runner.
209        /// </summary>
210        public int CurrentWinner { get { return st.st_election_cur_winner; } }
211        /// <summary>
212        /// Election generation number.
213        /// </summary>
214        public uint ElectionGenerationNumber { get { return st.st_election_gen; } }
215        /// <summary>
216        /// Max. LSN of current winner.
217        /// </summary>
218        public LSN CurrentWinnerMaxLSN { get { return winner; } }
219        /// <summary>
220        /// # of "registered voters".
221        /// </summary>
222        public uint RegisteredSites { get { return st.st_election_nsites; } }
223        /// <summary>
224        /// # of "registered voters" needed.
225        /// </summary>
226        public uint RegisteredSitesNeeded { get { return st.st_election_nvotes; } }
227        /// <summary>
228        /// Current election priority.
229        /// </summary>
230        public uint ElectionPriority { get { return st.st_election_priority; } }
231        /// <summary>
232        /// Current election status.
233        /// </summary>
234        public int ElectionStatus { get { return st.st_election_status; } }
235        /// <summary>
236        /// Election tiebreaker value.
237        /// </summary>
238        public uint ElectionTiebreaker { get { return st.st_election_tiebreaker; } }
239        /// <summary>
240        /// Votes received in this round.
241        /// </summary>
242        public uint Votes { get { return st.st_election_votes; } }
243        /// <summary>
244        /// Last election time seconds.
245        /// </summary>
246        public uint ElectionTimeSec { get { return st.st_election_sec; } }
247        /// <summary>
248        /// Last election time useconds.
249        /// </summary>
250        public uint ElectionTimeUSec { get { return st.st_election_usec; } }
251        /// <summary>
252        /// Maximum lease timestamp seconds.
253        /// </summary>
254        public uint MaxLeaseSec { get { return st.st_max_lease_sec; } }
255        /// <summary>
256        /// Maximum lease timestamp useconds.
257        /// </summary>
258        public uint MaxLeaseUSec { get { return st.st_max_lease_usec; } }
259    }
260}