Muse respawn when detecting critical error at server 65/109265/8
authorYoungHun Kim <yh8004.kim@samsung.com>
Mon, 9 Jan 2017 13:12:36 +0000 (22:12 +0900)
committerYoungHun Kim <yh8004.kim@samsung.com>
Wed, 11 Jan 2017 12:40:59 +0000 (21:40 +0900)
Change-Id: Id6f1895e6fcdc97d3313b3690abc2acd90bb0961

include/muse_core.h
packaging/mused.spec
src/muse_core.c
src/muse_core_module.c
src/muse_core_msg_json.c

index 64fd2de..2713f89 100644 (file)
@@ -64,6 +64,7 @@ void muse_core_log_process_info(int pid);
 void *muse_core_msg_object_new(char *str, int *parse_len, void *err);
 bool muse_core_msg_object_get_value(void *msg_obj, const char *key, int m_type, void *data);
 void muse_core_msg_object_free(void *msg_obj);
+void muse_core_respawn(int signo);
 
 #ifdef __cplusplus
 }
index 6d02963..90878f0 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mused
 Summary:    A Multimedia Daemon in Tizen Native API
-Version:    0.1.44
+Version:    0.1.45
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0
index 95488b7..70ca470 100644 (file)
@@ -59,6 +59,7 @@ static gboolean (*job_functions[MUSE_CHANNEL_MAX])
 
 static int _muse_core_set_nonblocking(int fd, bool value);
 static int _muse_core_check_server_is_running(void);
+static void _muse_core_dispatch_shutdown(gpointer data, gpointer user_data);
 static muse_core_t *_muse_core_create_new_server_from_fd(int fd[], int type);
 static int _muse_core_free(muse_core_t *server);
 static int _muse_core_server_new(muse_core_channel_e channel);
@@ -74,11 +75,14 @@ static int _muse_core_set_nonblocking(int fd, bool value)
                flags = value ? (flags | O_NONBLOCK) : (flags & ~O_NONBLOCK);
                if (fcntl(fd, F_SETFL, flags) == -1) {
                        strerror_r(errno, err_msg, MUSE_MAX_ERROR_MSG_LEN);
-                       LOGE("fcntl (%d, F_SETFL) %s", fd, err_msg);
-                       return -1;
+                       LOGE("fcntl (%d, F_SETFL, %d) %s", fd, flags, err_msg);
+                       return MM_ERROR_FILE_INTERNAL;
                } else {
                        LOGD("fcntl (%d, F_SETFL)", fd);
                }
+       } else {
+               LOGE("failed to get flags for %d", fd);
+               return MM_ERROR_FILE_INTERNAL;
        }
 
        return MM_ERROR_NONE;
@@ -152,6 +156,13 @@ static bool _muse_core_attach_server(int fd, muse_module_callback callback, gpoi
        return true;
 }
 
