diff options
author | erdgeist <> | 2007-11-12 01:38:08 +0000 |
---|---|---|
committer | erdgeist <> | 2007-11-12 01:38:08 +0000 |
commit | 31f5b923eb65f46773dd52864447fe5cc678b79c (patch) | |
tree | 23943f184f35931d9db5767a487da716abff13f6 | |
parent | 54bdad552e5c997258467492c0c7d022fb428090 (diff) |
Fullscrape is thread safe now.
-rw-r--r-- | ot_fullscrape.c | 67 | ||||
-rw-r--r-- | ot_fullscrape.h | 11 |
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 | |||
26 | size_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 | |||
9 | size_t return_fullscrape_for_tracker( int *iovec_entries, struct iovec **iovector ); | ||
10 | |||
11 | #endif \ No newline at end of file | ||