Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
6be30eec
Commit
6be30eec
authored
Mar 09, 2007
by
mjorgensen@production.mysql.com
Browse files
Options
Browse Files
Download
Plain Diff
Merge bk-internal:/home/bk/mysql-5.0
into production.mysql.com:/usersnfs/mjorgensen/bktrees/mysql-5.0-build
parents
e10d74cf
6cb0c79c
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
363 additions
and
205 deletions
+363
-205
mysql-test/r/ndb_single_user.result
mysql-test/r/ndb_single_user.result
+46
-0
mysql-test/t/ndb_single_user.test
mysql-test/t/ndb_single_user.test
+84
-0
ndb/src/kernel/blocks/dbdict/Dbdict.cpp
ndb/src/kernel/blocks/dbdict/Dbdict.cpp
+21
-15
ndb/src/kernel/blocks/dbdict/Dbdict.hpp
ndb/src/kernel/blocks/dbdict/Dbdict.hpp
+2
-0
ndb/src/ndbapi/NdbDictionaryImpl.cpp
ndb/src/ndbapi/NdbDictionaryImpl.cpp
+4
-0
ndb/src/ndbapi/NdbRecAttr.cpp
ndb/src/ndbapi/NdbRecAttr.cpp
+193
-189
ndb/src/ndbapi/ndberror.c
ndb/src/ndbapi/ndberror.c
+2
-0
ndb/tools/waiter.cpp
ndb/tools/waiter.cpp
+11
-1
No files found.
mysql-test/r/ndb_single_user.result
0 → 100644
View file @
6be30eec
use test;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
create table t1 (a int key, b int unique, c int) engine ndb;
ERROR HY000: Can't create table './test/t1.frm' (errno: 155)
create table t1 (a int key, b int unique, c int) engine ndb;
insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0);
create table t2 as select * from t1;
select * from t1 where a = 1;
a b c
1 1 0
select * from t1 where b = 4;
a b c
4 4 0
select * from t1 where a > 4 order by a;
a b c
5 5 0
6 6 0
7 7 0
8 8 0
9 9 0
10 10 0
update t1 set b=102 where a = 2;
update t1 set b=103 where b = 3;
update t1 set b=b+100;
update t1 set b=b+100 where a > 7;
delete from t1;
insert into t1 select * from t2;
drop table t1;
ERROR 42S02: Unknown table 't1'
create index new_index on t1 (c);
ERROR 42S02: Table 'test.t1' doesn't exist
insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0);
ERROR 42S02: Table 'test.t1' doesn't exist
select * from t1 where a = 1;
ERROR 42S02: Table 'test.t1' doesn't exist
select * from t1 where b = 4;
ERROR 42S02: Table 'test.t1' doesn't exist
update t1 set b=102 where a = 2;
ERROR 42S02: Table 'test.t1' doesn't exist
update t1 set b=103 where b = 3;
ERROR 42S02: Table 'test.t1' doesn't exist
update t1 set b=b+100;
ERROR 42S02: Table 'test.t1' doesn't exist
update t1 set b=b+100 where a > 7;
ERROR 42S02: Table 'test.t1' doesn't exist
drop table t1;
mysql-test/t/ndb_single_user.test
0 → 100644
View file @
6be30eec
--
source
include
/
have_ndb
.
inc
--
source
include
/
have_multi_ndb
.
inc
--
source
include
/
ndb_default_cluster
.
inc
--
source
include
/
not_embedded
.
inc
--
disable_warnings
use
test
;
drop
table
if
exists
t1
,
t2
,
t3
,
t4
,
t5
,
t6
,
t7
,
t8
,
t9
,
t10
;
--
enable_warnings
# operations allowed while cluster is in single user mode
--
connection
server1
--
let
$node_id
=
`SHOW STATUS LIKE 'Ndb_cluster_node_id'`
--
disable_query_log
--
eval
set
@
node_id
=
SUBSTRING
(
'$node_id'
,
20
)
+
0
--
enable_query_log
--
let
$node_id
=
`SELECT @node_id`
--
exec
$NDB_MGM
--
no
-
defaults
--
ndb
-
connectstring
=
"localhost:
$NDBCLUSTER_PORT
"
-
e
"enter single user mode
$node_id
"
>>
$NDB_TOOLS_OUTPUT
--
exec
$NDB_TOOLS_DIR
/
ndb_waiter
--
no
-
defaults
--
ndb
-
connectstring
=
"localhost:
$NDBCLUSTER_PORT
"
--
single
-
user
>>
$NDB_TOOLS_OUTPUT
# verify that we are indeed in single user mode
--
connection
server2
--
error
1005
create
table
t1
(
a
int
key
,
b
int
unique
,
c
int
)
engine
ndb
;
# test some sql on first mysqld
--
connection
server1
create
table
t1
(
a
int
key
,
b
int
unique
,
c
int
)
engine
ndb
;
insert
into
t1
values
(
1
,
1
,
0
),(
2
,
2
,
0
),(
3
,
3
,
0
),(
4
,
4
,
0
),(
5
,
5
,
0
),(
6
,
6
,
0
),(
7
,
7
,
0
),(
8
,
8
,
0
),(
9
,
9
,
0
),(
10
,
10
,
0
);
create
table
t2
as
select
*
from
t1
;
# read with pk
select
*
from
t1
where
a
=
1
;
# read with unique index
select
*
from
t1
where
b
=
4
;
# read with ordered index
select
*
from
t1
where
a
>
4
order
by
a
;
# update with pk
update
t1
set
b
=
102
where
a
=
2
;
# update with unique index
update
t1
set
b
=
103
where
b
=
3
;
# update with full table scan
update
t1
set
b
=
b
+
100
;
# update with ordered insex scan
update
t1
set
b
=
b
+
100
where
a
>
7
;
# delete with full table scan
delete
from
t1
;
insert
into
t1
select
*
from
t2
;
# test some sql on other mysqld
--
connection
server2
--
error
1051
drop
table
t1
;
--
error
1146
#--error 1296
create
index
new_index
on
t1
(
c
);
--
error
1146
#--error 1296
insert
into
t1
values
(
1
,
1
,
0
),(
2
,
2
,
0
),(
3
,
3
,
0
),(
4
,
4
,
0
),(
5
,
5
,
0
),(
6
,
6
,
0
),(
7
,
7
,
0
),(
8
,
8
,
0
),(
9
,
9
,
0
),(
10
,
10
,
0
);
--
error
1146
#--error 1296
select
*
from
t1
where
a
=
1
;
--
error
1146
#--error 1296
select
*
from
t1
where
b
=
4
;
--
error
1146
#--error 1296
update
t1
set
b
=
102
where
a
=
2
;
--
error
1146
#--error 1296
update
t1
set
b
=
103
where
b
=
3
;
--
error
1146
#--error 1296
update
t1
set
b
=
b
+
100
;
--
error
1146
#--error 1296
update
t1
set
b
=
b
+
100
where
a
>
7
;
--
exec
$NDB_MGM
--
no
-
defaults
--
ndb
-
connectstring
=
"localhost:
$NDBCLUSTER_PORT
"
-
e
"exit single user mode"
>>
$NDB_TOOLS_OUTPUT
--
exec
$NDB_TOOLS_DIR
/
ndb_waiter
--
no
-
defaults
>>
$NDB_TOOLS_OUTPUT
# cleanup
--
connection
server1
drop
table
t1
;
ndb/src/kernel/blocks/dbdict/Dbdict.cpp
View file @
6be30eec
...
...
@@ -2910,9 +2910,7 @@ Dbdict::execCREATE_TABLE_REQ(Signal* signal){
break
;
}
if
(
getNodeState
().
getSingleUserMode
()
&&
(
refToNode
(
signal
->
getSendersBlockRef
())
!=
getNodeState
().
getSingleUserApi
()))
if
(
checkSingleUserMode
(
signal
->
getSendersBlockRef
()))
{
jam
();
parseRecord
.
errorCode
=
CreateTableRef
::
SingleUser
;
...
...
@@ -3081,9 +3079,7 @@ Dbdict::execALTER_TABLE_REQ(Signal* signal)
return
;
}
if
(
getNodeState
().
getSingleUserMode
()
&&
(
refToNode
(
signal
->
getSendersBlockRef
())
!=
getNodeState
().
getSingleUserApi
()))
if
(
checkSingleUserMode
(
signal
->
getSendersBlockRef
()))
{
jam
();
alterTableRef
(
signal
,
req
,
AlterTableRef
::
SingleUser
);
...
...
@@ -5414,9 +5410,7 @@ Dbdict::execDROP_TABLE_REQ(Signal* signal){
return
;
}
if
(
getNodeState
().
getSingleUserMode
()
&&
(
refToNode
(
signal
->
getSendersBlockRef
())
!=
getNodeState
().
getSingleUserApi
()))
if
(
checkSingleUserMode
(
signal
->
getSendersBlockRef
()))
{
jam
();
dropTableRef
(
signal
,
req
,
DropTableRef
::
SingleUser
);
...
...
@@ -6553,9 +6547,7 @@ Dbdict::execCREATE_INDX_REQ(Signal* signal)
jam
();
tmperr
=
CreateIndxRef
::
Busy
;
}
else
if
(
getNodeState
().
getSingleUserMode
()
&&
(
refToNode
(
senderRef
)
!=
getNodeState
().
getSingleUserApi
()))
else
if
(
checkSingleUserMode
(
senderRef
))
{
jam
();
tmperr
=
CreateIndxRef
::
SingleUser
;
...
...
@@ -7130,9 +7122,7 @@ Dbdict::execDROP_INDX_REQ(Signal* signal)
jam
();
tmperr
=
DropIndxRef
::
Busy
;
}
else
if
(
getNodeState
().
getSingleUserMode
()
&&
(
refToNode
(
senderRef
)
!=
getNodeState
().
getSingleUserApi
()))
else
if
(
checkSingleUserMode
(
senderRef
))
{
jam
();
tmperr
=
DropIndxRef
::
SingleUser
;
...
...
@@ -10574,4 +10564,20 @@ Dbdict::getMetaAttribute(MetaData::Attribute& attr, const MetaData::Table& table
return
0
;
}
/*
return 1 if all of the below is true
a) node in single user mode
b) senderRef is not a db node
c) senderRef nodeid is not the singleUserApi
*/
int
Dbdict
::
checkSingleUserMode
(
Uint32
senderRef
)
{
Uint32
nodeId
=
refToNode
(
senderRef
);
return
getNodeState
().
getSingleUserMode
()
&&
(
getNodeInfo
(
nodeId
).
m_type
!=
NodeInfo
::
DB
)
&&
(
nodeId
!=
getNodeState
().
getSingleUserApi
());
}
CArray
<
KeyDescriptor
>
g_key_descriptor_pool
;
ndb/src/kernel/blocks/dbdict/Dbdict.hpp
View file @
6be30eec
...
...
@@ -2003,6 +2003,8 @@ private:
int
getMetaTable
(
MetaData
::
Table
&
table
,
const
char
*
tableName
);
int
getMetaAttribute
(
MetaData
::
Attribute
&
attribute
,
const
MetaData
::
Table
&
table
,
Uint32
attributeId
);
int
getMetaAttribute
(
MetaData
::
Attribute
&
attribute
,
const
MetaData
::
Table
&
table
,
const
char
*
attributeName
);
int
checkSingleUserMode
(
Uint32
senderRef
);
};
#endif
ndb/src/ndbapi/NdbDictionaryImpl.cpp
View file @
6be30eec
...
...
@@ -880,6 +880,7 @@ NdbDictInterface::dictSignal(NdbApiSignal* signal,
r
=
m_transporter
->
sendSignal
(
signal
,
aNodeId
);
}
if
(
r
!=
0
){
m_error
.
code
=
4007
;
m_transporter
->
unlock_mutex
();
continue
;
}
...
...
@@ -903,7 +904,10 @@ NdbDictInterface::dictSignal(NdbApiSignal* signal,
* Handle error codes
*/
if
(
m_waiter
.
m_state
==
WAIT_NODE_FAILURE
)
{
m_error
.
code
=
4013
;
continue
;
}
if
(
m_waiter
.
m_state
==
WST_WAIT_TIMEOUT
)
{
...
...
ndb/src/ndbapi/NdbRecAttr.cpp
View file @
6be30eec
...
...
@@ -55,7 +55,7 @@ NdbRecAttr::setup(const NdbColumnImpl* anAttrInfo, char* aValue)
if
(
theStorageX
)
delete
[]
theStorageX
;
// check alignment to signal data
// a future version could check alignment per data type as well
...
...
@@ -181,7 +181,7 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
out
<<
"[NULL]"
;
return
out
;
}
const
NdbDictionary
::
Column
*
c
=
r
.
getColumn
();
uint
length
=
c
->
getLength
();
if
(
length
>
1
)
...
...
@@ -192,196 +192,200 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
if
(
j
>
0
)
out
<<
" "
;
switch
(
r
.
getType
())
{
case
NdbDictionary
:
:
Column
::
Bigunsigned
:
out
<<
r
.
u_64_value
();
break
;
case
NdbDictionary
:
:
Column
::
Bit
:
out
<<
hex
<<
"H'"
<<
r
.
u_32_value
()
<<
dec
;
break
;
case
NdbDictionary
:
:
Column
::
Unsigned
:
out
<<
r
.
u_32_value
();
break
;
case
NdbDictionary
:
:
Column
::
Smallunsigned
:
out
<<
r
.
u_short_value
();
break
;
case
NdbDictionary
:
:
Column
::
Tinyunsigned
:
out
<<
(
unsigned
)
r
.
u_char_value
();
break
;
case
NdbDictionary
:
:
Column
::
Bigint
:
out
<<
r
.
int64_value
();
break
;
case
NdbDictionary
:
:
Column
::
Int
:
out
<<
r
.
int32_value
();
break
;
case
NdbDictionary
:
:
Column
::
Smallint
:
out
<<
r
.
short_value
();
break
;
case
NdbDictionary
:
:
Column
::
Tinyint
:
out
<<
(
int
)
r
.
char_value
();
break
;
case
NdbDictionary
:
:
Column
::
Binary
:
ndbrecattr_print_string
(
out
,
"Binary"
,
r
.
aRef
(),
r
.
arraySize
());
j
=
r
.
arraySize
();
break
;
case
NdbDictionary
:
:
Column
::
Char
:
ndbrecattr_print_string
(
out
,
"Char"
,
r
.
aRef
(),
r
.
arraySize
());
j
=
length
;
break
;
case
NdbDictionary
:
:
Column
::
Varchar
:
{
unsigned
len
=
*
(
const
unsigned
char
*
)
r
.
aRef
();
ndbrecattr_print_string
(
out
,
"Varchar"
,
r
.
aRef
()
+
1
,
len
);
j
=
length
;
}
break
;
case
NdbDictionary
:
:
Column
::
Varbinary
:
{
unsigned
len
=
*
(
const
unsigned
char
*
)
r
.
aRef
();
ndbrecattr_print_string
(
out
,
"Varbinary"
,
r
.
aRef
()
+
1
,
len
);
j
=
length
;
}
break
;
case
NdbDictionary
:
:
Column
::
Float
:
out
<<
r
.
float_value
();
break
;
case
NdbDictionary
:
:
Column
::
Double
:
out
<<
r
.
double_value
();
break
;
case
NdbDictionary
:
:
Column
::
Olddecimal
:
{
short
len
=
1
+
c
->
getPrecision
()
+
(
c
->
getScale
()
>
0
);
out
.
print
(
"%.*s"
,
len
,
r
.
aRef
());
}
break
;
case
NdbDictionary
:
:
Column
::
Olddecimalunsigned
:
{
short
len
=
0
+
c
->
getPrecision
()
+
(
c
->
getScale
()
>
0
);
out
.
print
(
"%.*s"
,
len
,
r
.
aRef
());
}
break
;
case
NdbDictionary
:
:
Column
::
Decimal
:
case
NdbDictionary
:
:
Column
::
Decimalunsigned
:
goto
unknown
;
// TODO
break
;
// for dates cut-and-paste from field.cc
case
NdbDictionary
:
:
Column
::
Datetime
:
{
ulonglong
tmp
=
r
.
u_64_value
();
long
part1
,
part2
,
part3
;
part1
=
(
long
)
(
tmp
/
LL
(
1000000
));
part2
=
(
long
)
(
tmp
-
(
ulonglong
)
part1
*
LL
(
1000000
));
char
buf
[
40
];
char
*
pos
=
(
char
*
)
buf
+
19
;
*
pos
--=
0
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part2
%
10
));
part2
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part2
%
10
));
part3
=
(
int
)
(
part2
/
10
);
*
pos
--=
':'
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part3
%
10
));
part3
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part3
%
10
));
part3
/=
10
;
*
pos
--=
':'
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part3
%
10
));
part3
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
part3
);
*
pos
--=
'/'
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part1
%
10
));
part1
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part1
%
10
));
part1
/=
10
;
*
pos
--=
'-'
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part1
%
10
));
part1
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part1
%
10
));
part3
=
(
int
)
(
part1
/
10
);
*
pos
--=
'-'
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part3
%
10
));
part3
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part3
%
10
));
part3
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part3
%
10
));
part3
/=
10
;
*
pos
=
(
char
)
(
'0'
+
(
char
)
part3
);
out
<<
buf
;
}
break
;
case
NdbDictionary
:
:
Column
::
Date
:
{
uint32
tmp
=
(
uint32
)
uint3korr
(
r
.
aRef
());
int
part
;
char
buf
[
40
];
char
*
pos
=
(
char
*
)
buf
+
10
;
*
pos
--=
0
;
part
=
(
int
)
(
tmp
&
31
);
*
pos
--=
(
char
)
(
'0'
+
part
%
10
);
*
pos
--=
(
char
)
(
'0'
+
part
/
10
);
*
pos
--=
'-'
;
part
=
(
int
)
(
tmp
>>
5
&
15
);
*
pos
--=
(
char
)
(
'0'
+
part
%
10
);
*
pos
--=
(
char
)
(
'0'
+
part
/
10
);
*
pos
--=
'-'
;
part
=
(
int
)
(
tmp
>>
9
);
*
pos
--=
(
char
)
(
'0'
+
part
%
10
);
part
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
part
%
10
);
part
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
part
%
10
);
part
/=
10
;
*
pos
=
(
char
)
(
'0'
+
part
);
out
<<
buf
;
}
break
;
case
NdbDictionary
:
:
Column
::
Time
:
{
long
tmp
=
(
long
)
sint3korr
(
r
.
aRef
());
int
hour
=
(
uint
)
(
tmp
/
10000
);
int
minute
=
(
uint
)
(
tmp
/
100
%
100
);
int
second
=
(
uint
)
(
tmp
%
100
);
char
buf
[
40
];
sprintf
(
buf
,
"%02d:%02d:%02d"
,
hour
,
minute
,
second
);
out
<<
buf
;
}
break
;
case
NdbDictionary
:
:
Column
::
Year
:
{
uint
year
=
1900
+
r
.
u_char_value
();
char
buf
[
40
];
sprintf
(
buf
,
"%04d"
,
year
);
out
<<
buf
;
}
break
;
case
NdbDictionary
:
:
Column
::
Timestamp
:
{
time_t
time
=
r
.
u_32_value
();
out
<<
(
uint
)
time
;
}
break
;
case
NdbDictionary
:
:
Column
::
Blob
:
case
NdbDictionary
:
:
Column
::
Text
:
{
// user defined aRef() may not be aligned to Uint64
NdbBlob
::
Head
head
;
memcpy
(
&
head
,
r
.
aRef
(),
sizeof
(
head
));
out
<<
head
.
length
<<
":"
;
const
unsigned
char
*
p
=
(
const
unsigned
char
*
)
r
.
aRef
()
+
sizeof
(
head
);
if
(
r
.
arraySize
()
<
sizeof
(
head
))
out
<<
"***error***"
;
// really cannot happen
else
{
unsigned
n
=
r
.
arraySize
()
-
sizeof
(
head
);
for
(
unsigned
k
=
0
;
k
<
n
&&
k
<
head
.
length
;
k
++
)
{
if
(
r
.
getType
()
==
NdbDictionary
::
Column
::
Blob
)
out
.
print
(
"%02X"
,
(
int
)
p
[
k
]);
else
out
.
print
(
"%c"
,
(
int
)
p
[
k
]);
}
}
j
=
length
;
}
switch
(
r
.
getType
()){
case
NdbDictionary
:
:
Column
::
Bigunsigned
:
out
<<
r
.
u_64_value
();
break
;
case
NdbDictionary
:
:
Column
::
Bit
:
out
<<
hex
<<
"H'"
<<
r
.
u_32_value
()
<<
dec
;
break
;
case
NdbDictionary
:
:
Column
::
Unsigned
:
out
<<
r
.
u_32_value
();
break
;
case
NdbDictionary
:
:
Column
::
Smallunsigned
:
out
<<
r
.
u_short_value
();
break
;
case
NdbDictionary
:
:
Column
::
Tinyunsigned
:
out
<<
(
unsigned
)
r
.
u_char_value
();
break
;
case
NdbDictionary
:
:
Column
::
Bigint
:
out
<<
r
.
int64_value
();
break
;
case
NdbDictionary
:
:
Column
::
Int
:
out
<<
r
.
int32_value
();
break
;
case
NdbDictionary
:
:
Column
::
Longvarchar
:
{
unsigned
len
=
uint2korr
(
r
.
aRef
());
ndbrecattr_print_string
(
out
,
"Longvarchar"
,
r
.
aRef
()
+
2
,
len
);
j
=
length
;
case
NdbDictionary
:
:
Column
::
Smallint
:
out
<<
r
.
short_value
();
break
;
case
NdbDictionary
:
:
Column
::
Tinyint
:
out
<<
(
int
)
r
.
char_value
();
break
;
case
NdbDictionary
:
:
Column
::
Binary
:
j
=
r
.
arraySize
();
ndbrecattr_print_string
(
out
,
"Binary"
,
r
.
aRef
(),
j
);
break
;
case
NdbDictionary
:
:
Column
::
Char
:
j
=
length
;
ndbrecattr_print_string
(
out
,
"Char"
,
r
.
aRef
(),
r
.
arraySize
());
break
;
case
NdbDictionary
:
:
Column
::
Varchar
:
{
unsigned
len
=
*
(
const
unsigned
char
*
)
r
.
aRef
();
ndbrecattr_print_string
(
out
,
"Varchar"
,
r
.
aRef
()
+
1
,
len
);
j
=
length
;
}
break
;
case
NdbDictionary
:
:
Column
::
Varbinary
:
{
unsigned
len
=
*
(
const
unsigned
char
*
)
r
.
aRef
();
ndbrecattr_print_string
(
out
,
"Varbinary"
,
r
.
aRef
()
+
1
,
len
);
j
=
length
;
}
break
;
case
NdbDictionary
:
:
Column
::
Float
:
out
<<
r
.
float_value
();
break
;
case
NdbDictionary
:
:
Column
::
Double
:
out
<<
r
.
double_value
();
break
;
case
NdbDictionary
:
:
Column
::
Olddecimal
:
{
short
len
=
1
+
c
->
getPrecision
()
+
(
c
->
getScale
()
>
0
);
out
.
print
(
"%.*s"
,
len
,
r
.
aRef
());
}
break
;
case
NdbDictionary
:
:
Column
::
Olddecimalunsigned
:
{
short
len
=
0
+
c
->
getPrecision
()
+
(
c
->
getScale
()
>
0
);
out
.
print
(
"%.*s"
,
len
,
r
.
aRef
());
}
break
;
case
NdbDictionary
:
:
Column
::
Decimal
:
case
NdbDictionary
:
:
Column
::
Decimalunsigned
:
goto
unknown
;
// TODO
break
;
// for dates cut-and-paste from field.cc
case
NdbDictionary
:
:
Column
::
Datetime
:
{
ulonglong
tmp
=
r
.
u_64_value
();
long
part1
,
part2
,
part3
;
part1
=
(
long
)
(
tmp
/
LL
(
1000000
));
part2
=
(
long
)
(
tmp
-
(
ulonglong
)
part1
*
LL
(
1000000
));
char
buf
[
40
];
char
*
pos
=
(
char
*
)
buf
+
19
;
*
pos
--=
0
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part2
%
10
));
part2
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part2
%
10
));
part3
=
(
int
)
(
part2
/
10
);
*
pos
--=
':'
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part3
%
10
));
part3
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part3
%
10
));
part3
/=
10
;
*
pos
--=
':'
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part3
%
10
));
part3
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
part3
);
*
pos
--=
'/'
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part1
%
10
));
part1
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part1
%
10
));
part1
/=
10
;
*
pos
--=
'-'
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part1
%
10
));
part1
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part1
%
10
));
part3
=
(
int
)
(
part1
/
10
);
*
pos
--=
'-'
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part3
%
10
));
part3
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part3
%
10
));
part3
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
(
char
)
(
part3
%
10
));
part3
/=
10
;
*
pos
=
(
char
)
(
'0'
+
(
char
)
part3
);
out
<<
buf
;
}
break
;
case
NdbDictionary
:
:
Column
::
Date
:
{
uint32
tmp
=
(
uint32
)
uint3korr
(
r
.
aRef
());
int
part
;
char
buf
[
40
];
char
*
pos
=
(
char
*
)
buf
+
10
;
*
pos
--=
0
;
part
=
(
int
)
(
tmp
&
31
);
*
pos
--=
(
char
)
(
'0'
+
part
%
10
);
*
pos
--=
(
char
)
(
'0'
+
part
/
10
);
*
pos
--=
'-'
;
part
=
(
int
)
(
tmp
>>
5
&
15
);
*
pos
--=
(
char
)
(
'0'
+
part
%
10
);
*
pos
--=
(
char
)
(
'0'
+
part
/
10
);
*
pos
--=
'-'
;
part
=
(
int
)
(
tmp
>>
9
);
*
pos
--=
(
char
)
(
'0'
+
part
%
10
);
part
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
part
%
10
);
part
/=
10
;
*
pos
--=
(
char
)
(
'0'
+
part
%
10
);
part
/=
10
;
*
pos
=
(
char
)
(
'0'
+
part
);
out
<<
buf
;
}
break
;
case
NdbDictionary
:
:
Column
::
Time
:
{
long
tmp
=
(
long
)
sint3korr
(
r
.
aRef
());
int
hour
=
(
uint
)
(
tmp
/
10000
);
int
minute
=
(
uint
)
(
tmp
/
100
%
100
);
int
second
=
(
uint
)
(
tmp
%
100
);
char
buf
[
40
];
sprintf
(
buf
,
"%02d:%02d:%02d"
,
hour
,
minute
,
second
);
out
<<
buf
;
}
break
;
case
NdbDictionary
:
:
Column
::
Year
:
{
uint
year
=
1900
+
r
.
u_char_value
();
char
buf
[
40
];
sprintf
(
buf
,
"%04d"
,
year
);
out
<<
buf
;
}
break
;
case
NdbDictionary
:
:
Column
::
Timestamp
:
{
time_t
time
=
r
.
u_32_value
();
out
<<
(
uint
)
time
;
}
break
;
case
NdbDictionary
:
:
Column
::
Blob
:
case
NdbDictionary
:
:
Column
::
Text
:
{
// user defined aRef() may not be aligned to Uint64
NdbBlob
::
Head
head
;
memcpy
(
&
head
,
r
.
aRef
(),
sizeof
(
head
));
out
<<
head
.
length
<<
":"
;
const
unsigned
char
*
p
=
(
const
unsigned
char
*
)
r
.
aRef
()
+
sizeof
(
head
);
if
(
r
.
arraySize
()
<
sizeof
(
head
))
out
<<
"***error***"
;
// really cannot happen
else
{
unsigned
n
=
r
.
arraySize
()
-
sizeof
(
head
);
for
(
unsigned
k
=
0
;
k
<
n
&&
k
<
head
.
length
;
k
++
)
{
if
(
r
.
getType
()
==
NdbDictionary
::
Column
::
Blob
)
out
.
print
(
"%02X"
,
(
int
)
p
[
k
]);
else
out
.
print
(
"%c"
,
(
int
)
p
[
k
]);
}
break
;
unknown:
default:
/* no print functions for the rest, just print type */
out
<<
(
int
)
r
.
getType
();
j
=
length
;
if
(
j
>
1
)
out
<<
" "
<<
j
<<
" times"
;
break
;
}
j
=
length
;
}
break
;
case
NdbDictionary
:
:
Column
::
Longvarchar
:
{
unsigned
len
=
uint2korr
(
r
.
aRef
());
ndbrecattr_print_string
(
out
,
"Longvarchar"
,
r
.
aRef
()
+
2
,
len
);
j
=
length
;
}
break
;
case
NdbDictionary
:
:
Column
::
Undefined
:
case
NdbDictionary
:
:
Column
::
Mediumint
:
case
NdbDictionary
:
:
Column
::
Mediumunsigned
:
case
NdbDictionary
:
:
Column
::
Longvarbinary
:
unknown:
//default: /* no print functions for the rest, just print type */
out
<<
(
int
)
r
.
getType
();
j
=
length
;
if
(
j
>
1
)
out
<<
" "
<<
j
<<
" times"
;
break
;
}
}
if
(
length
>
1
)
...
...
ndb/src/ndbapi/ndberror.c
View file @
6be30eec
...
...
@@ -137,10 +137,12 @@ ErrorBundle ErrorCodes[] = {
/**
* Unknown result
*/
{
4007
,
UR
,
"Send to ndbd node failed"
},
{
4008
,
UR
,
"Receive from NDB failed"
},
{
4009
,
UR
,
"Cluster Failure"
},
{
4012
,
UR
,
"Request ndbd time-out, maybe due to high load or communication problems"
},
{
4013
,
UR
,
"Request timed out in waiting for node failure"
},
{
4024
,
UR
,
"Time-out, most likely caused by simple read or cluster failure"
},
...
...
ndb/tools/waiter.cpp
View file @
6be30eec
...
...
@@ -30,12 +30,14 @@ waitClusterStatus(const char* _addr, ndb_mgm_node_status _status,
unsigned
int
_timeout
);
enum
ndb_waiter_options
{
OPT_WAIT_STATUS_NOT_STARTED
=
NDB_STD_OPTIONS_LAST
OPT_WAIT_STATUS_NOT_STARTED
=
NDB_STD_OPTIONS_LAST
,
OPT_WAIT_STATUS_SINGLE_USER
};
NDB_STD_OPTS_VARS
;
static
int
_no_contact
=
0
;
static
int
_not_started
=
0
;
static
int
_single_user
=
0
;
static
int
_timeout
=
120
;
const
char
*
load_default_groups
[]
=
{
"mysql_cluster"
,
0
};
...
...
@@ -49,6 +51,10 @@ static struct my_option my_long_options[] =
{
"not-started"
,
OPT_WAIT_STATUS_NOT_STARTED
,
"Wait for cluster not started"
,
(
gptr
*
)
&
_not_started
,
(
gptr
*
)
&
_not_started
,
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"single-user"
,
OPT_WAIT_STATUS_SINGLE_USER
,
"Wait for cluster to enter single user mode"
,
(
gptr
*
)
&
_single_user
,
(
gptr
*
)
&
_single_user
,
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"timeout"
,
't'
,
"Timeout to wait"
,
(
gptr
*
)
&
_timeout
,
(
gptr
*
)
&
_timeout
,
0
,
GET_INT
,
REQUIRED_ARG
,
120
,
0
,
0
,
0
,
0
,
0
},
...
...
@@ -90,6 +96,10 @@ int main(int argc, char** argv){
{
wait_status
=
NDB_MGM_NODE_STATUS_NOT_STARTED
;
}
else
if
(
_single_user
)
{
wait_status
=
NDB_MGM_NODE_STATUS_SINGLEUSER
;
}
else
{
wait_status
=
NDB_MGM_NODE_STATUS_STARTED
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment