GNUnet  0.10.x
Data Structures | Macros | Functions | Variables
gnunet-service-fs_push.c File Reference

API to push content from our datastore to other peers ('anonymous'-content P2P migration) More...

#include "platform.h"
#include "gnunet-service-fs.h"
#include "gnunet-service-fs_cp.h"
#include "gnunet-service-fs_indexing.h"
#include "gnunet-service-fs_push.h"
Include dependency graph for gnunet-service-fs_push.c:

Go to the source code of this file.

Data Structures

struct  MigrationReadyBlock
 Block that is ready for migration to other peers. More...
 
struct  MigrationReadyPeer
 Information about a peer waiting for migratable data. More...
 

Macros

#define MAX_MIGRATION_QUEUE   8
 Maximum number of blocks we keep in memory for migration. More...
 
#define MIGRATION_LIST_SIZE   2
 Blocks are at most migrated to this number of peers plus one, each time they are fetched from the database. More...
 
#define MIN_MIGRATION_CONTENT_LIFETIME   GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MINUTES, 30)
 How long must content remain valid for us to consider it for migration? If content will expire too soon, there is clearly no point in pushing it to other peers. More...
 

Functions

static void delete_migration_block (struct MigrationReadyBlock *mb)
 Delete the given migration block. More...
 
static void find_content (void *cls)
 Find content for migration to this peer. More...
 
static int transmit_content (struct MigrationReadyPeer *mrp, struct MigrationReadyBlock *block)
 Send the given block to the given peer. More...
 
static unsigned int count_targets (struct MigrationReadyBlock *block)
 Count the number of peers this block has already been forwarded to. More...
 
static long score_content (struct MigrationReadyPeer *mrp, struct MigrationReadyBlock *block)
 Check if sending this block to this peer would be a good idea. More...
 
static void consider_gathering (void)
 If the migration task is not currently running, consider (re)scheduling it with the appropriate delay. More...
 
static void gather_migration_blocks (void *cls)
 Task that is run periodically to obtain blocks for content migration. More...
 
static void process_migration_content (void *cls, const struct GNUNET_HashCode *key, size_t size, const void *data, enum GNUNET_BLOCK_Type type, uint32_t priority, uint32_t anonymity, uint32_t replication, struct GNUNET_TIME_Absolute expiration, uint64_t uid)
 Process content offered for migration. More...
 
void GSF_push_start_ (struct GSF_ConnectedPeer *peer)
 A peer connected to us. More...
 
void GSF_push_stop_ (struct GSF_ConnectedPeer *peer)
 A peer disconnected from us. More...
 
void GSF_push_init_ ()
 Setup the module. More...
 
void GSF_push_done_ ()
 Shutdown the module. More...
 

Variables

static struct MigrationReadyBlockmig_head
 Head of linked list of blocks that can be migrated. More...
 
static struct MigrationReadyBlockmig_tail
 Tail of linked list of blocks that can be migrated. More...
 
static struct MigrationReadyPeerpeer_head
 Head of linked list of peers. More...
 
static struct MigrationReadyPeerpeer_tail
 Tail of linked list of peers. More...
 
static struct GNUNET_DATASTORE_QueueEntrymig_qe
 Request to datastore for migration (or NULL). More...
 
static struct GNUNET_SCHEDULER_Taskmig_task
 ID of task that collects blocks for migration. More...
 
static struct GNUNET_TIME_Relative min_migration_delay
 What is the maximum frequency at which we are allowed to poll the datastore for migration content? More...
 
static unsigned int mig_size
 Size of the doubly-linked list of migration blocks. More...
 
static int enabled
 Is this module enabled? More...
 
static int value_found
 Did we find anything in the datastore? More...
 

Detailed Description

API to push content from our datastore to other peers ('anonymous'-content P2P migration)

Author
Christian Grothoff

Definition in file gnunet-service-fs_push.c.

Macro Definition Documentation

◆ MAX_MIGRATION_QUEUE

#define MAX_MIGRATION_QUEUE   8

Maximum number of blocks we keep in memory for migration.

Definition at line 37 of file gnunet-service-fs_push.c.

Referenced by consider_gathering(), find_content(), gather_migration_blocks(), and process_migration_content().

◆ MIGRATION_LIST_SIZE

#define MIGRATION_LIST_SIZE   2

Blocks are at most migrated to this number of peers plus one, each time they are fetched from the database.

Definition at line 43 of file gnunet-service-fs_push.c.

Referenced by count_targets(), delete_migration_block(), score_content(), and transmit_content().

◆ MIN_MIGRATION_CONTENT_LIFETIME

