void protocol_start_session(DbXmlSessionData *session) { int r; DbXmlCredentials cred; DbXmlSessionOptions options; DbXmlSessionOptions *options_set; memset(&cred, 0, sizeof(DbXmlCredentials)); memset(&options, 0, sizeof(DbXmlSessionOptions)); if (initial_handshake(session) != 0) return; r = receive_credentials(session, &cred); if (r == 0) r = check_authentication(session, &cred); free_credentials(session, &cred); r = receive_session_options(session, &options); int init = -1; options_set = NULL; if (r == 0) init = r = initialize_session(session, &options, &options_set); session_response(session, r); if (r != 0) return; if (r == 0) r = send_session_options(session, options_set); free_session_options(session, &options); if (r == 0) protocol_request_response(session); if (init == 0) free_session(session); }
/* ==================== session_handle_write() ==================== */ int session_handle_write(session_t *session, message_t *request) { msgidx_t msgidx; /** ---------------------------------------- * Parse request * ---------------------------------------- */ if ( parse_write_request(session, request, &msgidx) != 0 ){ error_log("parse_write_request() failed. key:%s", msgidx.key); return -1; } /** ---------------------------------------- * Write cache * ---------------------------------------- */ object_t *object = session_write_to_cache(session, &msgidx); if ( object == NULL ) { error_log("session_write_block() failed."); return -1; } /** ---------------------------------------- * Write to kvdb.. * ---------------------------------------- */ if ( session->total_writed >= msgidx.object_size ){ session_write_to_kvdb(session, object, &msgidx); /** ---------------------------------------- * Response to client * ---------------------------------------- */ session_response(session, RESULT_SUCCESS); /*pthread_yield();*/ sched_yield(); } return 0; }
/* ==================== server_handle_write() ==================== */ int server_handle_write(session_t *session, message_t *request) { int ret = 0; msgidx_t msgidx; msgidx_init(&msgidx); /** ---------------------------------------- * Parse request * ---------------------------------------- */ if ( parse_write_request(session, request, &msgidx) != 0 ){ error_log("parse_write_request() failed. key:%s", msgidx.key); ret = -1; } else { if ( session->total_writed == 0 ){ __sync_add_and_fetch(&session->running_tasks, 1); } /** ---------------------------------------- * Write cache * ---------------------------------------- */ object_t *object = server_write_to_cache(session, &msgidx); if ( object == NULL ) { error_log("session_write_to_cache() failed."); __sync_add_and_fetch(&session->finished_works, 1); session->total_writed = 0; ret = -1; } else { /** ---------------------------------------- * Write to storage & Response to client. * ---------------------------------------- */ if ( session->total_writed >= msgidx.object_size ){ /* FIXME 2014-10-23 15:49:37 */ /*vnode_t *vnode = get_vnode_by_key(SERVER(session), &object->key_md5);*/ /*vnode_enqueue_write_queue(vnode, session, object);*/ server_write_to_storage(SERVER(session), object); session_response(session, RESULT_SUCCESS); __sync_add_and_fetch(&session->finished_works, 1); __sync_sub_and_fetch(&session->running_tasks, 1); /*message_t *response = alloc_response_message(RESULT_SUCCESS);*/ /*listAddNodeTail(session->responseQueue, response);*/ session->total_writed = 0; /* FIXME */ /*vnode_write_queue_entry_t *entry = (vnode_write_queue_entry_t*)zmalloc(sizeof(vnode_write_queue_entry_t));*/ /*memset(entry, 0, sizeof(vnode_write_queue_entry_t));*/ /*entry->session = session;*/ /*entry->object = object;*/ /*enqueue_work(vnode->write_queue, entry);*/ /*pthread_yield();*/ /*sched_yield();*/ } } } return ret; }