Changeset 1770
- Timestamp:
- 08/07/08 21:18:40 (4 months ago)
- Files:
-
- cherokee/trunk/ChangeLog (modified) (1 diff)
- cherokee/trunk/cherokee/main.c (modified) (5 diffs)
- cherokee/trunk/cherokee/main_guardian.c (modified) (7 diffs)
- cherokee/trunk/cherokee/server-protected.h (modified) (1 diff)
- cherokee/trunk/cherokee/server.c (modified) (9 diffs)
- cherokee/trunk/cherokee/server.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
cherokee/trunk/ChangeLog
r1769 r1770 1 1 2008-08-07 Alvaro Lopez Ortega <alvaro@alobbs.com> 2 2 3 * cherokee/socket.c: Reimplemented using the TCP layer nondelay 3 * cherokee/main.c, cherokee/main_guardian.c, 4 cherokee/server-protected.h, cherokee/server.c, cherokee/server.h: 5 Implement gratefully restart (aka: from now on, you can upgrade 6 your Cherokee binary without killing the existing connections). 7 8 * cherokee/socket.c: Reimplemented using the TCP layer nodelay 4 9 property instead of the file descriptor level. 5 10 cherokee/trunk/cherokee/main.c
r1738 r1770 24 24 25 25 #include "common-internal.h" 26 26 27 #include <signal.h> 28 #include <unistd.h> 29 27 30 #include "init.h" 28 31 #include "server.h" 29 32 #include "info.h" 33 #include "server-protected.h" 34 #include "util.h" 30 35 31 36 #ifdef HAVE_GETOPT_LONG … … 95 100 96 101 static void 97 restart_server_cb (cherokee_server_t *new_srv)98 {99 ret_t ret;100 101 srv = new_srv;102 ret = common_server_initialization (srv);103 if (ret != ret_ok) exit(3);104 }105 106 static void107 102 restart_server (int code) 108 103 { 109 104 UNUSED(code); 110 105 printf ("Handling HUP signal..\n"); 111 cherokee_server_handle_HUP (srv , restart_server_cb);106 cherokee_server_handle_HUP (srv); 112 107 } 113 108 … … 123 118 test_configuration_file (void) 124 119 { 125 ret_t ret;126 char *config;120 ret_t ret; 121 char *config; 127 122 128 123 config = (config_file) ? config_file : DEFAULT_CONFIG_FILE; … … 132 127 return ret; 133 128 } 129 134 130 135 131 static ret_t … … 307 303 ret = cherokee_server_step (srv); 308 304 } while (ret == ret_eagain); 309 305 310 306 cherokee_server_stop (srv); 311 307 cherokee_server_free (srv); cherokee/trunk/cherokee/main_guardian.c
r1695 r1770 41 41 #define PID_FILE CHEROKEE_VAR_RUN "/cherokee-guardian.pid" 42 42 43 pid_t pid;44 43 pid_t pid; 44 cherokee_boolean_t grateful_restart; 45 45 46 46 static void … … 84 84 int exitcode = 0; 85 85 86 re = waitpid (pid, &exitcode, 0); 87 if (re == -1) 88 return ret_error; 86 while (true) { 87 re = waitpid (pid, &exitcode, 0); 88 if (re > 0) 89 break; 90 else if (errno == EINTR) 91 if (grateful_restart) 92 break; 93 else 94 continue; 95 else 96 return ret_error; 97 } 89 98 90 99 if (WIFEXITED(exitcode)) { … … 114 123 switch (sig) { 115 124 case SIGUSR1: 116 /* Restart Cherokee*/125 /* Restart: the tough way */ 117 126 kill (pid, SIGINT); 118 127 process_wait (pid); 119 128 break; 120 129 121 case SIGCHLD: 122 /* Child exited */ 123 wait (&exitcode); 130 case SIGHUP: 131 /* Grateful restart */ 132 grateful_restart = true; 133 kill (pid, SIGHUP); 124 134 break; 125 135 … … 131 141 exit(0); 132 142 143 case SIGCHLD: 144 /* Child exited */ 145 wait (&exitcode); 146 break; 147 133 148 default: 134 149 /* Forward the signal */ … … 157 172 158 173 sigaction (SIGHUP, &act, NULL); 159 sigaction (SIGSEGV, &act, NULL);160 174 sigaction (SIGTERM, &act, NULL); 161 175 sigaction (SIGUSR1, &act, NULL); 176 sigaction (SIGCHLD, &act, NULL); 162 177 } 163 178 … … 241 256 242 257 while (true) { 258 grateful_restart = false; 259 243 260 pid = process_launch (CHEROKEE_SRV_PATH, argv); 244 261 if (pid < 0) { … … 247 264 } 248 265 249 ret = process_wait (pid); 266 ret = process_wait (pid); 250 267 if (single_time) 251 268 break; cherokee/trunk/cherokee/server-protected.h
r1763 r1770 62 62 /* Exit related 63 63 */ 64 time_t start_time; 65 cherokee_buffer_t panic_action; 66 cherokee_boolean_t wanna_exit; 67 cherokee_boolean_t wanna_reinit; 68 cherokee_server_reinit_cb_t reinit_callback; 64 time_t start_time; 65 cherokee_buffer_t panic_action; 66 cherokee_boolean_t wanna_exit; 67 cherokee_boolean_t wanna_reinit; 69 68 70 69 /* Virtual servers cherokee/trunk/cherokee/server.c
r1761 r1770 121 121 n->wanna_exit = false; 122 122 n->wanna_reinit = false; 123 n->reinit_callback = NULL;124 123 125 124 /* Server config … … 317 316 318 317 #ifdef HAVE_TLS 319 cherokee_socket_close (&srv->socket );320 cherokee_socket_mrproper (&srv->socket );318 cherokee_socket_close (&srv->socket_tls); 319 cherokee_socket_mrproper (&srv->socket_tls); 321 320 322 321 CHEROKEE_MUTEX_DESTROY (&srv->accept_tls_mutex); … … 1138 1137 return ret_ok; 1139 1138 1139 /* Stop all the threads (may be slow) 1140 */ 1141 stop_threads (srv); 1142 1140 1143 /* Close all connections 1141 1144 */ … … 1145 1148 */ 1146 1149 flush_logs (srv); 1147 1148 return ret_ok;1149 }1150 1151 1152 ret_t1153 cherokee_server_reinit (cherokee_server_t *srv)1154 {1155 ret_t ret;1156 cherokee_server_t *new_srv = NULL;1157 cherokee_server_reinit_cb_t reinit_cb = NULL;1158 1159 if (srv->chrooted) {1160 PRINT_ERROR_S ("WARNING: Chrooted cherokee cannot be reloaded. "1161 "Please, stop and restart it again.\n");1162 return ret_ok;1163 }1164 1165 #if 01166 {1167 int tmp;1168 printf ("Handling server reinit. Press any key to continue..\n");1169 read (0, &tmp, 1);1170 }1171 #endif1172 1173 reinit_cb = srv->reinit_callback;1174 1175 /* Stop the server.1176 */1177 ret = cherokee_server_stop (srv);1178 if (ret != ret_ok)1179 return ret;1180 1181 /* Destroy the server.1182 */1183 ret = cherokee_server_free (srv);1184 if (ret != ret_ok)1185 return ret;1186 srv = NULL;1187 1188 /* Create a new one1189 */1190 ret = cherokee_server_new (&new_srv);1191 if (ret != ret_ok)1192 return ret;1193 1194 /* Send event1195 */1196 if ((reinit_cb != NULL) && (new_srv != NULL)) {1197 reinit_cb (new_srv);1198 }1199 1150 1200 1151 return ret_ok; … … 1233 1184 cherokee_server_step (cherokee_server_t *srv) 1234 1185 { 1235 ret_t ret;1236 1237 1186 /* Get the server time. 1238 1187 */ … … 1242 1191 /* Execute thread step. 1243 1192 */ 1244 #ifndef HAVE_PTHREAD 1245 ret = cherokee_thread_step_SINGLE_THREAD (srv->main_thread); 1246 #else 1247 if (srv->thread_num == 1) 1248 ret = cherokee_thread_step_SINGLE_THREAD (srv->main_thread); 1249 else 1250 ret = cherokee_thread_step_MULTI_THREAD (srv->main_thread, true); 1251 #endif 1193 #ifdef HAVE_PTHREAD 1194 if (srv->thread_num > 1) { 1195 cherokee_thread_step_MULTI_THREAD (srv->main_thread, true); 1196 } else 1197 #endif 1198 cherokee_thread_step_SINGLE_THREAD (srv->main_thread); 1199 1252 1200 /* Logger flush 1253 1201 */ … … 1265 1213 */ 1266 1214 if (unlikely (srv->wanna_reinit)) { 1267 ret = cherokee_server_reinit (srv); 1268 1269 /* NOTE: we MUST return in any case because 1270 * the old srv server should have just been destroyed and 1271 * a new server should have been created, 1272 * in this case we cannot use the old srv ptr. 1273 */ 1274 return ret; 1215 cherokee_list_t *i; 1216 cherokee_boolean_t empty = true; 1217 1218 list_for_each (i, &srv->thread_list) { 1219 if (THREAD(i)->conns_num != 0) { 1220 empty = false; 1221 break; 1222 } 1223 } 1224 1225 if (empty) 1226 empty = (srv->main_thread->conns_num == 0); 1227 1228 if (empty) 1229 return ret_eof; 1275 1230 } 1276 1231 … … 1278 1233 */ 1279 1234 if (unlikely (srv->wanna_exit)) { 1280 stop_threads (srv); 1281 flush_logs (srv); 1282 return ret_ok; 1235 return ret_eof; 1283 1236 } 1284 1237 … … 1818 1771 1819 1772 ret_t 1820 cherokee_server_handle_HUP (cherokee_server_t *srv, cherokee_server_reinit_cb_t callback) 1821 { 1822 srv->reinit_callback = callback; 1773 cherokee_server_handle_HUP (cherokee_server_t *srv) 1774 { 1823 1775 srv->wanna_reinit = true; 1776 srv->keepalive = false; 1777 srv->keepalive_max = 0; 1778 1779 cherokee_socket_close (&srv->socket); 1780 cherokee_socket_close (&srv->socket_tls); 1824 1781 1825 1782 return ret_ok; cherokee/trunk/cherokee/server.h
r1567 r1770 34 34 #include <stddef.h> 35 35 36 37 36 CHEROKEE_BEGIN_DECLS 38 37 38 39 39 typedef struct cherokee_server cherokee_server_t; 40 typedef void (* cherokee_server_reinit_cb_t) (cherokee_server_t *new_srv);41 42 40 #define SRV(x) ((cherokee_server_t *)(x)) 43 41 … … 49 47 ret_t cherokee_server_step (cherokee_server_t *srv); 50 48 ret_t cherokee_server_stop (cherokee_server_t *srv); 51 ret_t cherokee_server_reinit (cherokee_server_t *srv);52 49 53 50 void cherokee_server_set_min_latency (cherokee_server_t *srv, int msecs); … … 71 68 /* System signal callback 72 69 */ 73 ret_t cherokee_server_handle_HUP (cherokee_server_t *srv , cherokee_server_reinit_cb_t callback);70 ret_t cherokee_server_handle_HUP (cherokee_server_t *srv); 74 71 ret_t cherokee_server_handle_TERM (cherokee_server_t *srv); 75 72 ret_t cherokee_server_handle_panic (cherokee_server_t *srv);