#define MIN_MIGRATION_CONTENT_LIFETIME   GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MINUTES, 30)

How long must content remain valid for us to consider it for migration? If content will expire too soon, there is clearly no point in pushing it to other peers.

This value gives the threshold for migration. Note that if this value is increased, the migration testcase may need to be adjusted as well (especially the CONTENT_LIFETIME in fs_test_lib.c).

Definition at line 52 of file gnunet-service-fs_push.c.

Referenced by process_migration_content().

Function Documentation

◆ delete_migration_block()

static void delete_migration_block ( struct MigrationReadyBlock mb)
static

Delete the given migration block.

Parameters
mbblock to delete

Definition at line 186 of file gnunet-service-fs_push.c.

References find_content(), GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_PEER_decrement_rcs(), mig_size, MIGRATION_LIST_SIZE, and MigrationReadyBlock::target_list.

Referenced by find_content(), GSF_push_done_(), and transmit_content().

187 {
189  mig_tail,
190  mb);
193  mig_size--;
194  GNUNET_free(mb);
195 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define MIGRATION_LIST_SIZE
Blocks are at most migrated to this number of peers plus one, each time they are fetched from the dat...
static struct MigrationReadyBlock * mig_head
Head of linked list of blocks that can be migrated.
static struct MigrationReadyBlock * mig_tail
Tail of linked list of blocks that can be migrated.
GNUNET_PEER_Id target_list[2]
Peers we already forwarded this block to.
void GNUNET_PEER_decrement_rcs(const GNUNET_PEER_Id *ids, unsigned int count)
Decrement multiple RCs of peer identities by one.
Definition: peer.c:162
static unsigned int mig_size
Size of the doubly-linked list of migration blocks.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ find_content()

static void find_content ( void *  cls)
static

Find content for migration to this peer.

Parameters
clsa struct MigrationReadyPeer *
clspeer to find content for

Definition at line 331 of file gnunet-service-fs_push.c.

References consider_gathering(), count_targets(), delete_migration_block(), MigrationReadyPeer::env, gather_migration_blocks(), GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, MAX_MIGRATION_QUEUE, mig_head, mig_size, MigrationReadyBlock::next, score_content(), and transmit_content().

Referenced by delete_migration_block(), GSF_push_start_(), and transmit_content().

332 {
333  struct MigrationReadyPeer *mrp = cls;
334  struct MigrationReadyBlock *pos;
335  long score;
336  long best_score;
337  struct MigrationReadyBlock *best;
338 
339  mrp->env = NULL;
340  best = NULL;
341  best_score = -1;
342  pos = mig_head;
343  while (NULL != pos)
344  {
345  score = score_content(mrp, pos);
346  if (score > best_score)
347  {
348  best_score = score;
349  best = pos;
350  }
351  pos = pos->next;
352  }
353  if (NULL == best)
354  {
356  {
358  "No content found for pushing, waiting for queue to fill\n");
359  return; /* will fill up eventually... */
360  }
362  "No suitable content found, purging content from full queue\n");
363  /* failed to find migration target AND
364  * queue is full, purge most-forwarded
365  * block from queue to make room for more */
366  pos = mig_head;
367  while (NULL != pos)
368  {
369  score = count_targets(pos);
370  if (score >= best_score)
371  {
372  best_score = score;
373  best = pos;
374  }
375  pos = pos->next;
376  }
377  GNUNET_assert(NULL != best);
380  return;
381  }
383  "Preparing to push best content to peer\n");
384  transmit_content(mrp,
385  best);
386 }
static long score_content(struct MigrationReadyPeer *mrp, struct MigrationReadyBlock *block)
Check if sending this block to this peer would be a good idea.
#define MAX_MIGRATION_QUEUE
Maximum number of blocks we keep in memory for migration.
struct GNUNET_MQ_Envelope * env
Envelope of the currently pushed message.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
Information about a peer waiting for migratable data.
static int transmit_content(struct MigrationReadyPeer *mrp, struct MigrationReadyBlock *block)
Send the given block to the given peer.
static struct MigrationReadyBlock * mig_head
Head of linked list of blocks that can be migrated.
Block that is ready for migration to other peers.
static void delete_migration_block(struct MigrationReadyBlock *mb)
Delete the given migration block.
static void consider_gathering(void)
If the migration task is not currently running, consider (re)scheduling it with the appropriate delay...
struct MigrationReadyBlock * next
This is a doubly-linked list.
static unsigned int mig_size
Size of the doubly-linked list of migration blocks.
#define GNUNET_log(kind,...)
static unsigned int count_targets(struct MigrationReadyBlock *block)
Count the number of peers this block has already been forwarded to.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transmit_content()

