Below is the list of changes that have just been committed into a local
5.1 repository of marcsql. When marcsql does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2006-11-30 18:43:33-07:00, malff@weblab.(none) +5 -0
WL#3602
Post review changes
the --read-only option is not enforced for the slave thread in replication, or for the SUPER user.
mysql-test/r/rpl_read_only.result@stripped, 2006-11-30 18:43:30-07:00, malff@weblab.(none) +113 -0
New test
mysql-test/r/rpl_read_only.result@stripped, 2006-11-30 18:43:30-07:00, malff@weblab.(none) +0 -0
mysql-test/t/rpl_read_only-slave.opt@stripped, 2006-11-30 18:43:30-07:00, malff@weblab.(none) +1 -0
New test
mysql-test/t/rpl_read_only-slave.opt@stripped, 2006-11-30 18:43:30-07:00, malff@weblab.(none) +0 -0
mysql-test/t/rpl_read_only.test@stripped, 2006-11-30 18:43:30-07:00, malff@weblab.(none) +105 -0
New test
mysql-test/t/rpl_read_only.test@stripped, 2006-11-30 18:43:30-07:00, malff@weblab.(none) +0 -0
sql/handler.cc@stripped, 2006-11-30 18:43:30-07:00, malff@weblab.(none) +5 -1
Post review changes
Allowing writes for the slave thread or for SUPER, in read-only mode
sql/lock.cc@stripped, 2006-11-30 18:43:30-07:00, malff@weblab.(none) +5 -1
Post review changes
Allowing writes for the slave thread or for SUPER, in read-only mode
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: malff
# Host: weblab.(none)
# Root: /home/marcsql/TREE/mysql-5.1-11733_topdown
--- 1.279/sql/handler.cc 2006-11-30 18:43:40 -07:00
+++ 1.280/sql/handler.cc 2006-11-30 18:43:40 -07:00
@@ -693,7 +693,11 @@ int ha_commit_trans(THD *thd, bool all)
DBUG_RETURN(1);
}
- if (is_real_trans && opt_readonly)
+ if ( is_real_trans
+ && opt_readonly
+ && ! (thd->security_ctx->master_access & SUPER_ACL)
+ && ! thd->slave_thread
+ )
{
my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only");
ha_rollback_trans(thd, all);
--- 1.99/sql/lock.cc 2006-11-30 18:43:40 -07:00
+++ 1.100/sql/lock.cc 2006-11-30 18:43:40 -07:00
@@ -151,7 +151,11 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd,
}
}
- if (write_lock_used && opt_readonly)
+ if ( write_lock_used
+ && opt_readonly
+ && ! (thd->security_ctx->master_access & SUPER_ACL)
+ && ! thd->slave_thread
+ )
{
/*
Someone has issued SET GLOBAL READ_ONLY=1 and we want a write lock.
--- New file ---
+++ mysql-test/r/rpl_read_only.result 06/11/30 18:43:30
stop slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
create table t1(a int) engine=InnoDB;
create table t2(a int) engine=MyISAM;
insert into t1 values(1001);
insert into t2 values(2001);
set global read_only=1;
select @@read_only;
@@read_only
1
select * from t1;
a
1001
select * from t2;
a
2001
select @@read_only;
@@read_only
0
select * from t1;
a
1001
select * from t2;
a
2001
set global read_only=0;
BEGIN;
insert into t1 values(1002);
insert into t2 values(2002);
BEGIN;
insert into t1 values(1003);
insert into t2 values(2003);
set global read_only=1;
COMMIT;
COMMIT;
ERROR HY000: The MySQL server is running with the --read-only option so it cannot execute this statement
set global read_only=0;
insert into t1 values(1004);
insert into t2 values(2004);
select * from t1;
a
1001
1002
1004
select * from t2;
a
2001
2002
2003
2004
select * from t1;
a
1001
1002
1004
select * from t2;
a
2001
2002
2003
2004
set global read_only=1;
select @@read_only;
@@read_only
1
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
show create table t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
insert into t1 values(1005);
insert into t2 values(2005);
select * from t1;
a
1001
1002
1004
1005
select * from t2;
a
2001
2002
2003
2004
2005
select * from t1;
a
1001
1002
1004
1005
select * from t2;
a
2001
2002
2003
2004
2005
insert into t1 values(1006);
ERROR HY000: The MySQL server is running with the --read-only option so it cannot execute this statement
insert into t2 values(2006);
ERROR HY000: The MySQL server is running with the --read-only option so it cannot execute this statement
drop table t1;
drop table t2;
--- New file ---
+++ mysql-test/t/rpl_read_only-slave.opt 06/11/30 18:43:30
--innodb
--- New file ---
+++ mysql-test/t/rpl_read_only.test 06/11/30 18:43:30
# Test case for BUG #11733
-- source include/master-slave.inc
-- source include/have_innodb.inc
# Setting the master readonly :
# - the variable @@readonly is not replicated on the slave
connect (master2,127.0.0.1,test,,test,$MASTER_MYPORT,);
connect (slave2,127.0.0.1,test,,test,$SLAVE_MYPORT,);
connection master1;
create table t1(a int) engine=InnoDB;
create table t2(a int) engine=MyISAM;
insert into t1 values(1001);
insert into t2 values(2001);
connection master;
set global read_only=1;
connection master1;
select @@read_only;
select * from t1;
select * from t2;
sync_slave_with_master;
select @@read_only;
select * from t1;
select * from t2;
# - replication of transactions
connection master;
set global read_only=0;
connection master1;
BEGIN;
insert into t1 values(1002);
insert into t2 values(2002);
connection master2;
BEGIN;
insert into t1 values(1003);
insert into t2 values(2003);
connection master;
set global read_only=1;
connection master1;
## works even with read_only=1, because master1 is root
COMMIT;
connection master2;
--error ER_OPTION_PREVENTS_STATEMENT
COMMIT;
connection master;
set global read_only=0;
connection master1;
insert into t1 values(1004);
insert into t2 values(2004);
select * from t1;
select * from t2;
sync_slave_with_master;
select * from t1;
select * from t2;
# Setting the slave readonly : replication will pass
#
connection slave1;
set global read_only=1;
connection slave;
select @@read_only;
# Make sure the replicated table is also transactional
show create table t1;
# Make sure the replicated table is not transactional
show create table t2;
connection master;
insert into t1 values(1005);
insert into t2 values(2005);
select * from t1;
select * from t2;
sync_slave_with_master;
connection slave;
select * from t1;
select * from t2;
# Non root user can not write on the slave
connection slave2;
--error ER_OPTION_PREVENTS_STATEMENT
insert into t1 values(1006);
--error ER_OPTION_PREVENTS_STATEMENT
insert into t2 values(2006);
## Cleanup
connection master;
drop table t1;
drop table t2;
sync_slave_with_master;
| Thread |
|---|
| • bk commit into 5.1 tree (malff:1.2378) | marc.alff | 1 Dec |