summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorerdgeist <>2007-11-12 01:38:08 +0000
committererdgeist <>2007-11-12 01:38:08 +0000
commit31f5b923eb65f46773dd52864447fe5cc678b79c (patch)
tree23943f184f35931d9db5767a487da716abff13f6
parent54bdad552e5c997258467492c0c7d022fb428090 (diff)
Fullscrape is thread safe now.
-rw-r--r--ot_fullscrape.c67
-rw-r--r--ot_fullscrape.h11
2 files changed, 78 insertions, 0 deletions
diff --git a/ot_fullscrape.c b/ot_fullscrape.c
new file mode 100644
index 0000000..0571049
--- /dev/null
+++ b/ot_fullscrape.c
@@ -0,0 +1,67 @@
1/* This software was written by Dirk Engling <erdgeist@erdgeist.org>
2 It is considered beerware. Prost. Skol. Cheers or whatever. */
3
4/* System */
5#include <sys/uio.h>
6#include <stdio.h>
7#include <string.h>
8
9/* Libowfat */
10
11/* Opentracker */
12#include "trackerlogic.h"
13#include "ot_mutex.h"
14#include "ot_iovec.h"
15#include "ot_fullscrape.h"
16
17/* Fetch full scrape info for all torrents
18 Full scrapes usually are huge and one does not want to
19 allocate more memory. So lets get them in 1M units
20*/
21#define OT_SCRAPE_CHUNK_SIZE (256*1024)
22
23/* "d8:completei%zde10:downloadedi%zde10:incompletei%zdee" */
24#define OT_FULLSCRAPE_MAXENTRYLEN 100
25
26size_t return_fullscrape_for_tracker( int *iovec_entries, struct iovec **iovector ) {
27 int bucket;
28 size_t j;
29 char *r, *re;
30
31 *iovec_entries = 0;
32 if( !( r = iovec_increase( iovec_entries, iovector, OT_SCRAPE_CHUNK_SIZE ) ) )
33 return 0;
34 re = r + OT_SCRAPE_CHUNK_SIZE;
35
36 memmove( r, "d5:filesd", 9 ); r += 9;
37 for( bucket=0; bucket<OT_BUCKET_COUNT; ++bucket ) {
38 ot_vector *torrents_list = mutex_bucket_lock( bucket );
39 for( j=0; j<torrents_list->size; ++j ) {
40 ot_peerlist *peer_list = ( ((ot_torrent*)(torrents_list->data))[j] ).peer_list;
41 ot_hash *hash =&( ((ot_torrent*)(torrents_list->data))[j] ).hash;
42 if( peer_list->peer_count || peer_list->down_count ) {
43 *r++='2'; *r++='0'; *r++=':';
44 memmove( r, hash, 20 ); r+=20;
45 r += sprintf( r, "d8:completei%zde10:downloadedi%zde10:incompletei%zdee", peer_list->seed_count, peer_list->down_count, peer_list->peer_count-peer_list->seed_count );
46 }
47
48 if( re - r <= OT_FULLSCRAPE_MAXENTRYLEN ) {
49 iovec_fixlast( iovec_entries, iovector, OT_SCRAPE_CHUNK_SIZE - ( re - r ) );
50 if( !( r = iovec_increase( iovec_entries, iovector, OT_SCRAPE_CHUNK_SIZE ) ) ) {
51 iovec_free( iovec_entries, iovector );
52 mutex_bucket_unlock( bucket );
53 return 0;
54 }
55 re = r + OT_SCRAPE_CHUNK_SIZE;
56 }
57
58 }
59 mutex_bucket_unlock( bucket );
60 }
61
62 *r++='e'; *r++='e';
63
64 iovec_fixlast( iovec_entries, iovector, OT_SCRAPE_CHUNK_SIZE - ( re - r ) );
65
66 return iovec_length( iovec_entries, iovector );
67}
diff --git a/ot_fullscrape.h b/ot_fullscrape.h
new file mode 100644
index 0000000..6411c2b
--- /dev/null
+++ b/ot_fullscrape.h
@@ -0,0 +1,11 @@
1/* This software was written by Dirk Engling <erdgeist@erdgeist.org>
2 It is considered beerware. Prost. Skol. Cheers or whatever. */
3
4#ifndef __OT_FULLSCRAPE_H__
5#define __OT_FULLSCRAPE_H__
6
7#include <sys/uio.h>
8
9size_t return_fullscrape_for_tracker( int *iovec_entries, struct iovec **iovector );
10
11#endif \ No newline at end of file