34 #define LOG_STRERROR_FILE(kind, syscall, \ 35 filename) GNUNET_log_from_strerror_file (kind, "util", \ 44 #define PUBLISH_OPS_PER_EXPIRATION 4 51 #define DELTA_INTERVAL 100 56 #define NS_BLOCK_SIZE 1000 61 #define DHT_QUEUE_LIMIT 2000 67 #define NAMESTORE_QUEUE_LIMIT 50 73 #define INITIAL_ZONE_ITERATION_INTERVAL GNUNET_TIME_UNIT_MILLISECONDS 79 #define MAXIMUM_ZONE_ITERATION_INTERVAL GNUNET_TIME_relative_multiply ( \ 80 GNUNET_TIME_UNIT_MINUTES, 15) 86 #define LATE_ITERATION_SPEEDUP_FACTOR 2 91 #define DHT_GNS_REPLICATION_LEVEL 5 255 while (NULL != (ma = it_head))
265 if (NULL != statistics)
271 if (NULL != zone_publish_task)
274 zone_publish_task = NULL;
276 if (NULL != namestore_iter)
279 namestore_iter = NULL;
281 if (NULL != namestore_handle)
284 namestore_handle = NULL;
286 if (NULL != dht_handle)
303 zone_publish_task = NULL;
335 "No records in namestore database.\n");
355 "Minimum relative record expiration (in μs)",
359 "Zone publication time window (in μs)",
363 "Target zone iteration velocity (μs)",
380 unsigned long long pct = 0;
394 "Last record count was lower than current record count. Reducing interval.\n");
400 "Desired global zone iteration interval is %s/record!\n",
407 "Current zone iteration velocity (μs/record)",
460 "# size of the DHT queue (it)",
464 "% speed increase needed for target velocity",
468 "# records processed in current iteration",
492 "Current artificial NAMESTORE delay (μs/record)",
542 unsigned int rd_count,
546 unsigned int rd_public_count;
550 for (
unsigned int i = 0; i < rd_count; i++)
557 if (0 != (rd[i].flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION))
565 rd_public[rd_public_count++] = rd[i];
567 return rd_public_count;
585 unsigned int rd_public_count,
618 "DHT put operations initiated",
622 "Storing %u record(s) for label `%s' in DHT with expiration `%s' under key %s\n",
653 "Got disconnected from namestore database, retrying.\n");
654 namestore_iter = NULL;
658 if (NULL != zone_publish_task)
661 zone_publish_task = NULL;
678 namestore_iter = NULL;
687 "Zone iteration finished. Adjusted zone iteration interval to %s\n",
692 "Target zone iteration velocity (μs)",
696 "Number of public records in DHT",
728 unsigned int rd_count,
732 unsigned int rd_public_count;
740 if (0 == rd_public_count)
743 "Record set empty, moving to next record set\n");
749 "Starting DHT PUT\n");
764 "Could not perform DHT PUT, is the DHT running?\n");
781 "DHT PUT unconfirmed after %s, aborting PUT\n",
799 zone_publish_task = NULL;
801 "Full zone iterations launched",
805 "Starting DHT zone update!\n");
835 unsigned long long max_parallel_bg_queries = 128;
844 if (NULL == namestore_handle)
847 _ (
"Failed to connect to the namestore!\n"));
858 "ZONE_PUBLISH_TIME_WINDOW",
862 "Time window for zone iteration: %s\n",
871 "MAX_PARALLEL_BACKGROUND_QUERIES",
872 &max_parallel_bg_queries))
875 "Number of allowed parallel background queries: %llu\n",
876 max_parallel_bg_queries);
878 if (0 == max_parallel_bg_queries)
879 max_parallel_bg_queries = 1;
881 (
unsigned int) max_parallel_bg_queries);
882 if (NULL == dht_handle)
885 _ (
"Could not connect to DHT!\n"));
896 "Target zone iteration velocity (μs)",
static void dht_put_continuation(void *cls)
Continuation called from DHT once the PUT operation is done.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
static struct GNUNET_TIME_Relative min_relative_record_time
Minimum relative expiration time of records seem during the current zone iteration.
#define NS_BLOCK_SIZE
How many records do we fetch in one shot from the namestore?
GNUNET_SERVICE_MAIN("zonemaster", GNUNET_SERVICE_OPTION_NONE, &run, NULL, NULL, NULL, GNUNET_MQ_handler_end())
Define "main" method using service macro.
static struct GNUNET_SERVICE_Handle * service
Handle to our service instance.
struct GNUNET_DHT_PutHandle * ph
Handle for the DHT PUT operation.
struct DhtPutActivity * prev
Kept in a DLL.
uint64_t rel_value_us
The actual value.
void GNUNET_DHT_put_cancel(struct GNUNET_DHT_PutHandle *ph)
Cancels a DHT PUT operation.
static void shutdown_task(void *cls)
Task run during shutdown.
static void update_velocity(unsigned int cnt)
Re-calculate our velocity and the desired velocity.
static unsigned long long last_num_public_records
Last seen record count.
static unsigned int dht_queue_length
Number of entries in the DHT queue it_head.
static int first_zone_iteration
GNUNET_YES if zone has never been published before
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received, or when GNUNET_SCHEDULER_shutdown() is being invoked.
#define DELTA_INTERVAL
How often do we measure the delta between desired zone iteration speed and actual speed...
struct GNUNET_STATISTICS_Handle * GNUNET_STATISTICS_create(const char *subsystem, const struct GNUNET_CONFIGURATION_Handle *cfg)
Get handle for the statistics service.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
static void zone_iteration_error(void *cls)
We encountered an error in our zone iteration.
struct GNUNET_TIME_Absolute start_date
When was this PUT initiated?
static struct GNUNET_TIME_Relative zone_publish_time_window
Time window for zone iteration, adjusted based on relative record expiration times in our zone...
static void publish_zone_namestore_next(void *cls)
Method called periodically that triggers iteration over authoritative records.
static struct GNUNET_TIME_Relative zone_publish_time_window_default
Default time window for zone iteration.
A private key for an identity as per LSD0001.
static int ret
Return value of the commandline.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_number(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *number)
Get a configuration value that should be a number.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
#define GNUNET_new(type)
Allocate a struct or union of the given type.
void GNUNET_NAMESTORE_zone_iterator_next(struct GNUNET_NAMESTORE_ZoneIterator *it, uint64_t limit)
Calls the record processor specified in GNUNET_NAMESTORE_zone_iteration_start for the next record...
static struct DhtPutActivity * it_tail
Tail of iteration put activities; kept in a DLL.
#define PUBLISH_OPS_PER_EXPIRATION
How often should we (re)publish each record before it expires?
void GNUNET_STATISTICS_destroy(struct GNUNET_STATISTICS_Handle *h, int sync_first)
Destroy a handle (free all state associated with it).
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
static struct GNUNET_TIME_Relative last_min_relative_record_time
Minimum relative expiration time of records seem during the last zone iteration.
static void put_gns_record(void *cls, const struct GNUNET_IDENTITY_PrivateKey *key, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Function used to put all records successively into the DHT.
uint64_t abs_value_us
The actual value.
static unsigned long long num_public_records
Useful for zone update for DHT put.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_GNSRECORD_Block * GNUNET_GNSRECORD_block_create(const struct GNUNET_IDENTITY_PrivateKey *key, struct GNUNET_TIME_Absolute expire, const char *label, const struct GNUNET_GNSRECORD_Data *rd, unsigned int rd_count)
Sign name and records.
Handle for DHT PUT activity triggered from the namestore monitor.
Connection to the DHT service.
#define MAXIMUM_ZONE_ITERATION_INTERVAL
The upper bound for the zone iteration interval (per record).
static struct GNUNET_STATISTICS_Handle * statistics
Handle to the statistics service.
#define GNUNET_DHT_DEFAULT_REPUBLISH_FREQUENCY
Default republication frequency for stored data in the DHT.
void GNUNET_NAMESTORE_disconnect(struct GNUNET_NAMESTORE_Handle *h)
Disconnect from the namestore service (and free associated resources).
Handle for a zone iterator operation.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
static unsigned int convert_records_for_export(const struct GNUNET_GNSRECORD_Data *rd, unsigned int rd_count, struct GNUNET_GNSRECORD_Data *rd_public)
Convert namestore records from the internal format to that suitable for publication (removes private ...
#define LATE_ITERATION_SPEEDUP_FACTOR
The factor the current zone iteration interval is divided by for each additional new record...
size_t GNUNET_GNSRECORD_block_get_size(const struct GNUNET_GNSRECORD_Block *block)
Returns the length of this block in bytes.
Connection to the NAMESTORE service.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
#define INITIAL_ZONE_ITERATION_INTERVAL
The initial interval in milliseconds btween puts in a zone iteration.
static void calculate_put_interval()
Calculate target_iteration_velocity_per_record.
struct GNUNET_GNSRECORD_Block * GNUNET_GNSRECORD_block_create2(const struct GNUNET_IDENTITY_PrivateKey *pkey, struct GNUNET_TIME_Absolute expire, const char *label, const struct GNUNET_GNSRECORD_Data *rd, unsigned int rd_count)
Sign name and records, cache derived public key (also keeps the private key in static memory...
const char * GNUNET_STRINGS_relative_time_to_string(struct GNUNET_TIME_Relative delta, int do_round)
Give relative time in human-readable fancy format.
#define DHT_GNS_REPLICATION_LEVEL
What replication level do we use for DHT PUT operations?
static struct GNUNET_TIME_Relative sub_delta
By how much should we try to increase our per-record iteration speed (over the desired speed calculat...
struct GNUNET_TIME_Relative GNUNET_TIME_relative_multiply(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Multiply relative time by a given factor.
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
This is a private record of this peer and it should thus not be handed out to other peers...
struct GNUNET_TIME_Relative GNUNET_TIME_relative_subtract(struct GNUNET_TIME_Relative a1, struct GNUNET_TIME_Relative a2)
Subtract relative timestamp from the other.
struct GNUNET_NAMESTORE_ZoneIterator * GNUNET_NAMESTORE_zone_iteration_start(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_IDENTITY_PrivateKey *zone, GNUNET_SCHEDULER_TaskCallback error_cb, void *error_cb_cls, GNUNET_NAMESTORE_RecordMonitor proc, void *proc_cls, GNUNET_SCHEDULER_TaskCallback finish_cb, void *finish_cb_cls)
Starts a new zone iteration (used to periodically PUT all of our records into our DHT)...
void GNUNET_STATISTICS_set(struct GNUNET_STATISTICS_Handle *handle, const char *name, uint64_t value, int make_persistent)
Set statistic value for the peer.
Block for storing record data.
void GNUNET_NAMESTORE_zone_iteration_stop(struct GNUNET_NAMESTORE_ZoneIterator *it)
Stops iteration and releases the namestore handle for further calls.
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
struct GNUNET_TIME_Absolute GNUNET_GNSRECORD_record_get_expiration_time(unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Returns the expiration time of the given block of records.
struct GNUNET_TIME_Relative GNUNET_TIME_relative_min(struct GNUNET_TIME_Relative t1, struct GNUNET_TIME_Relative t2)
Return the minimum of two relative time values.
struct GNUNET_HashCode key
The key used in the DHT.
struct GNUNET_DHT_PutHandle * GNUNET_DHT_put(struct GNUNET_DHT_Handle *handle, const struct GNUNET_HashCode *key, uint32_t desired_replication_level, enum GNUNET_DHT_RouteOption options, enum GNUNET_BLOCK_Type type, size_t size, const void *data, struct GNUNET_TIME_Absolute exp, GNUNET_SCHEDULER_TaskCallback cont, void *cont_cls)
Perform a PUT operation storing data in the DHT.
#define DHT_QUEUE_LIMIT
How many pending DHT operations do we allow at most?
static struct DhtPutActivity * it_head
Head of iteration put activities; kept in a DLL.
struct GNUNET_DHT_Handle * GNUNET_DHT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, unsigned int ht_len)
Initialize the connection with the DHT service.
static struct GNUNET_DHT_Handle * dht_handle
Our handle to the DHT.
struct GNUNET_NAMESTORE_Handle * GNUNET_NAMESTORE_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Connect to the namestore service.
void GNUNET_DHT_disconnect(struct GNUNET_DHT_Handle *handle)
Shutdown connection with the DHT service.
#define GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
Insert an element at the tail of a DLL.
static struct GNUNET_NAMESTORE_ZoneIterator * namestore_iter
Handle to iterate over our authoritative zone in namestore.
static struct GNUNET_TIME_Relative target_iteration_velocity_per_record
What is the frequency at which we currently would like to perform DHT puts (per record)? Calculated in update_velocity() from the zone_publish_time_window() and the total number of record sets we have (so far) observed in the zone.
#define GNUNET_TIME_UNIT_ZERO
Relative time zero.
static void check_zone_namestore_next()
Check if the current zone iteration needs to be continued by calling publish_zone_namestore_next(), and if so with what delay.
static struct GNUNET_SCHEDULER_Task * zone_publish_task
zone publish task
void GNUNET_GNSRECORD_query_from_private_key(const struct GNUNET_IDENTITY_PrivateKey *zone, const char *label, struct GNUNET_HashCode *query)
Calculate the DHT query for a given label in a given zone.
static void publish_zone_dht_start(void *cls)
Periodically iterate over our zone and store everything in dht.
static int cache_keys
Optimize block insertion by caching map of private keys to public keys in memory? ...
struct GNUNET_TIME_Relative GNUNET_TIME_relative_add(struct GNUNET_TIME_Relative a1, struct GNUNET_TIME_Relative a2)
Add relative times together.
static unsigned int ns_iteration_left
How many more values are left for the current query before we need to explicitly ask the namestore fo...
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_time(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, struct GNUNET_TIME_Relative *time)
Get a configuration value that should be a relative time.
static unsigned long long put_cnt
Number of successful put operations performed in the current measurement cycle (as measured in check_...
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_duration(struct GNUNET_TIME_Absolute whence)
Get the duration of an operation as the difference of the current time and the given start time "henc...
static struct GNUNET_NAMESTORE_Handle * namestore_handle
Our handle to the namestore service.
static void run(void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *service)
Performe zonemaster duties: watch namestore, publish records.
#define GNUNET_log(kind,...)
Entry in list of pending tasks.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_yesno(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option)
Get a configuration value that should be in a set of "YES" or "NO".
static struct GNUNET_TIME_Absolute last_put_100
When did we last start measuring the DELTA_INTERVAL successful DHT puts? Used for velocity calculatio...
static void zone_iteration_finished(void *cls)
Zone iteration is completed.
struct GNUNET_TIME_Relative GNUNET_TIME_relative_divide(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Divide relative time by a given factor.
Time for absolute times used by GNUnet, in microseconds.
This expiration time of the record is a relative time (not an absolute time).
const char * GNUNET_STRINGS_absolute_time_to_string(struct GNUNET_TIME_Absolute t)
Like asctime, except for GNUnet time.
struct DhtPutActivity * next
Kept in a DLL.
static struct GNUNET_DHT_PutHandle * perform_dht_put(const struct GNUNET_IDENTITY_PrivateKey *key, const char *label, const struct GNUNET_GNSRECORD_Data *rd_public, unsigned int rd_public_count, struct DhtPutActivity *ma)
Store GNS records in the DHT.
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
Each peer along the way should look at 'enc' (otherwise only the k-peers closest to the key should lo...
#define GNUNET_free(ptr)
Wrapper around free.
Time for relative time used by GNUnet, in microseconds.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.