• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-WNDR4500-V1.0.1.40_1.0.68/ap/gpl/timemachine/db-4.7.25.NC/docs/gsg_db_rep/JAVA/
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml">
4  <head>
5    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6    <title>Chapter��4.��Replica versus Master Processes</title>
7    <link rel="stylesheet" href="gettingStarted.css" type="text/css" />
8    <meta name="generator" content="DocBook XSL Stylesheets V1.62.4" />
9    <link rel="home" href="index.html" title="Getting Started with Replicated Berkeley DB Applications" />
10    <link rel="up" href="index.html" title="Getting Started with Replicated Berkeley DB Applications" />
11    <link rel="previous" href="heartbeats.html" title="Managing Heartbeats" />
12    <link rel="next" href="processingloop.html" title="Processing Loop" />
13  </head>
14  <body>
15    <div class="navheader">
16      <table width="100%" summary="Navigation header">
17        <tr>
18          <th colspan="3" align="center">Chapter��4.��Replica versus Master Processes</th>
19        </tr>
20        <tr>
21          <td width="20%" align="left"><a accesskey="p" href="heartbeats.html">Prev</a>��</td>
22          <th width="60%" align="center">��</th>
23          <td width="20%" align="right">��<a accesskey="n" href="processingloop.html">Next</a></td>
24        </tr>
25      </table>
26      <hr />
27    </div>
28    <div class="chapter" lang="en" xml:lang="en">
29      <div class="titlepage">
30        <div>
31          <div>
32            <h2 class="title"><a id="fwrkmasterreplica"></a>Chapter��4.��Replica versus Master Processes</h2>
33          </div>
34        </div>
35        <div></div>
36      </div>
37      <div class="toc">
38        <p>
39          <b>Table of Contents</b>
40        </p>
41        <dl>
42          <dt>
43            <span class="sect1">
44              <a href="fwrkmasterreplica.html#determinestate">Determining State</a>
45            </span>
46          </dt>
47          <dt>
48            <span class="sect1">
49              <a href="processingloop.html">Processing Loop</a>
50            </span>
51          </dt>
52          <dt>
53            <span class="sect1">
54              <a href="exampledoloop.html">Example Processing Loop</a>
55            </span>
56          </dt>
57          <dd>
58            <dl>
59              <dt>
60                <span class="sect2">
61                  <a href="exampledoloop.html#runningit">Running It</a>
62                </span>
63              </dt>
64            </dl>
65          </dd>
66        </dl>
67      </div>
68      <p>
69                  Every environment participating in a replicated application
70                  must know whether it is a <span class="emphasis"><em>master</em></span> or
71                  <span class="emphasis"><em>replica</em></span>. The reason for this is
72                  because, simply, the master can modify the database while
73                  replicas cannot. As a result, not only will you open
74                  databases differently depended on whether the environment is
75                  running as a master, but the environment will frequently
76                  behave quit a bit differently depending on whether it
77                  thinks it is operating as the read/write interface for
78                  your database.
79          </p>
80      <p>
81                  Moreover, an environment must also be capable of
82                  gracefully switching between master and replica states.
83                  This means that the environment must be able to detect when
84                  it has switched states.
85          </p>
86      <p>
87                  Not surprisingly, a large part of your application's code
88                  will be tied up in knowing which state a given
89                  environment is in and then in the logic of how to behave depending on
90                  its state.
91          </p>
92      <p>
93                  This chapter shows you how to determine your environment's
94                  state, and it then shows you some sample code on how
95                  an application might behave depending on whether it is a
96                  master or a replica in a replicated application.
97          </p>
98      <div class="sect1" lang="en" xml:lang="en">
99        <div class="titlepage">
100          <div>
101            <div>
102              <h2 class="title" style="clear: both"><a id="determinestate"></a>Determining State</h2>
103            </div>
104          </div>
105          <div></div>
106        </div>
107        <p>
108                        In order to determine whether your code is running
109                        as a master or a replica, you must write your
110                        application as an implementation of
111                        <tt class="classname">com.sleepycat.db.EventHandler</tt>.
112                        This class gives you a single method,
113                        <tt class="methodname">handleEvent()</tt>, within
114                        which you can detect and respond to various events
115                        that occur in your DB code. 
116                  </p>
117        <p>
118                          Note that <tt class="methodname">EventHandler</tt>
119                          responds to a number of
120                          <tt class="classname">com.sleepycat.db.EventType</tt>
121                          events, only some of which are related to
122                          replication. For replication, the events that we
123                          care about are:
124                  </p>
125        <div class="itemizedlist">
126          <ul type="disc">
127            <li>
128              <p>
129                                          
130                                          <tt class="literal">EventType.REP_MASTER</tt>
131                                  </p>
132              <p>
133                                          The local environment is now a master.
134                                  </p>
135            </li>
136            <li>
137              <p>
138                                          
139                                          <tt class="literal">EventType.REP_CLIENT</tt>
140                                  </p>
141              <p>
142                                          The local environment is now a replica.
143                                  </p>
144            </li>
145            <li>
146              <p>
147                                          
148                                          <tt class="literal">EventType.REP_STARTUPDONE</tt>
149                                  </p>
150              <p>
151                                          The replica has completed startup
152                                          synchronization and is now
153                                          processing log records received
154                                          from the master.
155                                  </p>
156            </li>
157            <li>
158              <p>
159                                          
160                                          <tt class="literal">EventType.REP_NEWMASTER</tt>
161                                  </p>
162              <p>
163                                          An election was held and a new
164                                          environment was made a master. However,
165                                          the current environment <span class="emphasis"><em>is
166                                          not</em></span> the master. This
167                                  event exists so that you can
168                                  cause your code to take some
169                                  unique action in the event that the
170                                  replication groups switches masters.
171                                  </p>
172            </li>
173          </ul>
174        </div>
175        <p>
176                          Note that these events are raised whenever the
177                          state is established. That is, when the current
178                          environment becomes a client, and that includes
179                          at application startup, the event is raised.
180                          Also, when an election is held and a client is elected to be a
181                          master, then the event occurs.
182                  </p>
183        <p>
184                          The <tt class="classname">EventHandler</tt>
185                          implementation is fairly simple. First you detect
186                          the event, and then you record the state change
187                          in some data member maintained in a location that
188                          is convenient to you.
189                  </p>
190        <p>
191                          For example:
192                  </p>
193        <pre class="programlisting">
194package db.repquote;
195
196// We make our main class an EventHandler implementation
197...
198import com.sleepycat.db.EventHandler;
199...
200
201public class MyReplicationClass implements EventHandler
202{
203
204...
205
206// Somewhere we provide a data member that is used to track
207// whether we are a master server. This could be in our main
208// class, or it could be part of a supporting class.
209private boolean isMaster;
210
211...
212
213isMaster = false;
214
215...
216
217// In the code where we open our environment and start replication,
218// we must identify the class that is the event handler. In this
219// example, we are performing this from within the class that 
220// implements com.sleepycat.db.EventHandler so we identify
221// "this" class as the event handler
222envConfig.setEventHandler(this); </pre>
223        <p>
224        That done, we still need to implement the <tt class="methodname">handleEvent</tt>
225        method. This implementation can be fairly trivial. 
226</p>
227        <pre class="programlisting">    public int handleEvent(EventType event)
228    {
229        int ret = 0;
230        if (event == EventType.REP_MASTER)
231            dbenv.setIsMaster(true);
232        else if (event == EventType.REP_CLIENT)
233            dbenv.setIsMaster(false);
234        else if (event == EventType.REP_NEW_MASTER) {
235            // ignored for now.
236        } else {
237            System.err.println("Unknown event callback received.\n");
238            ret = 1;
239        }
240        return ret;
241    } </pre>
242        <p>
243        Of course, this only gives us the current state of the environment. We
244        still need the code that determines what to do when the environment 
245        changes state and how to behave depending on the state (described
246        in the next section).
247</p>
248      </div>
249    </div>
250    <div class="navfooter">
251      <hr />
252      <table width="100%" summary="Navigation footer">
253        <tr>
254          <td width="40%" align="left"><a accesskey="p" href="heartbeats.html">Prev</a>��</td>
255          <td width="20%" align="center">
256            <a accesskey="u" href="index.html">Up</a>
257          </td>
258          <td width="40%" align="right">��<a accesskey="n" href="processingloop.html">Next</a></td>
259        </tr>
260        <tr>
261          <td width="40%" align="left" valign="top">Managing Heartbeats��</td>
262          <td width="20%" align="center">
263            <a accesskey="h" href="index.html">Home</a>
264          </td>
265          <td width="40%" align="right" valign="top">��Processing Loop</td>
266        </tr>
267      </table>
268    </div>
269  </body>
270</html>
271