Merge lp:~brianaker/drizzle/socket-file-clean into lp:drizzle/7.1

Proposed by Brian Aker
Status: Merged
Approved by: Brian Aker
Approved revision: not available
Merged at revision: 2542
Proposed branch: lp:~brianaker/drizzle/socket-file-clean
Merge into: lp:drizzle/7.1
Diff against target: 180 lines (+111/-1)
3 files modified
drizzled/drizzled.cc (+0/-1)
libdrizzle/conn.cc (+91/-0)
plugin/mysql_unix_socket_protocol/protocol.cc (+20/-0)
To merge this branch: bzr merge lp:~brianaker/drizzle/socket-file-clean
Reviewer Review Type Date Requested Status
Drizzle Trunk Pending
Review via email: mp+102252@code.launchpad.net
To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'drizzled/drizzled.cc'
2--- drizzled/drizzled.cc 2012-04-16 22:00:59 +0000
3+++ drizzled/drizzled.cc 2012-04-17 08:53:19 +0000
4@@ -405,7 +405,6 @@
5 at_exit_pid_file[0]= 0;
6 }
7 }
8-
9 }
10
11 /**
12
13=== modified file 'libdrizzle/conn.cc'
14--- libdrizzle/conn.cc 2012-01-30 05:36:54 +0000
15+++ libdrizzle/conn.cc 2012-04-17 08:53:19 +0000
16@@ -58,6 +58,86 @@
17 */
18 static drizzle_return_t _con_setsockopt(drizzle_con_st *con);
19
20+static bool connect_poll(drizzle_con_st *con)
21+{
22+ struct pollfd fds[1];
23+ fds[0].fd= con->fd;
24+ fds[0].events= POLLOUT;
25+
26+ size_t loop_max= 5;
27+ while (--loop_max) // Should only loop on cases of ERESTART or EINTR
28+ {
29+ int error= poll(fds, 1, con->drizzle->timeout);
30+ switch (error)
31+ {
32+ case 1:
33+ {
34+ int err;
35+ socklen_t len= sizeof (err);
36+ // We replace errno with err if getsockopt() passes, but err has been
37+ // set.
38+ if (getsockopt(con->fd, SOL_SOCKET, SO_ERROR, &err, &len) == 0)
39+ {
40+ // We check the value to see what happened wth the socket.
41+ if (err == 0)
42+ {
43+ return true;
44+ }
45+ errno= err;
46+ }
47+
48+ // "getsockopt() failed"
49+ return false;
50+ }
51+
52+ case 0:
53+ {
54+ // "timeout occurred while trying to connect"
55+ return false;
56+ }
57+
58+ default: // A real error occurred and we need to completely bail
59+ switch (get_socket_errno())
60+ {
61+#ifdef TARGET_OS_LINUX
62+ case ERESTART:
63+#endif
64+ case EINTR:
65+ continue;
66+
67+ case EFAULT:
68+ case ENOMEM:
69+ // "poll() failure"
70+ return false;
71+
72+ case EINVAL:
73+ // "RLIMIT_NOFILE exceeded, or if OSX the timeout value was invalid"
74+ return false;
75+
76+ default: // This should not happen
77+ if (fds[0].revents & POLLERR)
78+ {
79+ int err;
80+ socklen_t len= sizeof (err);
81+ (void)getsockopt(con->fd, SOL_SOCKET, SO_ERROR, &err, &len);
82+ errno= err;
83+ }
84+ else
85+ {
86+ errno= get_socket_errno();
87+ }
88+
89+ //"socket error occurred");
90+ return false;
91+ }
92+ }
93+ }
94+
95+ // This should only be possible from ERESTART or EINTR;
96+ // "connection failed (error should be from either ERESTART or EINTR"
97+ return false;
98+}
99+
100 /** @} */
101
102 /*
103@@ -700,13 +780,17 @@
104
105 *ret_ptr= drizzle_con_connect(con);
106 if (*ret_ptr != DRIZZLE_RETURN_OK)
107+ {
108 return result;
109+ }
110 }
111
112 if (drizzle_state_none(con))
113 {
114 if (con->options & (DRIZZLE_CON_RAW_PACKET | DRIZZLE_CON_NO_RESULT_READ))
115+ {
116 con->result= NULL;
117+ }
118 else
119 {
120 for (old_result= con->result_list; old_result != NULL; old_result= old_result->next)
121@@ -743,7 +827,9 @@
122
123 *ret_ptr= drizzle_state_loop(con);
124 if (*ret_ptr == DRIZZLE_RETURN_PAUSE)
125+ {
126 *ret_ptr= DRIZZLE_RETURN_OK;
127+ }
128 else if (*ret_ptr != DRIZZLE_RETURN_OK &&
129 *ret_ptr != DRIZZLE_RETURN_IO_WAIT &&
130 *ret_ptr != DRIZZLE_RETURN_ERROR_CODE)
131@@ -1300,6 +1386,11 @@
132
133 if (errno == EINPROGRESS)
134 {
135+ if (connect_poll(con))
136+ {
137+ drizzle_state_pop(con);
138+ return DRIZZLE_RETURN_OK;
139+ }
140 drizzle_state_pop(con);
141 drizzle_state_push(con, drizzle_state_connecting);
142 return DRIZZLE_RETURN_OK;
143
144=== modified file 'plugin/mysql_unix_socket_protocol/protocol.cc'
145--- plugin/mysql_unix_socket_protocol/protocol.cc 2012-01-15 20:54:59 +0000
146+++ plugin/mysql_unix_socket_protocol/protocol.cc 2012-04-17 08:53:19 +0000
147@@ -59,6 +59,24 @@
148 return 0;
149 }
150
151+extern "C" {
152+
153+ char at_exit_socket_file[1024 * 4]= { 0 };
154+
155+ static void remove_socket_file(void)
156+ {
157+ if (at_exit_socket_file[0])
158+ {
159+ if (unlink(at_exit_socket_file) == -1)
160+ {
161+ std::cerr << "Could not remove socket: " << at_exit_socket_file << "(" << strerror(errno) << ")" << std::endl;
162+ }
163+
164+ at_exit_socket_file[0]= 0;
165+ }
166+ }
167+}
168+
169 static int init(drizzled::module::Context &context)
170 {
171 const module::option_map &vm= context.getOptions();
172@@ -72,6 +90,8 @@
173 context.registerVariable(new sys_var_const_string_val("path", fs::system_complete(uds_path).file_string()));
174 context.registerVariable(new sys_var_bool_ptr_readonly("clobber", &clobber));
175 context.registerVariable(new sys_var_uint32_t_ptr("max-connections", &Protocol::mysql_unix_counters.max_connections));
176+ snprintf(at_exit_socket_file, sizeof(at_exit_socket_file), "%s", uds_path.file_string().c_str());
177+ atexit(remove_socket_file);
178 }
179 else
180 {

Subscribers

People subscribed via source and target branches

to all changes: