drbd: New disk option al-updates
By disabling al-updates one might increase performace. The price for that is that in case a crashed primary (that had al-updates disabled) is reintegraded, it will receive a full-resync instead of a bitmap based resync. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
26ec92871b
commit
9a51ab1c1b
|
@ -276,8 +276,16 @@ void drbd_al_begin_io(struct drbd_conf *mdev, struct drbd_interval *i)
|
|||
/* Double check: it may have been committed by someone else,
|
||||
* while we have been waiting for the lock. */
|
||||
if (mdev->act_log->pending_changes) {
|
||||
al_write_transaction(mdev);
|
||||
mdev->al_writ_cnt++;
|
||||
bool write_al_updates;
|
||||
|
||||
rcu_read_lock();
|
||||
write_al_updates = rcu_dereference(mdev->ldev->disk_conf)->al_updates;
|
||||
rcu_read_unlock();
|
||||
|
||||
if (write_al_updates) {
|
||||
al_write_transaction(mdev);
|
||||
mdev->al_writ_cnt++;
|
||||
}
|
||||
|
||||
spin_lock_irq(&mdev->al_lock);
|
||||
/* FIXME
|
||||
|
|
|
@ -1230,6 +1230,11 @@ int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info)
|
|||
|
||||
mutex_unlock(&mdev->tconn->conf_update);
|
||||
|
||||
if (new_disk_conf->al_updates)
|
||||
mdev->ldev->md.flags &= MDF_AL_DISABLED;
|
||||
else
|
||||
mdev->ldev->md.flags |= MDF_AL_DISABLED;
|
||||
|
||||
drbd_bump_write_ordering(mdev->tconn, WO_bdev_flush);
|
||||
|
||||
drbd_md_sync(mdev);
|
||||
|
@ -1545,7 +1550,9 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info)
|
|||
} else if (dd == grew)
|
||||
set_bit(RESYNC_AFTER_NEG, &mdev->flags);
|
||||
|
||||
if (drbd_md_test_flag(mdev->ldev, MDF_FULL_SYNC)) {
|
||||
if (drbd_md_test_flag(mdev->ldev, MDF_FULL_SYNC) ||
|
||||
(test_bit(CRASHED_PRIMARY, &mdev->flags) &&
|
||||
drbd_md_test_flag(mdev->ldev, MDF_AL_DISABLED))) {
|
||||
dev_info(DEV, "Assuming that all blocks are out of sync "
|
||||
"(aka FullSync)\n");
|
||||
if (drbd_bitmap_io(mdev, &drbd_bmio_set_n_write,
|
||||
|
@ -1588,13 +1595,19 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info)
|
|||
if (ns.disk == D_CONSISTENT &&
|
||||
(ns.pdsk == D_OUTDATED || rcu_dereference(mdev->ldev->disk_conf)->fencing == FP_DONT_CARE))
|
||||
ns.disk = D_UP_TO_DATE;
|
||||
rcu_read_unlock();
|
||||
|
||||
/* All tests on MDF_PRIMARY_IND, MDF_CONNECTED_IND,
|
||||
MDF_CONSISTENT and MDF_WAS_UP_TO_DATE must happen before
|
||||
this point, because drbd_request_state() modifies these
|
||||
flags. */
|
||||
|
||||
if (rcu_dereference(mdev->ldev->disk_conf)->al_updates)
|
||||
mdev->ldev->md.flags &= MDF_AL_DISABLED;
|
||||
else
|
||||
mdev->ldev->md.flags |= MDF_AL_DISABLED;
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
/* In case we are C_CONNECTED postpone any decision on the new disk
|
||||
state after the negotiation phase. */
|
||||
if (mdev->state.conn == C_CONNECTED) {
|
||||
|
|
|
@ -338,6 +338,7 @@ extern const char *drbd_set_st_err_str(enum drbd_state_rv);
|
|||
#define MDF_PEER_OUT_DATED (1 << 5)
|
||||
#define MDF_CRASHED_PRIMARY (1 << 6)
|
||||
#define MDF_AL_CLEAN (1 << 7)
|
||||
#define MDF_AL_DISABLED (1 << 8)
|
||||
|
||||
enum drbd_uuid_index {
|
||||
UI_CURRENT,
|
||||
|
|
|
@ -130,6 +130,8 @@ GENL_struct(DRBD_NLA_DISK_CONF, 3, disk_conf,
|
|||
__flg_field_def(19, DRBD_GENLA_F_MANDATORY, md_flushes, DRBD_MD_FLUSHES_DEF)
|
||||
__u32_field_def(20, DRBD_GENLA_F_MANDATORY, disk_timeout, DRBD_DISK_TIMEOUT_DEF)
|
||||
__u32_field_def(21, 0 /* OPTIONAL */, read_balancing, DRBD_READ_BALANCING_DEF)
|
||||
/* 9: __u32_field_def(22, DRBD_GENLA_F_MANDATORY, unplug_watermark, DRBD_UNPLUG_WATERMARK_DEF) */
|
||||
__flg_field_def(23, 0 /* OPTIONAL */, al_updates, DRBD_AL_UPDATES_DEF)
|
||||
)
|
||||
|
||||
GENL_struct(DRBD_NLA_RESOURCE_OPTS, 4, res_opts,
|
||||
|
@ -168,6 +170,7 @@ GENL_struct(DRBD_NLA_NET_CONF, 5, net_conf,
|
|||
__flg_field_def(27, DRBD_GENLA_F_MANDATORY, always_asbp, DRBD_ALWAYS_ASBP_DEF)
|
||||
__flg_field(28, DRBD_GENLA_F_MANDATORY | DRBD_F_INVARIANT, tentative)
|
||||
__flg_field_def(29, DRBD_GENLA_F_MANDATORY, use_rle, DRBD_USE_RLE_DEF)
|
||||
/* 9: __u32_field_def(30, DRBD_GENLA_F_MANDATORY, fencing_policy, DRBD_FENCING_DEF) */
|
||||
)
|
||||
|
||||
GENL_struct(DRBD_NLA_SET_ROLE_PARMS, 6, set_role_parms,
|
||||
|
|
|
@ -210,6 +210,7 @@
|
|||
#define DRBD_DISK_DRAIN_DEF 1
|
||||
#define DRBD_MD_FLUSHES_DEF 1
|
||||
#define DRBD_TCP_CORK_DEF 1
|
||||
#define DRBD_AL_UPDATES_DEF 1
|
||||
|
||||
#define DRBD_ALLOW_TWO_PRIMARIES_DEF 0
|
||||
#define DRBD_ALWAYS_ASBP_DEF 0
|
||||
|
|
Loading…
Reference in a new issue