static int transmit_content ( struct MigrationReadyPeer mrp,
struct MigrationReadyBlock block 
)
static

Send the given block to the given peer.

Parameters
peertarget peer
blockthe block
Returns
GNUNET_YES if the block was deleted (!)

Definition at line 215 of file gnunet-service-fs_push.c.

References delete_migration_block(), MigrationReadyPeer::env, MigrationReadyBlock::expiration, PutMessage::expiration, find_content(), GNUNET_assert, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_FS_PUT, GNUNET_MQ_msg_extra, GNUNET_MQ_notify_sent(), GNUNET_NO, GNUNET_PEER_change_rc(), GNUNET_TIME_absolute_hton(), GNUNET_YES, GSF_get_peer_performance_data_(), GSF_peer_transmit_(), MIGRATION_LIST_SIZE, msg, MigrationReadyPeer::peer, GSF_PeerPerformanceData::pid, ret, MigrationReadyBlock::size, MigrationReadyBlock::target_list, MigrationReadyBlock::type, and PutMessage::type.

Referenced by find_content(), and process_migration_content().

217 {
218  struct PutMessage *msg;
219  unsigned int i;
220  struct GSF_PeerPerformanceData *ppd;
221  int ret;
222 
224  GNUNET_assert(NULL == mrp->env);
225  mrp->env = GNUNET_MQ_msg_extra(msg,
226  block->size,
228  msg->type = htonl(block->type);
230  GNUNET_memcpy(&msg[1],
231  &block[1],
232  block->size);
233  for (i = 0; i < MIGRATION_LIST_SIZE; i++)
234  {
235  if (block->target_list[i] == 0)
236  {
237  block->target_list[i] = ppd->pid;
239  1);
240  break;
241  }
242  }
243  if (MIGRATION_LIST_SIZE == i)
244  {
245  delete_migration_block(block);
246  ret = GNUNET_YES;
247  }
248  else
249  {
250  ret = GNUNET_NO;
251  }
253  &find_content,
254  mrp);
256  GNUNET_NO,
257  0 /* priority */,
258  mrp->env);
259  return ret;
260 }
#define MIGRATION_LIST_SIZE
Blocks are at most migrated to this number of peers plus one, each time they are fetched from the dat...
struct GSF_ConnectedPeer * peer
Handle to peer.
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
struct GNUNET_MQ_Envelope * env
Envelope of the currently pushed message.
Response from FS service with a result for a previous FS search.
Definition: fs.h:321
struct GNUNET_TIME_AbsoluteNBO expiration
When does this result expire?
Definition: fs.h:335
struct GNUNET_TIME_Absolute expiration
When does this block expire?
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
void GSF_peer_transmit_(struct GSF_ConnectedPeer *cp, int is_query, uint32_t priority, struct GNUNET_MQ_Envelope *env)
Transmit a message to the given peer as soon as possible.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_NO
Definition: gnunet_common.h:78
enum GNUNET_BLOCK_Type type
Type of the block.
static int ret
Final status code.
Definition: gnunet-arm.c:89
static void delete_migration_block(struct MigrationReadyBlock *mb)
Delete the given migration block.
GNUNET_PEER_Id target_list[2]
Peers we already forwarded this block to.
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct...
Definition: gnunet_mq_lib.h:52
void GNUNET_MQ_notify_sent(struct GNUNET_MQ_Envelope *ev, GNUNET_SCHEDULER_TaskCallback cb, void *cb_cls)
Call a callback once the envelope has been sent, that is, sending it can not be canceled anymore...
Definition: mq.c:772
struct GSF_PeerPerformanceData * GSF_get_peer_performance_data_(struct GSF_ConnectedPeer *cp)
Return the performance data record for the given peer.
uint32_t type
Type of the block (in big endian).
Definition: fs.h:330
GNUNET_PEER_Id pid
The peer&#39;s identity (interned version).
Performance data kept for a peer.
void GNUNET_PEER_change_rc(GNUNET_PEER_Id id, int delta)
Change the reference counter of an interned PID.
Definition: peer.c:197
#define GNUNET_YES
Definition: gnunet_common.h:77
static void find_content(void *cls)
Find content for migration to this peer.
struct GNUNET_TIME_AbsoluteNBO GNUNET_TIME_absolute_hton(struct GNUNET_TIME_Absolute a)
Convert absolute time to network byte order.
Definition: time.c:655
#define GNUNET_MESSAGE_TYPE_FS_PUT
P2P response with content or active migration of content.
size_t size
Size of the block.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ count_targets()

static unsigned int count_targets ( struct MigrationReadyBlock block)
static

