File: processingloop.html

package info (click to toggle)
db5.3 5.3.28%2Bdfsg1-0.5
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 158,360 kB
  • sloc: ansic: 448,411; java: 111,824; tcl: 80,544; sh: 44,326; cs: 33,697; cpp: 21,604; perl: 14,557; xml: 10,799; makefile: 4,077; yacc: 1,003; awk: 965; sql: 801; erlang: 342; python: 216; php: 24; asm: 14
file content (217 lines) | stat: -rw-r--r-- 10,586 bytes parent folder | download | duplicates (8)
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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Processing Loop</title>
    <link rel="stylesheet" href="gettingStarted.css" type="text/css" />
    <meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
    <link rel="start" href="index.html" title="Getting Started with Replicated Berkeley DB Applications" />
    <link rel="up" href="fwrkmasterreplica.html" title="Chapter 4. Replica versus Master Processes" />
    <link rel="prev" href="fwrkmasterreplica.html" title="Chapter 4. Replica versus Master Processes" />
    <link rel="next" href="exampledoloop.html" title="Example Processing Loop" />
  </head>
  <body>
    <div xmlns="" class="navheader">
      <div class="libver">
        <p>Library Version 11.2.5.3</p>
      </div>
      <table width="100%" summary="Navigation header">
        <tr>
          <th colspan="3" align="center">Processing Loop</th>
        </tr>
        <tr>
          <td width="20%" align="left"><a accesskey="p" href="fwrkmasterreplica.html">Prev</a> </td>
          <th width="60%" align="center">Chapter 4. Replica versus Master Processes</th>
          <td width="20%" align="right"> <a accesskey="n" href="exampledoloop.html">Next</a></td>
        </tr>
      </table>
      <hr />
    </div>
    <div class="sect1" lang="en" xml:lang="en">
      <div class="titlepage">
        <div>
          <div>
            <h2 class="title" style="clear: both"><a id="processingloop"></a>Processing Loop</h2>
          </div>
        </div>
      </div>
      <p>
                        Typically the central part of any replication application
                        is some sort of a continuous loop that constantly
                        checks the state of the environment (whether it is a
                        replica or a master), opens and/or closes the
                        databases as is necessary, and performs other useful
                        work. A loop such as this one must of necessity
                        take special care to know whether it is operating
                        on a master or a replica environment because all of its
                        activities are dependent upon that state.
                  </p>
      <p>
                          The flow of activities through the loop will
                          generally be as follows:
                  </p>
      <div class="orderedlist">
        <ol type="1">
          <li>
            <p>
                                          Check whether the environment has
                                          changed state. If it has, you
                                          might want to reopen your
                                          database handles, especially if
                                          you opened your replica's
                                          database handles as read-only. 
                                          In this case, you might need to
                                          reopen them as read-write.
                                          However, if you always open your
                                          database handles as read-write,
                                          then it is not automatically necessary to
                                          reopen the databases due to a
                                          state change.  Instead, you
                                          could check for a
                                          
                                          <span>
                                                  <code class="classname">ReplicationHandleDeadException</code>
                                            exception
                                          </span>

                                          when you use your
                                          database handle(s). If you see
                                          this, then you need to reopen
                                          your database handle(s). 
                                  </p>
          </li>
          <li>
            <p>
                                          If the databases are closed,
                                          create new database handles,
                                          configure the handle as is
                                          appropriate, and then open the
                                          databases. Note that handle
                                          configuration will be different,
                                          depending on whether the handle
                                          is opened as a replica or a
                                          master. At a minimum, the master
                                          should be opened with database
                                          creation privileges, whereas the
                                          replica does not need to be. You
                                          must also open the master such
                                          that its databases are
                                          read-write. You
                                          <span class="emphasis"><em>can</em></span> open
                                          replicas with read-only
                                          databases, so long as you are
                                          prepared to close and then reopen
                                          the handle in the event the
                                          client becomes a master.
                                  </p>
            <p>
                                          Also, note that if the local
                                          environment 
                                          is a replica, then it is possible
                                          that databases do not currently
                                          exist. In this case, the database
                                          open attempts will fail. Your
                                          code will have to take this
                                          corner case into account
                                          (described below).
                                  </p>
          </li>
          <li>
            <p>
                                        Once the databases are opened,
                                        check to see if the local
                                        environment is a
                                        master. If it is, do whatever it is
                                        a master should do for your
                                        application.
                                  </p>
            <p>
                                          Remember that the code for your
                                          master should include some way
                                          for you to tell the master 
                                          to exit gracefully.
                                  </p>
          </li>
          <li>
            <p>
                                          If the local environment is not a
                                          master, then do whatever it is
                                          your replica environments should do.
                                          Again, like the code for your
                                          master environments, you should provide
                                          a way for your replicas to exit
                                          the processing loop gracefully.
                                  </p>
          </li>
        </ol>
      </div>
      <p>
                          The following code fragment illustrates
                          these points (note that we fill out this
                          fragment with a working example 
                          next in this chapter):
                  </p>
      <pre class="programlisting">// loop to manage replication activities 
public int doloop()
{
    Database db = null;


// Infinite loop. We exit depending on how the master and replica code
// is written.
for (;;) {
    /* If dbp is not opened, we need to open it. */
    if (db == null) {
         // Create the handle and then configure it. Before you open
         // it, you have to decide what open flags to use:
         DatabaseConfig dbconf = new DatabaseConfig();
         dbconf.setType(DatabaseType.BTREE);
         if (isMaster) {
            dbconf.setAllowCreate(true);
         }

         // Now you can open your database handle, passing to it the
         // optins selected above. 
         
         try {
            db = dbenv.openDatabase
                 (null, progname, null, dbconf);
         } catch(java.io.FileNotFoundException e) {
                // Put your error handling code here.
         }
    }

     // Now that the databases have been opened, continue with general
     // processing, depending on whether we are a master or a replica.
     if (isMaster) {
         // Do master stuff here. Don't forget to include a way to
         // gracefully exit the loop.
     } else {
         // Do replica stuff here. As is the case with the master
         // code, be sure to include a way to gracefully exit the
         // loop. 
     }
} </pre>
    </div>
    <div class="navfooter">
      <hr />
      <table width="100%" summary="Navigation footer">
        <tr>
          <td width="40%" align="left"><a accesskey="p" href="fwrkmasterreplica.html">Prev</a> </td>
          <td width="20%" align="center">
            <a accesskey="u" href="fwrkmasterreplica.html">Up</a>
          </td>
          <td width="40%" align="right"> <a accesskey="n" href="exampledoloop.html">Next</a></td>
        </tr>
        <tr>
          <td width="40%" align="left" valign="top">Chapter 4. Replica versus Master Processes </td>
          <td width="20%" align="center">
            <a accesskey="h" href="index.html">Home</a>
          </td>
          <td width="40%" align="right" valign="top"> Example Processing Loop</td>
        </tr>
      </table>
    </div>
  </body>
</html>