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
17451d50
Commit
17451d50
authored
Jul 12, 2007
by
brian@zim.(none)
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed locking issues around flushes.
parent
a25134ed
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
37 additions
and
25 deletions
+37
-25
storage/archive/ha_archive.cc
storage/archive/ha_archive.cc
+34
-25
storage/archive/ha_archive.h
storage/archive/ha_archive.h
+3
-0
No files found.
storage/archive/ha_archive.cc
View file @
17451d50
...
...
@@ -436,6 +436,9 @@ int ha_archive::init_archive_writer()
}
/*
No locks are required because it is associated with just one handler instance
*/
int
ha_archive
::
init_archive_reader
()
{
DBUG_ENTER
(
"ha_archive::init_archive_reader"
);
...
...
@@ -794,15 +797,16 @@ int ha_archive::write_row(uchar *buf)
if
(
share
->
crashed
)
DBUG_RETURN
(
HA_ERR_CRASHED_ON_USAGE
);
if
(
!
share
->
archive_write_open
)
if
(
init_archive_writer
())
DBUG_RETURN
(
HA_ERR_CRASHED_ON_USAGE
);
ha_statistic_increment
(
&
SSV
::
ha_write_count
);
if
(
table
->
timestamp_field_type
&
TIMESTAMP_AUTO_SET_ON_INSERT
)
table
->
timestamp_field
->
set_time
();
pthread_mutex_lock
(
&
share
->
mutex
);
if
(
!
share
->
archive_write_open
)
if
(
init_archive_writer
())
DBUG_RETURN
(
HA_ERR_CRASHED_ON_USAGE
);
if
(
table
->
next_number_field
&&
record
==
table
->
record
[
0
])
{
KEY
*
mkey
=
&
table
->
s
->
key_info
[
0
];
// We only support one key right now
...
...
@@ -992,24 +996,6 @@ int ha_archive::rnd_init(bool scan)
{
DBUG_PRINT
(
"info"
,
(
"archive will retrieve %llu rows"
,
(
unsigned
long
long
)
scan_rows
));
stats
.
records
=
0
;
/*
If dirty, we lock, and then reset/flush the data.
I found that just calling azflush() doesn't always work.
*/
pthread_mutex_lock
(
&
share
->
mutex
);
scan_rows
=
share
->
rows_recorded
;
if
(
share
->
dirty
==
TRUE
)
{
if
(
share
->
dirty
==
TRUE
)
{
DBUG_PRINT
(
"ha_archive"
,
(
"archive flushing out rows for scan"
));
azflush
(
&
(
share
->
archive_write
),
Z_SYNC_FLUSH
);
share
->
dirty
=
FALSE
;
}
}
pthread_mutex_unlock
(
&
share
->
mutex
);
if
(
read_data_header
(
&
archive
))
DBUG_RETURN
(
HA_ERR_CRASHED_ON_USAGE
);
...
...
@@ -1223,9 +1209,7 @@ int ha_archive::rnd_next(uchar *buf)
current_position
=
aztell
(
&
archive
);
rc
=
get_row
(
&
archive
,
buf
);
if
(
rc
!=
HA_ERR_END_OF_FILE
)
stats
.
records
++
;
table
->
status
=
rc
?
STATUS_NOT_FOUND
:
0
;
DBUG_RETURN
(
rc
);
}
...
...
@@ -1461,12 +1445,33 @@ void ha_archive::update_create_info(HA_CREATE_INFO *create_info)
int
ha_archive
::
info
(
uint
flag
)
{
DBUG_ENTER
(
"ha_archive::info"
);
/*
If dirty, we lock, and then reset/flush the data.
I found that just calling azflush() doesn't always work.
*/
pthread_mutex_lock
(
&
share
->
mutex
);
if
(
share
->
dirty
==
TRUE
)
{
if
(
share
->
dirty
==
TRUE
)
{
DBUG_PRINT
(
"ha_archive"
,
(
"archive flushing out rows for scan"
));
azflush
(
&
(
share
->
archive_write
),
Z_SYNC_FLUSH
);
share
->
dirty
=
FALSE
;
}
}
/*
This should be an accurate number now, though bulk and delayed inserts can
cause the number to be inaccurate.
*/
stats
.
records
=
share
->
rows_recorded
;
pthread_mutex_unlock
(
&
share
->
mutex
);
scan_rows
=
stats
.
records
;
stats
.
deleted
=
0
;
DBUG_PRINT
(
"ha_archive"
,
(
"Stats rows is %d
\n
"
,
(
int
)
stats
.
records
));
/* Costs quite a bit more to get all information */
if
(
flag
&
HA_STATUS_TIME
)
{
...
...
@@ -1486,7 +1491,9 @@ int ha_archive::info(uint flag)
if
(
flag
&
HA_STATUS_AUTO
)
{
init_archive_reader
();
pthread_mutex_lock
(
&
share
->
mutex
);
azflush
(
&
archive
,
Z_SYNC_FLUSH
);
pthread_mutex_unlock
(
&
share
->
mutex
);
stats
.
auto_increment_value
=
archive
.
auto_increment
;
}
...
...
@@ -1554,7 +1561,9 @@ int ha_archive::check(THD* thd, HA_CHECK_OPT* check_opt)
old_proc_info
=
thd_proc_info
(
thd
,
"Checking table"
);
/* Flush any waiting data */
pthread_mutex_lock
(
&
share
->
mutex
);
azflush
(
&
(
share
->
archive_write
),
Z_SYNC_FLUSH
);
pthread_mutex_unlock
(
&
share
->
mutex
);
/*
Now we will rewind the archive file so that we are positioned at the
...
...
storage/archive/ha_archive.h
View file @
17451d50
...
...
@@ -88,6 +88,8 @@ public:
{
return
(
HA_NO_TRANSACTIONS
|
HA_REC_NOT_IN_SEQ
|
HA_CAN_BIT_FIELD
|
HA_BINLOG_ROW_CAPABLE
|
HA_BINLOG_STMT_CAPABLE
|
HA_STATS_RECORDS_IS_EXACT
|
HA_HAS_RECORDS
|
HA_FILE_BASED
|
HA_CAN_INSERT_DELAYED
|
HA_CAN_GEOMETRY
);
}
ulong
index_flags
(
uint
idx
,
uint
part
,
bool
all_parts
)
const
...
...
@@ -101,6 +103,7 @@ public:
uint
max_supported_keys
()
const
{
return
1
;
}
uint
max_supported_key_length
()
const
{
return
sizeof
(
ulonglong
);
}
uint
max_supported_key_part_length
()
const
{
return
sizeof
(
ulonglong
);
}
ha_rows
records
()
{
return
share
->
rows_recorded
;
}
int
index_init
(
uint
keynr
,
bool
sorted
);
virtual
int
index_read
(
uchar
*
buf
,
const
uchar
*
key
,
uint
key_len
,
enum
ha_rkey_function
find_flag
);
...
...
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