/** * Initialize node stability caching. */ G_GNUC_COLD void stable_init(void) { dbstore_kv_t kv = { KUID_RAW_SIZE, NULL, sizeof(struct lifedata), 0 }; dbstore_packing_t packing = { serialize_lifedata, deserialize_lifedata, NULL }; g_assert(NULL == db_lifedata); g_assert(NULL == stable_sync_ev); g_assert(NULL == stable_prune_ev); /* Legacy: remove after 0.97 -- RAM, 2011-05-03 */ dbstore_move(settings_config_dir(), settings_dht_db_dir(), db_stable_base); db_lifedata = dbstore_open(db_stable_what, settings_dht_db_dir(), db_stable_base, kv, packing, STABLE_DB_CACHE_SIZE, kuid_hash, kuid_eq, GNET_PROPERTY(dht_storage_in_memory)); dbmw_set_map_cache(db_lifedata, STABLE_MAP_CACHE_SIZE); stable_prune_old(); stable_sync_ev = cq_periodic_main_add(STABLE_SYNC_PERIOD, stable_sync, NULL); stable_prune_ev = cq_periodic_main_add(STABLE_PRUNE_PERIOD, stable_periodic_prune, NULL); }
/** * Initialize local key management. */ G_GNUC_COLD void keys_init(void) { size_t i; dbstore_kv_t kv = { KUID_RAW_SIZE, NULL, sizeof(struct keydata), 0 }; dbstore_packing_t packing = { serialize_keydata, deserialize_keydata, NULL }; g_assert(NULL == keys_periodic_ev); g_assert(NULL == keys); g_assert(NULL == db_keydata); keys_periodic_ev = cq_periodic_main_add(LOAD_PERIOD * 1000, keys_periodic_load, NULL); keys = hikset_create( offsetof(struct keyinfo, kuid), HASH_KEY_FIXED, KUID_RAW_SIZE); install_periodic_kball(KBALL_FIRST); db_keydata = dbstore_open(db_keywhat, settings_dht_db_dir(), db_keybase, kv, packing, KEYS_DB_CACHE_SIZE, kuid_hash, kuid_eq, GNET_PROPERTY(dht_storage_in_memory)); for (i = 0; i < G_N_ELEMENTS(decimation_factor); i++) decimation_factor[i] = pow(KEYS_DECIMATION_BASE, i); values_init(); keys_init_keyinfo(); keys_sync_ev = cq_periodic_main_add(KEYS_SYNC_PERIOD, keys_sync, NULL); }
/** * Create new aging container, where keys/values expire and need to be freed. * Values are either integers (cast to pointers) or refer to real objects. * * @param delay the aging delay, in seconds, for entries * @param hash the hashing function for the keys in the hash table * @param eq the equality function for the keys in the hash table * @param kvfree the key/value pair freeing callback, NULL if none. * * @return opaque handle to the container. */ aging_table_t * aging_make(int delay, hash_fn_t hash, eq_fn_t eq, free_keyval_fn_t kvfree) { aging_table_t *ag; WALLOC0(ag); ag->magic = AGING_MAGIC; ag->table = hikset_create_any( offsetof(struct aging_value, key), NULL == hash ? pointer_hash : hash, eq); ag->kvfree = kvfree; delay = MAX(delay, 1); delay = MIN(delay, INT_MAX / 1000); ag->delay = delay; elist_init(&ag->list, offsetof(struct aging_value, lk)); /* * If the callout queue does not run in the thread that is creating * this table, then concurrent accesses are bound to happen. * Therefore, make the table thread-safe. */ if (cq_main_thread_id() != thread_small_id()) aging_thread_safe(ag); ag->gc_ev = cq_periodic_main_add(AGING_CALLOUT, aging_gc, ag); aging_check(ag); return ag; }
/** * Initialize security token caching. */ G_GNUC_COLD void tcache_init(void) { dbstore_kv_t kv = { KUID_RAW_SIZE, NULL, sizeof(struct tokdata), sizeof(struct tokdata) + MAX_INT_VAL(uint8) }; dbstore_packing_t packing = { serialize_tokdata, deserialize_tokdata, free_tokdata }; g_assert(NULL == db_tokdata); g_assert(NULL == tcache_prune_ev); /* Legacy: remove after 0.97 -- RAM, 2011-05-03 */ dbstore_move(settings_config_dir(), settings_dht_db_dir(), db_tcache_base); db_tokdata = dbstore_create(db_tcache_what, settings_dht_db_dir(), db_tcache_base, kv, packing, TOK_DB_CACHE_SIZE, kuid_hash, kuid_eq, GNET_PROPERTY(dht_storage_in_memory)); dbmw_set_map_cache(db_tokdata, TOK_MAP_CACHE_SIZE); dbmw_set_debugging(db_tokdata, &tcache_dbmw_dbg); token_life = MIN(TOK_LIFE, token_lifetime()); if (GNET_PROPERTY(dht_tcache_debug)) g_debug("DHT cached token lifetime set to %u secs", (unsigned) token_life); tcache_prune_ev = cq_periodic_main_add(TCACHE_PRUNE_PERIOD, tcache_periodic_prune, NULL); }
/** * Initialize GUID management. */ G_GNUC_COLD void guid_init(void) { dbstore_kv_t kv = { sizeof(guid_t), NULL, sizeof(struct guiddata), 1 + sizeof(struct guiddata) /* Version byte not held in structure */ }; dbstore_packing_t packing = { serialize_guiddata, deserialize_guiddata, NULL }; char rev; /* NUL means stable release */ g_assert(NULL == db_guid); guid_gen_syndrome_table(); rev = product_get_revchar(); gtkg_version_mark = guid_gtkg_encode_version(product_get_major(), product_get_minor(), '\0' == rev); if (GNET_PROPERTY(node_debug)) g_debug("GTKG version mark is 0x%x", gtkg_version_mark); /* * Validate that guid_random_muid() correctly marks GUIDs as being GTKG's. */ { struct guid guid_buf; guid_random_muid(&guid_buf); g_assert(guid_is_gtkg(&guid_buf, NULL, NULL, NULL)); } db_guid = dbstore_open(db_guid_what, settings_gnet_db_dir(), db_guid_base, kv, packing, 1, guid_hash, guid_eq, FALSE); guid_prune_old(); guid_prune_ev = cq_periodic_main_add( GUID_PRUNE_PERIOD, guid_periodic_prune, NULL); guid_sync_ev = cq_periodic_main_add( GUID_SYNC_PERIOD, guid_periodic_sync, NULL); }
/** * Initialize background task scheduling. */ void bg_init(void) { /* * Initially, the periodic event providing "scheduling ticks" triggers * every second. This time is adjusted when there is work to do so * that background tasks can nicely blend in the middle of other activities. */ bg_ticker.period = BG_TICK_IDLE; bg_ticker.pev = cq_periodic_main_add(BG_TICK_IDLE, bg_sched_timer, NULL); }
/** * UDP layer startup */ void udp_init(void) { /* * Limit sending of UDP pings to 1 per UDP_PING_FREQ seconds. */ udp_aging_pings = aging_make(UDP_PING_FREQ, host_addr_hash_func, host_addr_eq_func, wfree_host_addr); udp_pings = hash_list_new(guid_hash, guid_eq); udp_ping_ev = cq_periodic_main_add(UDP_PING_PERIODIC_MS, udp_ping_timer, NULL); }