/* ==================== daemon_loop() ==================== */ int daemon_loop(void *data) { notice_log("In daemon_loop()"); const program_options_t *po = (const program_options_t *)data; return run_broker(po->frontend, po->backend, po->log_level >= LOG_DEBUG ? 1 : 0); }
/* ================ client_create_actor() ================ */ void client_create_actor(client_t *client) { client->actor = zactor_new(client_thread_main, client); notice_log("Client %d start actor.", client->id); }
/* ==================== start_listen() ==================== */ int start_listen(int listen_port, const char *data_dir) { int r; /* -------- server_addr -------- */ struct sockaddr_in server_addr; r = uv_ip4_addr("0.0.0.0", listen_port, &server_addr); if ( r ) { error_log("uv_ip4_addr() failed."); return -1; } /* -------- server-------- */ server_t *server = server_new(); if ( server_init(server) != 0 ){ error_log("server_init() failed."); return -1; } /* -------- loop -------- */ uv_loop_t *loop = &server->connection.loop; /* -------- tcp_handle -------- */ uv_tcp_t *tcp_handle = &server->connection.handle.tcp; /* -------- uv_tcp_init -------- */ r = uv_tcp_init(loop, tcp_handle); if ( r ) { error_log("uv_tcp_init() failed."); server_free(server); return -1; } tcp_handle->data = server; /* -------- uv_tcp_bind -------- */ r = uv_tcp_bind(tcp_handle, (const struct sockaddr*)&server_addr, 0); if ( r ) { error_log("uv_tcp_bind() failed."); server_free(server); return -1; } /* -------- uv_listen -------- */ r = uv_listen((uv_stream_t*)tcp_handle, SOMAXCONN, on_connection); if ( r ) { error_log("uv_listen() failed."); server_free(server); return -1; } info_log("Listen on port %d.", listen_port); /* -------- uv_run -------- */ r = uv_run(loop, UV_RUN_DEFAULT); if ( r ) { error_log("uv_run() failed."); server_free(server); return -1; } /* FIXME */ /*MAKE_VALGRIND_HAPPY(loop);*/ /*close_loop(loop); */ /*uv_loop_delete(loop); */ server_free(server); notice_log("Server exit."); return 0; }
/* ================ client_thread_main() ================ */ void client_thread_main(zsock_t *pipe, void *user_data) { client_t *client = (client_t*)user_data; int id = client->id; UNUSED const char *file_data = client->file_data; UNUSED uint32_t file_size = client->file_size; trace_log("Client %d Ready.", id); zsock_signal(pipe, 0); char sz_id[16]; sprintf(sz_id, "%d", id); message_send_status(pipe, MSG_STATUS_ACTOR_READY); zsock_t *sock_client = zsock_new_req(client->endpoint); if ( sock_client == NULL ){ error_log("Connect broker failed. Client %d", client->id); return; } uint32_t file_count = 0; while ( true ){ char key[NAME_MAX]; client_rebuild_data_key(client, file_count, key); int retries = 0; while ( retries++ < RETRIES ) { int rc = 0; if ( client->op_code == 1 ) { rc = upload_data(sock_client, key, file_data, file_size); } else if ( client->op_code == 2 ) { rc = download_data(sock_client, key); } else if ( client->op_code == 3 ) { rc = delete_data(sock_client, key); } if ( rc == -2 ) break; if ( rc == 0 ) break; notice_log("Retry %d/%d...", retries, RETRIES); zclock_sleep(1000); } /* ---------------- Check exit loop ---------------- */ file_count++; if ( file_count % 100 == 1 || file_count + 5 >= client->total_files ){ info_log("Client %d Send message %d/%d", client->id, file_count, client->total_files); } if ( file_count >= client->total_files ) break; } message_send_status(pipe, MSG_STATUS_ACTOR_OVER); zsock_destroy(&sock_client); trace_log("Client %d Exit.", id); }
vnode_t *vnode_new(const char *root_dir, uint32_t id, enum eVnodeStorageType storage_type, vnode_write_queue_handle_write_cb vnode_write_queue_handle_write) { vnode_t *vnode = (vnode_t*)zmalloc(sizeof(vnode_t)); memset(vnode, 0, sizeof(vnode_t)); vnode->id = id; vnode->storage_type = storage_type; /*vnode->max_dbsize = 1024L * 1024L * 1024L * 4L;*/ vnode->max_dbsize = 1024L * 1024L * 500L; /* Create vnode root dir */ sprintf(vnode->root_dir, "%s/%04d", root_dir, id); if ( mkdir_if_not_exist(vnode->root_dir) != 0 ){ error_log("Cann't create vnode(%d) dir:%s", id, vnode->root_dir); zfree(vnode); return NULL; } /* datazones */ int i; for ( i = 0 ; i < MAX_DATAZONES ; i++ ){ vnode->datazones[i] = (datazone_t*)zmalloc(sizeof(datazone_t)); if ( datazone_init(vnode->datazones[i], vnode, i) != 0 ){ zfree(vnode); return NULL; } } /* Slices DB */ if ( vnode->storage_type >= STORAGE_KVDB ){ // Create Metadata DB. const char *metadata_dbname = "metadata"; kvdb_t *kvdb_metadata = vnode_open_kvdb(vnode, metadata_dbname); if ( kvdb_metadata == NULL ){ error_log("MetadataDB create failed. dbname:%s", metadata_dbname); zfree(vnode); return NULL; } vnode->kvdb_metadata = kvdb_metadata; uint32_t active_slicedb_id = 0; if ( kvdb_get_uint32(kvdb_metadata, "active_slicedb_id", &active_slicedb_id) != 0 ){ active_slicedb_id = 0; } notice_log("vnode active_slicedb_id:%d", active_slicedb_id); // Create Slice DB. for ( int db_id = 0 ; db_id <= active_slicedb_id ; db_id++ ){ slicedb_t *slicedb = vnode_open_slicedb(vnode, db_id); if ( slicedb != NULL ){ } else { /*char dbname[NAME_MAX];*/ /*sprintf(dbname, "slice-%03d", db_id);*/ /*kvdb_t *kvdb = vnode_open_kvdb(vnode, dbname);*/ /*if ( kvdb != NULL ){*/ /*vnode->slicedbs[db_id] = slicedb_new(db_id, kvdb, vnode->max_dbsize);*/ /*} else {*/ /*error_log("SliceDB create failed. dbname:%s", dbname);*/ for ( int n = 0 ; n < db_id ; n++ ){ slicedb_free(vnode->slicedbs[n]); vnode->slicedbs[n] = NULL; } zfree(vnode); return NULL; } } vnode->active_slicedb = vnode->slicedbs[active_slicedb_id]; /*vnode->kvdb = vnode->active_slicedb->kvdb;*/ } vnode->caching_objects = object_queue_new(object_compare_md5_func); vnode->received_objects = listCreate(); vnode->received_object_size = 0; vnode->standby_objects = listCreate(); vnode->standby_object_size = 0; vnode->write_queue = init_work_queue(vnode_write_queue_handle_write, VNODE_WRITE_QUEUE_INTERVAL); return vnode; }