+static void _muse_core_dispatch_shutdown(gpointer data, gpointer user_data)
+{
+       muse_module_h module = (muse_module_h)data;
+       LOGI("[%p] shutdown", module);
+       muse_core_cmd_dispatch(module, MUSE_MODULE_COMMAND_SHUTDOWN);
+}
+
 static muse_core_t *_muse_core_create_new_server_from_fd(int fd[], int type)
 {
        muse_core_t *server;
@@ -173,9 +184,8 @@ static muse_core_t *_muse_core_create_new_server_from_fd(int fd[], int type)
        for (i = 0; i < MUSE_CHANNEL_MAX; i++) {
                if (!_muse_core_attach_server(fd[i], _muse_core_connection_handler, (gpointer)(intptr_t) i)) {
                        LOGD("Fail to attach server fd %d", fd[i]);
-                       muse_core_connection_close(server->fd);
-                       muse_core_connection_close(server->data_fd);
-                       MUSE_FREE(server);
+                       g_queue_foreach(muse_core_ipc_get_instance()->module_queue, _muse_core_dispatch_shutdown, NULL);
+                       muse_core_respawn(SIGTERM);
                        return NULL;
                }
        }
@@ -280,14 +290,16 @@ static gboolean _muse_core_connection_handler(GIOChannel *source, GIOCondition c
 
        client_len = sizeof(client_address);
        client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
-       LOGI("server: %d client: %d", server_sockfd, client_sockfd);
-
-       if (client_sockfd < 0) {
+       if (client_sockfd == SOCK_ERR) {
                strerror_r(errno, err_msg, MUSE_MAX_ERROR_MSG_LEN);
-               LOGE("accept: %s\n", err_msg);
+               LOGE("[Critical Error] accept failure : %s", err_msg);
+               g_queue_foreach(muse_core_ipc_get_instance()->module_queue, _muse_core_dispatch_shutdown, NULL);
+               muse_core_respawn(SIGTERM);
                return FALSE;
        }
 
+       LOGI("server: %d client: %d", server_sockfd, client_sockfd);
+
        if (channel == MUSE_CHANNEL_MSG) {
                if ((module = malloc(sizeof(muse_module_t))) == NULL) {
                        LOGE("failed to allocated memory for muse_module_t");
@@ -360,7 +372,7 @@ static int _muse_core_client_new(muse_core_channel_e channel)
 
        if ((ret = connect(sockfd, (struct sockaddr *)&address, len)) < 0) {
                strerror_r(errno, err_msg, MUSE_MAX_ERROR_MSG_LEN);
-               LOGE("connect failure : %s", err_msg);
+               LOGE("[Critical Error] connect failure : %s", err_msg);
                close(sockfd);
                return ret;
        }
@@ -681,3 +693,10 @@ void muse_core_msg_object_free(void *msg_obj)
 {
        muse_core_msg_get_instance()->jobj_free(msg_obj);
 }
+
+void muse_core_respawn(int signo)
+{
+       pid_t pid = getpid();
+       LOGE("send %d process signal %d", (int)pid, signo);
+       kill(pid, signo);
+}
index a766165..bac6c5f 100644 (file)
@@ -65,18 +65,8 @@ static GModule *_muse_core_module_load(int api_module)
 
 static gboolean _muse_core_module_dispatch_callback(gpointer data)
 {
-       muse_module_h saved_module = NULL;
-       muse_module_h blocked_module = (muse_module_h) data;
-
-       while (!g_queue_is_empty(muse_core_ipc_get_instance()->module_queue)) {
-               saved_module = (muse_module_h)g_queue_pop_head(muse_core_ipc_get_instance()->module_queue);
-               if (saved_module && blocked_module && saved_module != blocked_module) {
-                       LOGD("%s executes shutdown", muse_core_config_get_instance()->get_host(saved_module->api_module));
-                       muse_core_cmd_dispatch(saved_module, MUSE_MODULE_COMMAND_SHUTDOWN);
-               }
-       }
        LOGE("Restart muse server");
-       kill(muse_core_ipc_get_instance()->pid, SIGTERM);
+       muse_core_respawn(SIGABRT);
 
        return FALSE;
 }
index 492264a..9cbc7ca 100644 (file)
@@ -190,7 +190,7 @@ static gboolean _muse_core_msg_json_object_get_value(const char *key, void* jobj
        j_type = json_object_get_type(val);
        switch (j_type) {
        case json_type_null:
-               LOGD("json_type_null\n");
+               LOGD("json_type_null");
                break;
        case json_type_boolean:
                LOGD("json_type_boolean (%s)          value: %d", key, json_object_get_boolean(val));
@@ -324,7 +324,7 @@ gboolean muse_core_msg_json_deserialize(
        j_type = json_object_get_type(val);
        switch (j_type) {
        case json_type_null:
-               LOGD("json_type_null\n");
+               LOGD("json_type_null");
                break;
        case json_type_boolean:
                LOGD("json_type_boolean (%s)          value: %d", key, json_object_get_boolean(val));