Count the number of peers this block has already been forwarded to.

Parameters
blockthe block
Returns
number of times block was forwarded

Definition at line 271 of file gnunet-service-fs_push.c.

References MIGRATION_LIST_SIZE, and MigrationReadyBlock::target_list.

Referenced by find_content().

272 {
273  unsigned int i;
274 
275  for (i = 0; i < MIGRATION_LIST_SIZE; i++)
276  if (block->target_list[i] == 0)
277  return i;
278  return i;
279 }
#define MIGRATION_LIST_SIZE
Blocks are at most migrated to this number of peers plus one, each time they are fetched from the dat...
GNUNET_PEER_Id target_list[2]
Peers we already forwarded this block to.
Here is the caller graph for this function:

◆ score_content()

static long score_content ( struct MigrationReadyPeer mrp,
struct MigrationReadyBlock block 
)
static

Check if sending this block to this peer would be a good idea.

Parameters
mrptarget peer
blockthe block
Returns
score (>= 0: feasible, negative: infeasible)

Definition at line 291 of file gnunet-service-fs_push.c.

References consider_gathering(), GNUNET_assert, GNUNET_CRYPTO_hash(), GNUNET_CRYPTO_hash_distance_u32(), GNUNET_PEER_resolve(), GSF_get_peer_performance_data_(), MIGRATION_LIST_SIZE, MigrationReadyPeer::peer, GSF_PeerPerformanceData::pid, MigrationReadyBlock::query, and MigrationReadyBlock::target_list.

Referenced by find_content().

293 {
294  unsigned int i;
295  struct GSF_PeerPerformanceData *ppd;
296  struct GNUNET_PeerIdentity id;
297  struct GNUNET_HashCode hc;
298  uint32_t dist;
299 
301  for (i = 0; i < MIGRATION_LIST_SIZE; i++)
302  if (block->target_list[i] == ppd->pid)
303  return -1;
304  GNUNET_assert(0 != ppd->pid);
306  &id);
307  GNUNET_CRYPTO_hash(&id,
308  sizeof(struct GNUNET_PeerIdentity),
309  &hc);
310  dist = GNUNET_CRYPTO_hash_distance_u32(&block->query,
311  &hc);
312  /* closer distance, higher score: */
313  return UINT32_MAX - dist;
314 }
#define MIGRATION_LIST_SIZE
Blocks are at most migrated to this number of peers plus one, each time they are fetched from the dat...
struct GSF_ConnectedPeer * peer
Handle to peer.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
static struct GNUNET_IDENTITY_Handle * id
Handle to identity service.
uint32_t GNUNET_CRYPTO_hash_distance_u32(const struct GNUNET_HashCode *a, const struct GNUNET_HashCode *b)
Compute the distance between 2 hashcodes.
Definition: crypto_hash.c:121
void GNUNET_PEER_resolve(GNUNET_PEER_Id id, struct GNUNET_PeerIdentity *pid)
Convert an interned PID to a normal peer identity.
Definition: peer.c:225
GNUNET_PEER_Id target_list[2]
Peers we already forwarded this block to.
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:44
struct GSF_PeerPerformanceData * GSF_get_peer_performance_data_(struct GSF_ConnectedPeer *cp)
Return the performance data record for the given peer.
A 512-bit hashcode.
GNUNET_PEER_Id pid
The peer&#39;s identity (interned version).
The identity of the host (wraps the signing key of the peer).
Performance data kept for a peer.
struct GNUNET_HashCode query
Query for the block.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ consider_gathering()

static void consider_gathering ( void  )
static

If the migration task is not currently running, consider (re)scheduling it with the appropriate delay.

Definition at line 404 of file gnunet-service-fs_push.c.

