Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=4e…
Commit: 4eee6eebae4f4f6c74090dad90bd5c08ad52e0b7
Parent: 1adc2300a6946b98f2051827c0d85b8da5870375
Author: Lon Hohberger <lhh(a)redhat.com>
AuthorDate: Tue Aug 31 10:13:11 2010 -0400
Committer: Lon Hohberger <lhh(a)redhat.com>
CommitterDate: Tue Aug 31 10:13:11 2010 -0400
doc: Update autogenerated documentation
Signed-off-by: Lon Hohberger <lhh(a)redhat.com>
---
doc/cluster_conf.html | 26 ++++++++++++++++++++++----
1 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/doc/cluster_conf.html b/doc/cluster_conf.html
index d3e05b8..0a7c4eb 100644
--- a/doc/cluster_conf.html
+++ b/doc/cluster_conf.html
@@ -396,15 +396,16 @@ Defines the properties of a device used for fencing or unfencing a node. fenced(
<tr><td><b>aptpl</b></td><td></td></tr>
<tr><td><b>auth</b></td><td>For IPMI LAN only. Authentication Type: none, password, md2, or md5</td></tr>
<tr><td><b>channel_address</b></td><td>VM Channel IP address (default=10.0.2.179)</td></tr>
- <tr><td><b>cipher</b></td><td>Ciphersuite to use (same as ipmitool -C parameter)</td></tr>
<tr><td><b>cmd_prompt</b></td><td>Force command prompt</td></tr>
<tr><td><b>community</b></td><td>Set the community string</td></tr>
<tr><td><b>cserver</b></td><td>The hostname (and optionally the username in the form of username@hostname) assigned to the device. Refer to the fence_egenera(8) man page for more information.</td></tr>
<tr><td><b>debug</b></td><td>Specify (stdin) or increment (command line) debug level</td></tr>
+ <tr><td><b>delay</b></td><td>Wait this many seconds before fencing is started. fence_egenera(8)</td></tr>
<tr><td><b>device</b></td><td>The device the switch is connected to on the controlling host.</td></tr>
<tr><td><b>devices</b></td><td>List of devices to fence (separated by commas).</td></tr>
<tr><td><b>domain</b></td><td>Virtual Machine (domain name) to fence (deprecated)</td></tr>
<tr><td><b>drac_version</b></td><td>Force DRAC version to use</td></tr>
+ <tr><td><b>esh</b></td><td>Path to the esh command on the cserver. fence_egenera(8)</td></tr>
<tr><td><b>exec</b></td><td>Command to execute</td></tr>
<tr><td><b>hash</b></td><td>Packet hash strength (none, sha1, [sha256], sha512)</td></tr>
<tr><td><b>help</b></td><td>Display help and exit</td></tr>
@@ -421,8 +422,10 @@ Defines the properties of a device used for fencing or unfencing a node. fenced(
<tr><td><b>lanplus</b></td><td>For IPMI LAN only. Set value to either True or 1; leave out for false.</td></tr>
<tr><td><b>logfile</b></td><td>Location to output logs from fence_scsi.</td></tr>
<tr><td><b>login</b></td><td>The login name used to access the device. </td></tr>
+ <tr><td><b>login_timeout</b></td><td>Wait X seconds for cmd prompt after login</td></tr>
+ <tr><td><b>lpan</b></td><td>The lpan to operate on. fence_egenera(8)</td></tr>
<tr><td><b>managed</b></td><td>Managed system name</td></tr>
- <tr><td><b>method</b></td><td>Method to fence (onoff or cycle)</td></tr>
+ <tr><td><b>missing_as_off</b></td><td>Missing port returns OFF instead of failure</td></tr>
<tr><td><b>module_name</b></td><td>DRAC/MC module name</td></tr>
<tr><td><b>multicast_address</b></td><td>Multicast address (default=225.0.0.12 / ff05::3:1)</td></tr>
<tr><td><b>nodename</b></td><td>Name of the node to be fenced. Refer to fence_scsi(8) for more information.</td></tr>
@@ -431,7 +434,11 @@ Defines the properties of a device used for fencing or unfencing a node. fenced(
<tr><td><b>passwd</b></td><td>The password used to authenticate the connection to the device.</td></tr>
<tr><td><b>passwd_script</b></td><td>The script that supplies a password for access to the fence device. Using this supersedes the Password parameter.</td></tr>
<tr><td><b>port</b></td><td>The switch outlet number.</td></tr>
+ <tr><td><b>power_timeout</b></td><td>Test X seconds for status change after ON/OFF</td></tr>
+ <tr><td><b>power_wait</b></td><td>Wait X seconds after issuing ON/OFF</td></tr>
+ <tr><td><b>pserver</b></td><td>The pserver to operate on. fence_egenera(8)</td></tr>
<tr><td><b>retrans</b></td><td>Multicast retransmit time (in 1/10sec; default=20)</td></tr>
+ <tr><td><b>retry_on</b></td><td>Count of attempts to retry power on</td></tr>
<tr><td><b>ribcl</b></td><td>Force ribcl version to use</td></tr>
<tr><td><b>rpowerpath</b></td><td></td></tr>
<tr><td><b>secure</b></td><td>SSH connection</td></tr>
@@ -439,6 +446,7 @@ Defines the properties of a device used for fencing or unfencing a node. fenced(
<tr><td><b>serial_device</b></td><td>Serial device (default=/dev/ttyS1)</td></tr>
<tr><td><b>serial_params</b></td><td>Serial Parameters (default=115200,8N1)</td></tr>
<tr><td><b>servers</b></td><td>The hostname of each GNBD to disable. For multiple hostnames, separate each hostname with a space.</td></tr>
+ <tr><td><b>shell_timeout</b></td><td>Wait X seconds for cmd promprt after issuing command</td></tr>
<tr><td><b>snmp_auth_prot</b></td><td>Set authentication protocol (MD5|SHA)</td></tr>
<tr><td><b>snmp_priv_passwd</b></td><td>Set privacy protocol password</td></tr>
<tr><td><b>snmp_priv_passwd_script</b></td><td>Script to run to retrieve privacy password</td></tr>
@@ -449,6 +457,7 @@ Defines the properties of a device used for fencing or unfencing a node. fenced(
<tr><td><b>switch</b></td><td>Physical switch number on device</td></tr>
<tr><td><b>timeout</b></td><td>Fencing timeout (in seconds; default=30)</td></tr>
<tr><td><b>udpport</b></td><td>UDP/TCP port to use for connection with device</td></tr>
+ <tr><td><b>user</b></td><td>See fence_egenera(8)</td></tr>
<tr><td><b>use_uuid</b></td><td>Treat [domain] as UUID instead of domain name. This is provided for compatibility with older fence_xvmd installations.</td></tr>
<tr><td><b>verbose</b></td><td>Verbose mode</td></tr>
<tr><td><b>version</b></td><td>Display version information and exit</td></tr>
@@ -546,15 +555,16 @@ Defines fence device properties. fenced(8)<br/>
<tr><td><b>aptpl</b></td><td></td></tr>
<tr><td><b>auth</b></td><td>For IPMI LAN only. Authentication Type: none, password, md2, or md5</td></tr>
<tr><td><b>channel_address</b></td><td>VM Channel IP address (default=10.0.2.179)</td></tr>
- <tr><td><b>cipher</b></td><td>Ciphersuite to use (same as ipmitool -C parameter)</td></tr>
<tr><td><b>cmd_prompt</b></td><td>Force command prompt</td></tr>
<tr><td><b>community</b></td><td>Set the community string</td></tr>
<tr><td><b>cserver</b></td><td>The hostname (and optionally the username in the form of username@hostname) assigned to the device. Refer to the fence_egenera(8) man page for more information.</td></tr>
<tr><td><b>debug</b></td><td>Specify (stdin) or increment (command line) debug level</td></tr>
+ <tr><td><b>delay</b></td><td>Wait this many seconds before fencing is started. fence_egenera(8)</td></tr>
<tr><td><b>device</b></td><td>The device the switch is connected to on the controlling host.</td></tr>
<tr><td><b>devices</b></td><td>List of devices to fence (separated by commas).</td></tr>
<tr><td><b>domain</b></td><td>Virtual Machine (domain name) to fence (deprecated)</td></tr>
<tr><td><b>drac_version</b></td><td>Force DRAC version to use</td></tr>
+ <tr><td><b>esh</b></td><td>Path to the esh command on the cserver. fence_egenera(8)</td></tr>
<tr><td><b>exec</b></td><td>Command to execute</td></tr>
<tr><td><b>hash</b></td><td>Packet hash strength (none, sha1, [sha256], sha512)</td></tr>
<tr><td><b>help</b></td><td>Display help and exit</td></tr>
@@ -571,8 +581,10 @@ Defines fence device properties. fenced(8)<br/>
<tr><td><b>lanplus</b></td><td>For IPMI LAN only. Set value to either True or 1; leave out for false.</td></tr>
<tr><td><b>logfile</b></td><td>Location to output logs from fence_scsi.</td></tr>
<tr><td><b>login</b></td><td>The login name used to access the device. </td></tr>
+ <tr><td><b>login_timeout</b></td><td>Wait X seconds for cmd prompt after login</td></tr>
+ <tr><td><b>lpan</b></td><td>The lpan to operate on. fence_egenera(8)</td></tr>
<tr><td><b>managed</b></td><td>Managed system name</td></tr>
- <tr><td><b>method</b></td><td>Method to fence (onoff or cycle)</td></tr>
+ <tr><td><b>missing_as_off</b></td><td>Missing port returns OFF instead of failure</td></tr>
<tr><td><b>module_name</b></td><td>DRAC/MC module name</td></tr>
<tr><td><b>multicast_address</b></td><td>Multicast address (default=225.0.0.12 / ff05::3:1)</td></tr>
<tr><td><b>nodename</b></td><td>Name of the node to be fenced. Refer to fence_scsi(8) for more information.</td></tr>
@@ -581,7 +593,11 @@ Defines fence device properties. fenced(8)<br/>
<tr><td><b>passwd</b></td><td>The password used to authenticate the connection to the device.</td></tr>
<tr><td><b>passwd_script</b></td><td>The script that supplies a password for access to the fence device. Using this supersedes the Password parameter.</td></tr>
<tr><td><b>port</b></td><td>The switch outlet number.</td></tr>
+ <tr><td><b>power_timeout</b></td><td>Test X seconds for status change after ON/OFF</td></tr>
+ <tr><td><b>power_wait</b></td><td>Wait X seconds after issuing ON/OFF</td></tr>
+ <tr><td><b>pserver</b></td><td>The pserver to operate on. fence_egenera(8)</td></tr>
<tr><td><b>retrans</b></td><td>Multicast retransmit time (in 1/10sec; default=20)</td></tr>
+ <tr><td><b>retry_on</b></td><td>Count of attempts to retry power on</td></tr>
<tr><td><b>ribcl</b></td><td>Force ribcl version to use</td></tr>
<tr><td><b>rpowerpath</b></td><td></td></tr>
<tr><td><b>secure</b></td><td>SSH connection</td></tr>
@@ -589,6 +605,7 @@ Defines fence device properties. fenced(8)<br/>
<tr><td><b>serial_device</b></td><td>Serial device (default=/dev/ttyS1)</td></tr>
<tr><td><b>serial_params</b></td><td>Serial Parameters (default=115200,8N1)</td></tr>
<tr><td><b>servers</b></td><td>The hostname of each GNBD to disable. For multiple hostnames, separate each hostname with a space.</td></tr>
+ <tr><td><b>shell_timeout</b></td><td>Wait X seconds for cmd promprt after issuing command</td></tr>
<tr><td><b>snmp_auth_prot</b></td><td>Set authentication protocol (MD5|SHA)</td></tr>
<tr><td><b>snmp_priv_passwd</b></td><td>Set privacy protocol password</td></tr>
<tr><td><b>snmp_priv_passwd_script</b></td><td>Script to run to retrieve privacy password</td></tr>
@@ -599,6 +616,7 @@ Defines fence device properties. fenced(8)<br/>
<tr><td><b>switch</b></td><td>Physical switch number on device</td></tr>
<tr><td><b>timeout</b></td><td>Fencing timeout (in seconds; default=30)</td></tr>
<tr><td><b>udpport</b></td><td>UDP/TCP port to use for connection with device</td></tr>
+ <tr><td><b>user</b></td><td>See fence_egenera(8)</td></tr>
<tr><td><b>use_uuid</b></td><td>Treat [domain] as UUID instead of domain name. This is provided for compatibility with older fence_xvmd installations.</td></tr>
<tr><td><b>verbose</b></td><td>Verbose mode</td></tr>
<tr><td><b>version</b></td><td>Display version information and exit</td></tr>
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=53…
Commit: 536a21273c5cc23421fdb042759e261cdd2fa848
Parent: 06db0246dfe847790c7c9800f4f91015cc694a7f
Author: Lon Hohberger <lhh(a)redhat.com>
AuthorDate: Tue Aug 31 10:08:36 2010 -0400
Committer: Lon Hohberger <lhh(a)redhat.com>
CommitterDate: Tue Aug 31 10:12:01 2010 -0400
config: Fix broken fence_egenera options
Signed-off-by: Lon Hohberger <lhh(a)redhat.com>
---
config/tools/xml/cluster.rng.in | 22 +++++++++++++++++++++-
1 files changed, 21 insertions(+), 1 deletions(-)
diff --git a/config/tools/xml/cluster.rng.in b/config/tools/xml/cluster.rng.in
index bb11edf..4c0fef1 100644
--- a/config/tools/xml/cluster.rng.in
+++ b/config/tools/xml/cluster.rng.in
@@ -2322,10 +2322,30 @@ To validate your cluster.conf against this schema, run:
an optional ESH path. Presumably those should be attributes in
the schema. We need more invormation on this. -->
<group>
- <attribute name="cserver" rha:description="The hostname (and
+ <optional>
+ <attribute name="cserver" rha:description="The hostname (and
optionally the username in the form of username@hostname)
assigned to the device. Refer to the fence_egenera(8) man
page for more information." rha:sample=""/>
+ </optional>
+ <optional>
+ <attribute name="pserver" rha:description="The pserver to operate on. fence_egenera(8)" />
+ </optional>
+ <optional>
+ <attribute name="lpan" rha:description="The lpan to operate on. fence_egenera(8)" />
+ </optional>
+ <optional>
+ <attribute name="action" rha:description="The action to perform (reboot, off, on, or status). fence_egenera(8)" />
+ </optional>
+ <optional>
+ <attribute name="esh" rha:description="Path to the esh command on the cserver. fence_egenera(8)" />
+ </optional>
+ <optional>
+ <attribute name="user" rha:description="See fence_egenera(8)" />
+ </optional>
+ <optional>
+ <attribute name="delay" rha:description="Wait this many seconds before fencing is started. fence_egenera(8)" />
+ </optional>
</group>
<!-- FIXME: It appears that xCat is no longer supported. Found no
fence agents for x Cat in RHEL 5.3. -->
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=5c…
Commit: 5cf664ec4f1f08c110e14039b7945ee5d660f8fc
Parent: 95d4db6c9a10517a7ed981be2271e5a602e0bcc2
Author: Jonathan Brassow <jbrassow(a)redhat.com>
AuthorDate: Mon Aug 30 15:59:11 2010 -0500
Committer: Jonathan Brassow <jbrassow(a)redhat.com>
CommitterDate: Mon Aug 30 15:59:11 2010 -0500
Fix potential I/O hang after cluster mirror creation w/ --nosync
This patch fixes an issue where cluster mirror write I/O
can be opprobriously slow if created with '--nosync'.
One of the ways cluster mirrors coordinate I/O and recovery
amoung the different machines is by the use of the log
function 'is_remote_recovering()' which lets node know if
a region they wish to perform a write on is currently being
recovered on another node. If the region is being recovered,
the I/O is delayed.
The 'is_remote_recovering' routine has been optimized to
avoid the deluge of requests that would be issued to the
userspace log server by maintaining a marker of how far
the recovery has gotten. It can then immediately return
'not recovering' if the region being inquired about is
less than this mark. Additionally, if the region of
concern is greater than the mark, the function will
limit the number of transmissions to userspace by assuming
the region /is/ being recovered when skipping the
transmission. This limits the amount of processing
and updates the mark in 1/4 sec time steps.
This patch fixes a problem where 'the mark' is not being
updated because of faulty logic in the userspace log
daemon. When '--nosync' is used to create a cluster
mirror, the userspace log daemon never has a chance
to update the mark in the normal way. The fix is to set
the mark to "complete" if the mirror was created with
the --nosync flag.
---
cmirror/src/functions.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/cmirror/src/functions.c b/cmirror/src/functions.c
index 760a6d0..45dcbb3 100644
--- a/cmirror/src/functions.c
+++ b/cmirror/src/functions.c
@@ -1286,6 +1286,7 @@ static int clog_get_resync_work(struct clog_tfr *tfr)
LOG_SPRINT("GET - SEQ#=%u, UUID=%s, nodeid = %u:: "
"Resync work complete.",
tfr->seq, SHORT_UUID(lc->uuid), tfr->originator);
+ lc->sync_search = lc->region_count + 1;
return 0;
}
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=95…
Commit: 95d4db6c9a10517a7ed981be2271e5a602e0bcc2
Parent: 8e5bfda2ffd80ebfcdc00cadd503bfcfd5422276
Author: Jonathan Brassow <jbrassow(a)redhat.com>
AuthorDate: Mon Aug 30 15:54:38 2010 -0500
Committer: Jonathan Brassow <jbrassow(a)redhat.com>
CommitterDate: Mon Aug 30 15:54:38 2010 -0500
Fix potential cluster mirror corruption: 456575/471291
>From my inline comments:
* If the mirror was successfully recovered, we want to always
* force every machine to write to all devices - otherwise,
* corruption will occur. Here's how:
* Node1 suffers a failure and marks a region out-of-sync
* Node2 attempts a write, gets by is_remote_recovering,
* and queries the sync status of the region - finding
* it out-of-sync.
* Node2 thinks the write should be a nosync write, but it
* hasn't suffered the drive failure that Node1 has yet.
* It then issues a generic_make_request directly to
* the primary image only - which is exactly the device
* that has suffered the failure.
* Node2 suffers a lost write - which completely bypasses the
* mirror layer because it had gone through generic_m_r.
* The file system will likely explode at this point due to
* I/O errors. If it wasn't the primary that failed, it is
* easily possible in this case to issue writes to just one
* of the remaining images - also leaving the mirror inconsistent.
*
* We let in_sync() return 1 in a cluster regardless of what is
* in the bitmap once recovery has successfully completed on a
* mirror. This ensures the mirroring code will continue to
* attempt to write to all mirror images. The worst that can
* happen for reads is that additional read attempts may be
* taken.
---
cmirror/src/functions.c | 44 ++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 42 insertions(+), 2 deletions(-)
diff --git a/cmirror/src/functions.c b/cmirror/src/functions.c
index f7270a6..760a6d0 100644
--- a/cmirror/src/functions.c
+++ b/cmirror/src/functions.c
@@ -53,6 +53,7 @@ struct log_c {
time_t delay; /* limits how fast a resume can happen after suspend */
int touched;
+ int in_sync; /* An in-sync that stays set until suspend/resume */
uint32_t region_size;
uint32_t region_count;
uint64_t sync_count;
@@ -718,6 +719,7 @@ static int clog_resume(struct clog_tfr *tfr)
if (!lc)
return -EINVAL;
+ lc->in_sync = 0;
switch (lc->resume_override) {
case 1000:
LOG_ERROR("[%s] Additional resume issued before suspend",
@@ -971,6 +973,41 @@ static int clog_in_sync(struct clog_tfr *tfr)
return -EINVAL;
*rtn = log_test_bit(lc->sync_bits, region);
+
+ /*
+ * If the mirror was successfully recovered, we want to always
+ * force every machine to write to all devices - otherwise,
+ * corruption will occur. Here's how:
+ * Node1 suffers a failure and marks a region out-of-sync
+ * Node2 attempts a write, gets by is_remote_recovering,
+ * and queries the sync status of the region - finding
+ * it out-of-sync.
+ * Node2 thinks the write should be a nosync write, but it
+ * hasn't suffered the drive failure that Node1 has yet.
+ * It then issues a generic_make_request directly to
+ * the primary image only - which is exactly the device
+ * that has suffered the failure.
+ * Node2 suffers a lost write - which completely bypasses the
+ * mirror layer because it had gone through generic_m_r.
+ * The file system will likely explode at this point due to
+ * I/O errors. If it wasn't the primary that failed, it is
+ * easily possible in this case to issue writes to just one
+ * of the remaining images - also leaving the mirror inconsistent.
+ *
+ * We let in_sync() return 1 in a cluster regardless of what is
+ * in the bitmap once recovery has successfully completed on a
+ * mirror. This ensures the mirroring code will continue to
+ * attempt to write to all mirror images. The worst that can
+ * happen for reads is that additional read attempts may be
+ * taken.
+ *
+ * Futher investigation may be required to determine if there are
+ * similar possible outcomes when the mirror is in the process of
+ * recovering. In that case, lc->in_sync would not have been set
+ * yet.
+ */
+ if (!*rtn && lc->in_sync)
+ *rtn = 1;
if (*rtn)
LOG_DBG("[%s] Region is in-sync: %llu",
SHORT_UUID(lc->uuid), (unsigned long long)region);
@@ -1302,8 +1339,8 @@ static int clog_set_region_sync(struct clog_tfr *tfr)
lc->skip_bit_warning = lc->region_count;
if (pkg->region > (lc->skip_bit_warning + 5)) {
- LOG_ERROR("*** Region #%llu skipped during recovery ***",
- (unsigned long long)lc->skip_bit_warning);
+ LOG_SPRINT("*** Region #%llu skipped during recovery ***",
+ (unsigned long long)lc->skip_bit_warning);
lc->skip_bit_warning = lc->region_count;
#ifdef DEBUG
kill(getpid(), SIGUSR1);
@@ -1344,6 +1381,9 @@ static int clog_set_region_sync(struct clog_tfr *tfr)
"(lc->sync_count > lc->region_count) - this is bad",
tfr->seq, SHORT_UUID(lc->uuid), tfr->originator);
+ if (lc->sync_count == lc->region_count)
+ lc->in_sync = 1;
+
tfr->data_size = 0;
return 0;
}