Merge lp:~stewart/drizzle/bug751191 into lp:~drizzle-trunk/drizzle/development

Proposed by Stewart Smith
Status: Work in progress
Proposed branch: lp:~stewart/drizzle/bug751191
Merge into: lp:~drizzle-trunk/drizzle/development
Diff against target: 103 lines (+13/-5)
5 files modified
drizzled/main.cc (+6/-0)
drizzled/open_tables_state.h (+2/-1)
drizzled/session.cc (+2/-1)
drizzled/sql_base.cc (+2/-2)
plugin/signal_handler/signal_handler.cc (+1/-1)
To merge this branch: bzr merge lp:~stewart/drizzle/bug751191
Reviewer Review Type Date Requested Status
Drizzle Merge Team Pending
Review via email: mp+65300@code.launchpad.net

Description of the change

protect g_refresh_version from races by making it atomic.

http://jenkins.drizzle.org/view/Drizzle-param/job/drizzle-param/841/

To post a comment you must log in.
Revision history for this message
Brian Aker (brianaker) wrote :

We need a test case to show this bug. Refresh works based on a lossy view of the value.

Turning this to atomic will directly effect performance (I know, I once did this patch wondering about refresh).

Really? We need to get rid of refresh entirely.

Revision history for this message
Stewart Smith (stewart) wrote :

On Wed, 22 Jun 2011 17:26:37 -0000, Brian Aker <email address hidden> wrote:
> Really? We need to get rid of refresh entirely.

here here.

--
Stewart Smith

Unmerged revisions

2344. By Stewart Smith

global g_refresh_version wasn't protected against races. Make it an atomic variable.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'drizzled/main.cc'
2--- drizzled/main.cc 2011-06-16 15:27:28 +0000
3+++ drizzled/main.cc 2011-06-21 06:21:16 +0000
4@@ -71,6 +71,7 @@
5 #include <drizzled/sql_base.h>
6 #include <drizzled/sql_lex.h>
7 #include <drizzled/system_variables.h>
8+#include <drizzled/atomics.h>
9
10 using namespace drizzled;
11 using namespace std;
12@@ -80,6 +81,9 @@
13
14 extern bool opt_daemon;
15
16+namespace drizzled {
17+ extern drizzled::atomic<uint64_t> g_refresh_version;
18+}
19
20 /**
21 All global error messages are sent here where the first one is stored
22@@ -332,6 +336,8 @@
23 server_id= 1;
24 }
25
26+ drizzled::g_refresh_version.fetch_and_store(1); // needs to be set to 1.
27+
28 try
29 {
30 if (init_server_components(modules))
31
32=== modified file 'drizzled/open_tables_state.h'
33--- drizzled/open_tables_state.h 2011-04-30 17:00:52 +0000
34+++ drizzled/open_tables_state.h 2011-06-21 06:21:16 +0000
35@@ -21,10 +21,11 @@
36
37 #include <drizzled/common_fwd.h>
38 #include <drizzled/lock.h>
39+#include <drizzled/atomics.h>
40
41 namespace drizzled {
42
43-extern uint64_t g_refresh_version;
44+extern drizzled::atomic<uint64_t> g_refresh_version;
45
46 /**
47 Class that holds information about tables which were opened and locked
48
49=== modified file 'drizzled/session.cc'
50--- drizzled/session.cc 2011-06-05 23:06:29 +0000
51+++ drizzled/session.cc 2011-06-21 06:21:16 +0000
52@@ -84,6 +84,7 @@
53 #include <drizzled/util/functors.h>
54 #include <drizzled/util/storable.h>
55 #include <plugin/myisam/myisam.h>
56+#include <drizzled/atomics.h>
57
58 #include <algorithm>
59 #include <climits>
60@@ -105,7 +106,7 @@
61
62 const char * const Session::DEFAULT_WHERE= "field list";
63
64-uint64_t g_refresh_version = 1;
65+drizzled::atomic<uint64_t> g_refresh_version;
66
67 bool Key_part_spec::operator==(const Key_part_spec& other) const
68 {
69
70=== modified file 'drizzled/sql_base.cc'
71--- drizzled/sql_base.cc 2011-06-17 13:13:07 +0000
72+++ drizzled/sql_base.cc 2011-06-21 06:21:16 +0000
73@@ -72,7 +72,7 @@
74
75 void table_cache_free()
76 {
77- g_refresh_version++; // Force close of open tables
78+ g_refresh_version.increment(); // Force close of open tables
79
80 table::getUnused().clear();
81 table::getCache().clear();
82@@ -169,7 +169,7 @@
83 boost::mutex::scoped_lock scopedLock(table::Cache::mutex()); /* Optionally lock for remove tables from open_cahe if not in use */
84 if (not tables)
85 {
86- g_refresh_version++; // Force close of open tables
87+ g_refresh_version.increment(); // Force close of open tables
88 table::getUnused().clear();
89 }
90 else
91
92=== modified file 'plugin/signal_handler/signal_handler.cc'
93--- plugin/signal_handler/signal_handler.cc 2011-06-17 13:00:32 +0000
94+++ plugin/signal_handler/signal_handler.cc 2011-06-21 06:21:16 +0000
95@@ -205,7 +205,7 @@
96 case SIGHUP:
97 if (!abort_loop)
98 {
99- g_refresh_version++;
100+ g_refresh_version.increment();
101 drizzled::plugin::StorageEngine::flushLogs(NULL);
102 }
103 break;