References gather_migration_blocks(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_NO, GNUNET_SCHEDULER_add_delayed(), GNUNET_TIME_relative_divide(), GNUNET_TIME_relative_max(), GNUNET_TIME_relative_multiply(), GNUNET_TIME_UNIT_SECONDS, GSF_dsh, MAX_MIGRATION_QUEUE, mig_size, min_migration_delay, and value_found.

Referenced by find_content(), gather_migration_blocks(), GSF_push_init_(), process_migration_content(), and score_content().

405 {
407 
408  if (NULL == GSF_dsh)
409  return;
410  if (NULL != mig_qe)
411  return;
412  if (NULL != mig_task)
413  return;
415  return;
417  mig_size);
422  if (GNUNET_NO == value_found)
423  {
424  /* wait at least 5s if the datastore is empty */
427  5));
428  }
430  "Scheduling gathering task (queue size: %u)\n",
431  mig_size);
434  NULL);
435 }
#define MAX_MIGRATION_QUEUE
Maximum number of blocks we keep in memory for migration.
static struct GNUNET_DATASTORE_QueueEntry * mig_qe
Request to datastore for migration (or NULL).
struct GNUNET_TIME_Relative GNUNET_TIME_relative_max(struct GNUNET_TIME_Relative t1, struct GNUNET_TIME_Relative t2)
Return the maximum of two relative time values.
Definition: time.c:287
#define GNUNET_TIME_UNIT_SECONDS
One second.
#define GNUNET_NO
Definition: gnunet_common.h:78
static struct GNUNET_SCHEDULER_Task * mig_task
ID of task that collects blocks for migration.
static struct GNUNET_TIME_Relative min_migration_delay
What is the maximum frequency at which we are allowed to poll the datastore for migration content...
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.
Definition: scheduler.c:1237
struct GNUNET_TIME_Relative GNUNET_TIME_relative_multiply(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Multiply relative time by a given factor.
Definition: time.c:440
static int value_found
Did we find anything in the datastore?
struct GNUNET_DATASTORE_Handle * GSF_dsh
Our connection to the datastore.
static struct GNUNET_TIME_Relative delay
When should dkg communication start?
static unsigned int mig_size
Size of the doubly-linked list of migration blocks.
#define GNUNET_log(kind,...)
struct GNUNET_TIME_Relative GNUNET_TIME_relative_divide(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Divide relative time by a given factor.
Definition: time.c:525
static void gather_migration_blocks(void *cls)
Task that is run periodically to obtain blocks for content migration.
Time for relative time used by GNUnet, in microseconds.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ gather_migration_blocks()

static void gather_migration_blocks ( void *  cls)
static

Task that is run periodically to obtain blocks for content migration.

Parameters
clsunused

Definition at line 540 of file gnunet-service-fs_push.c.

References consider_gathering(), GNUNET_DATASTORE_get_for_replication(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_NO, GSF_dsh, MAX_MIGRATION_QUEUE, mig_size, process_migration_content(), and value_found.

Referenced by consider_gathering(), and find_content().

541 {
542  mig_task = NULL;
544  return;
545  if (NULL == GSF_dsh)
546  return;
548  "Asking datastore for content for replication (queue size: %u)\n",
549  mig_size);
552  0,
553  UINT_MAX,
555  NULL);
556  if (NULL == mig_qe)
558 }
#define MAX_MIGRATION_QUEUE
Maximum number of blocks we keep in memory for migration.
static struct GNUNET_DATASTORE_QueueEntry * mig_qe
Request to datastore for migration (or NULL).
#define GNUNET_NO
Definition: gnunet_common.h:78
static struct GNUNET_SCHEDULER_Task * mig_task
ID of task that collects blocks for migration.
static void consider_gathering(void)
If the migration task is not currently running, consider (re)scheduling it with the appropriate delay...
static int value_found
Did we find anything in the datastore?
struct GNUNET_DATASTORE_Handle * GSF_dsh
Our connection to the datastore.
static void process_migration_content(void *cls, const struct GNUNET_HashCode *key, size_t size, const void *data, enum GNUNET_BLOCK_Type type, uint32_t priority, uint32_t anonymity, uint32_t replication, struct GNUNET_TIME_Absolute expiration, uint64_t uid)
Process content offered for migration.
static unsigned int mig_size
Size of the doubly-linked list of migration blocks.
#define GNUNET_log(kind,...)
struct GNUNET_DATASTORE_QueueEntry * GNUNET_DATASTORE_get_for_replication(struct GNUNET_DATASTORE_Handle *h, unsigned int queue_priority, unsigned int max_queue_size, GNUNET_DATASTORE_DatumProcessor proc, void *proc_cls)
Get a random value from the datastore for content replication.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ process_migration_content()

static void process_migration_content ( void *  cls,
const struct GNUNET_HashCode key,
size_t  size,
const void *  data,
enum GNUNET_BLOCK_Type  type,
uint32_t  priority,
uint32_t  anonymity,
uint32_t  replication,
struct GNUNET_TIME_Absolute  expiration,
uint64_t  uid 
)
static

Process content offered for migration.

Parameters
clsclosure
keykey for the content
sizenumber of bytes in data
datacontent stored
typetype of the content
prioritypriority of the content
anonymityanonymity-level for the content
replicationreplication-level for the content
expirationexpiration time for the content
uidunique identifier for the datum; maybe 0 if no unique identifier is available

Definition at line 454 of file gnunet-service-fs_push.c.

References consider_gathering(), MigrationReadyPeer::env, MigrationReadyBlock::expiration, GNUNET_BLOCK_TYPE_FS_ONDEMAND, GNUNET_CONTAINER_DLL_insert_after, GNUNET_ERROR_TYPE_DEBUG, GNUNET_FS_handle_on_demand_block(), GNUNET_h2s(), GNUNET_i2s(), GNUNET_log, GNUNET_malloc, GNUNET_memcpy, GNUNET_OK, GNUNET_TIME_absolute_get_remaining(), GNUNET_YES, GSF_connected_peer_get_identity2_(), key, MAX_MIGRATION_QUEUE, mig_size, MIN_MIGRATION_CONTENT_LIFETIME, MigrationReadyPeer::next, MigrationReadyPeer::peer, MigrationReadyBlock::query, MigrationReadyBlock::size, transmit_content(), MigrationReadyBlock::type, and value_found.

Referenced by gather_migration_blocks().

464 {
465  struct MigrationReadyBlock *mb;
466  struct MigrationReadyPeer *pos;
467 
468  mig_qe = NULL;
469  if (NULL == key)
470  {
472  "No content found for migration...\n");
474  return;
475  }
477  if (GNUNET_TIME_absolute_get_remaining(expiration).rel_value_us <
478  MIN_MIGRATION_CONTENT_LIFETIME.rel_value_us)
479  {
480  /* content will expire soon, don't bother */
482  return;
483  }
485  {
486  if (GNUNET_OK !=
488  size,
489  data,
490  type,
491  priority,
492  anonymity,
493  replication,
494  expiration,
495  uid,
497  NULL))
499  return;
500  }
502  "Retrieved block `%s' of type %u for migration (queue size: %u/%u)\n",
503  GNUNET_h2s(key),
504  type, mig_size + 1,
506  mb = GNUNET_malloc(sizeof(struct MigrationReadyBlock) + size);
507  mb->query = *key;
508  mb->expiration = expiration;
509  mb->size = size;
510  mb->type = type;
511  GNUNET_memcpy(&mb[1], data, size);
513  mig_tail,
514  mig_tail,
515  mb);
516  mig_size++;
517  for (pos = peer_head; NULL != pos; pos = pos->next)
518  {
520  "Preparing to push best content to peer %s\n",
522  if ((NULL == pos->env) &&
524  mb)))
525  {
526  break; /* 'mb' was freed! */
527  }
528  }
530 }
struct GSF_ConnectedPeer * peer
Handle to peer.
#define MAX_MIGRATION_QUEUE
Maximum number of blocks we keep in memory for migration.
struct GNUNET_MQ_Envelope * env
Envelope of the currently pushed message.
static char * expiration
Credential TTL.
static struct GNUNET_DATASTORE_QueueEntry * mig_qe
Request to datastore for migration (or NULL).
struct GNUNET_TIME_Absolute expiration
When does this block expire?
static unsigned int replication
Information about a peer waiting for migratable data.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
static int transmit_content(struct MigrationReadyPeer *mrp, struct MigrationReadyBlock *block)
Send the given block to the given peer.
enum GNUNET_BLOCK_Type type
Type of the block.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static struct MigrationReadyBlock * mig_head
Head of linked list of blocks that can be migrated.
Block that is ready for migration to other peers.
static struct MigrationReadyBlock * mig_tail
Tail of linked list of blocks that can be migrated.
Type of a block representing a block to be encoded on demand from disk.
static void consider_gathering(void)
If the migration task is not currently running, consider (re)scheduling it with the appropriate delay...
#define MIN_MIGRATION_CONTENT_LIFETIME
How long must content remain valid for us to consider it for migration? If content will expire too so...
#define GNUNET_CONTAINER_DLL_insert_after(head, tail, other, element)
Insert an element into a DLL after the given other element.
static int value_found
Did we find anything in the datastore?
struct MigrationReadyPeer * next
This is a doubly-linked list.
struct GNUNET_HashCode key
The key used in the DHT.
static unsigned int size
Size of the "table".
Definition: peer.c:66
static void process_migration_content(void *cls, const struct GNUNET_HashCode *key, size_t size, const void *data, enum GNUNET_BLOCK_Type type, uint32_t priority, uint32_t anonymity, uint32_t replication, struct GNUNET_TIME_Absolute expiration, uint64_t uid)
Process content offered for migration.
static unsigned int mig_size
Size of the doubly-linked list of migration blocks.
const struct GNUNET_PeerIdentity * GSF_connected_peer_get_identity2_(const struct GSF_ConnectedPeer *cp)
Obtain the identity of a connected peer.
#define GNUNET_log(kind,...)
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_remaining(struct GNUNET_TIME_Absolute future)
Given a timestamp in the future, how much time remains until then?
Definition: time.c:331
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
#define GNUNET_YES
Definition: gnunet_common.h:77
static unsigned int anonymity
struct GNUNET_HashCode query
Query for the block.
int GNUNET_FS_handle_on_demand_block(const struct GNUNET_HashCode *key, uint32_t size, const void *data, enum GNUNET_BLOCK_Type type, uint32_t priority, uint32_t anonymity, uint32_t replication, struct GNUNET_TIME_Absolute expiration, uint64_t uid, GNUNET_DATASTORE_DatumProcessor cont, void *cont_cls)
We&#39;ve received an on-demand encoded block from the datastore.
uint32_t data
The data value.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
static struct MigrationReadyPeer * peer_head
Head of linked list of peers.
size_t size
Size of the block.
#define GNUNET_malloc(size)
Wrapper around malloc.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GSF_push_start_()

void GSF_push_start_ ( struct GSF_ConnectedPeer peer)

A peer connected to us.

A peer connected to us or we are now again allowed to push content.

Start pushing content to this peer.

Parameters
peerhandle for the peer that connected

Definition at line 568 of file gnunet-service-fs_push.c.

References enabled, find_content(), GNUNET_break, GNUNET_CONTAINER_DLL_insert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, GNUNET_new, GNUNET_YES, GSF_connected_peer_get_identity2_(), MigrationReadyPeer::next, peer, and MigrationReadyPeer::peer.

Referenced by peer_respect_cb(), and revive_migration().

569 {
570  struct MigrationReadyPeer *mrp;
571 
572  if (GNUNET_YES != enabled)
573  return;
574  for (mrp = peer_head; NULL != mrp; mrp = mrp->next)
575  if (mrp->peer == peer)
576  break;
577  if (NULL != mrp)
578  {
579  /* same peer added twice, must not happen */
580  GNUNET_break(0);
581  return;
582  }
583 
585  "Adding peer %s to list for pushing\n",
587 
588  mrp = GNUNET_new(struct MigrationReadyPeer);
589  mrp->peer = peer;
590  find_content(mrp);
592  peer_tail,
593  mrp);
594 }
struct GSF_ConnectedPeer * peer
Handle to peer.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
static struct MigrationReadyPeer * peer_tail
Tail of linked list of peers.
Information about a peer waiting for migratable data.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static int enabled
Is this module enabled?
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct MigrationReadyPeer * next
This is a doubly-linked list.
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.
const struct GNUNET_PeerIdentity * GSF_connected_peer_get_identity2_(const struct GSF_ConnectedPeer *cp)
Obtain the identity of a connected peer.
#define GNUNET_log(kind,...)
#define GNUNET_YES
Definition: gnunet_common.h:77
static void find_content(void *cls)
Find content for migration to this peer.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
static struct MigrationReadyPeer * peer_head
Head of linked list of peers.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GSF_push_stop_()

void GSF_push_stop_ ( struct GSF_ConnectedPeer peer)

A peer disconnected from us.

A peer disconnected from us or asked us to stop pushing content for a while.

Stop pushing content to this peer.

Parameters
peerhandle for the peer that disconnected

Definition at line 604 of file gnunet-service-fs_push.c.

References MigrationReadyPeer::env, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_MQ_send_cancel(), MigrationReadyPeer::next, and MigrationReadyPeer::peer.

Referenced by GSF_peer_disconnect_handler(), and handle_p2p_migration_stop().

605 {
606  struct MigrationReadyPeer *pos;
607 
608  for (pos = peer_head; NULL != pos; pos = pos->next)
609  if (pos->peer == peer)
610  break;
611  if (NULL == pos)
612  return;
613  if (NULL != pos->env)
616  peer_tail,
617  pos);
618  GNUNET_free(pos);
619 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct GSF_ConnectedPeer * peer
Handle to peer.
struct GNUNET_MQ_Envelope * env
Envelope of the currently pushed message.
static struct MigrationReadyPeer * peer_tail
Tail of linked list of peers.
Information about a peer waiting for migratable data.
struct MigrationReadyPeer * next
This is a doubly-linked list.
void GNUNET_MQ_send_cancel(struct GNUNET_MQ_Envelope *ev)
Cancel sending the message.
Definition: mq.c:913
static struct MigrationReadyPeer * peer_head
Head of linked list of peers.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GSF_push_init_()

void GSF_push_init_ ( void  )

Setup the module.

Definition at line 626 of file gnunet-service-fs_push.c.

References _, consider_gathering(), enabled, GNUNET_CONFIGURATION_get_value_time(), GNUNET_CONFIGURATION_get_value_yesno(), GNUNET_ERROR_TYPE_WARNING, GNUNET_log_config_invalid(), GNUNET_OK, GNUNET_YES, GSF_cfg, and min_migration_delay.

Referenced by run().

627 {
628  enabled =
630  "FS",
631  "CONTENT_PUSHING");
632  if (GNUNET_YES != enabled)
633  return;
634 
635  if (GNUNET_OK !=
637  "fs",
638  "MIN_MIGRATION_DELAY",
640  {
642  "fs",
643  "MIN_MIGRATION_DELAY",
644  _("time required, content pushing disabled"));
645  return;
646  }
648 }
int 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.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
void GNUNET_log_config_invalid(enum GNUNET_ErrorType kind, const char *section, const char *option, const char *required)
Log error message about invalid configuration option value.
static int enabled
Is this module enabled?
static struct GNUNET_TIME_Relative min_migration_delay
What is the maximum frequency at which we are allowed to poll the datastore for migration content...
const struct GNUNET_CONFIGURATION_Handle * GSF_cfg
Our configuration.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
static void consider_gathering(void)
If the migration task is not currently running, consider (re)scheduling it with the appropriate delay...
#define GNUNET_YES
Definition: gnunet_common.h:77
int 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".
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GSF_push_done_()

void GSF_push_done_ ( void  )

Shutdown the module.

Definition at line 655 of file gnunet-service-fs_push.c.

References delete_migration_block(), GNUNET_assert, GNUNET_DATASTORE_cancel(), GNUNET_SCHEDULER_cancel(), and mig_size.

Referenced by shutdown_task().

656 {
657  if (NULL != mig_task)
658  {
660  mig_task = NULL;
661  }
662  if (NULL != mig_qe)
663  {
665  mig_qe = NULL;
666  }
667  while (NULL != mig_head)
669  GNUNET_assert(0 == mig_size);
670 }
static struct GNUNET_DATASTORE_QueueEntry * mig_qe
Request to datastore for migration (or NULL).
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
static struct MigrationReadyBlock * mig_head
Head of linked list of blocks that can be migrated.
static struct GNUNET_SCHEDULER_Task * mig_task
ID of task that collects blocks for migration.
static void delete_migration_block(struct MigrationReadyBlock *mb)
Delete the given migration block.
void GNUNET_DATASTORE_cancel(struct GNUNET_DATASTORE_QueueEntry *qe)
Cancel a datastore operation.
static unsigned int mig_size
Size of the doubly-linked list of migration blocks.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:956
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ mig_head

struct MigrationReadyBlock* mig_head
static

Head of linked list of blocks that can be migrated.

Definition at line 131 of file gnunet-service-fs_push.c.

Referenced by find_content().

◆ mig_tail

struct MigrationReadyBlock* mig_tail
static

Tail of linked list of blocks that can be migrated.

Definition at line 136 of file gnunet-service-fs_push.c.

◆ peer_head

struct MigrationReadyPeer* peer_head
static

Head of linked list of peers.

Definition at line 141 of file gnunet-service-fs_push.c.

◆ peer_tail

struct MigrationReadyPeer* peer_tail
static

Tail of linked list of peers.

Definition at line 146 of file gnunet-service-fs_push.c.

◆ mig_qe

struct GNUNET_DATASTORE_QueueEntry* mig_qe
static

Request to datastore for migration (or NULL).

Definition at line 151 of file gnunet-service-fs_push.c.

◆ mig_task

struct GNUNET_SCHEDULER_Task* mig_task
static

ID of task that collects blocks for migration.

Definition at line 156 of file gnunet-service-fs_push.c.

◆ min_migration_delay

struct GNUNET_TIME_Relative min_migration_delay
static

What is the maximum frequency at which we are allowed to poll the datastore for migration content?

Definition at line 162 of file gnunet-service-fs_push.c.

Referenced by consider_gathering(), and GSF_push_init_().

◆ mig_size

unsigned int mig_size
static

Size of the doubly-linked list of migration blocks.

Definition at line 167 of file gnunet-service-fs_push.c.

Referenced by consider_gathering(), delete_migration_block(), find_content(), gather_migration_blocks(), GSF_push_done_(), and process_migration_content().

◆ enabled

int enabled
static

Is this module enabled?

Definition at line 172 of file gnunet-service-fs_push.c.

Referenced by GSF_push_init_(), and GSF_push_start_().

◆ value_found

int value_found
static

Did we find anything in the datastore?

Definition at line 177 of file gnunet-service-fs_push.c.

Referenced by consider_gathering(), gather_migration_blocks(), and process_migration_content().