summaryrefslogtreecommitdiff
path: root/ot_fullscrape.c
diff options
context:
space:
mode:
authorDirk Engling <erdgeist@erdgeist.org>2024-04-13 00:47:29 +0200
committerDirk Engling <erdgeist@erdgeist.org>2024-04-13 00:47:29 +0200
commit1a70d9f9ef81ac1b5e843ac71f3538f7845e03ae (patch)
tree20a20077503c01dc024e88a6a8d82bf89faf22fd /ot_fullscrape.c
parent301faeb10c5994a6fd31adc5f0b4f8f2b5c23502 (diff)
First shot on chunked transfers
Diffstat (limited to 'ot_fullscrape.c')
-rw-r--r--ot_fullscrape.c33
1 files changed, 18 insertions, 15 deletions
diff --git a/ot_fullscrape.c b/ot_fullscrape.c
index d7d3518..fafd83c 100644
--- a/ot_fullscrape.c
+++ b/ot_fullscrape.c
@@ -36,9 +36,9 @@
36#define OT_SCRAPE_MAXENTRYLEN 256 36#define OT_SCRAPE_MAXENTRYLEN 256
37 37
38/* Forward declaration */ 38/* Forward declaration */
39static void fullscrape_make( int *iovec_entries, struct iovec **iovector, ot_tasktype mode ); 39static void fullscrape_make( int taskid, ot_tasktype mode);
40#ifdef WANT_COMPRESSION_GZIP 40#ifdef WANT_COMPRESSION_GZIP
41static void fullscrape_make_gzip( int *iovec_entries, struct iovec **iovector, ot_tasktype mode ); 41static void fullscrape_make_gzip( int taskid, ot_tasktype mode);
42#endif 42#endif
43 43
44/* Converter function from memory to human readable hex strings 44/* Converter function from memory to human readable hex strings
@@ -49,9 +49,6 @@ static char*to_hex(char*d,uint8_t*s){char*m="0123456789ABCDEF";char *t=d;char*e=
49 It grabs tasks from mutex_tasklist and delivers results back 49 It grabs tasks from mutex_tasklist and delivers results back
50*/ 50*/
51static void * fullscrape_worker( void * args ) { 51static void * fullscrape_worker( void * args ) {
52 int iovec_entries;
53 struct iovec *iovector;
54
55 (void) args; 52 (void) args;
56 53
57 while( g_opentracker_running ) { 54 while( g_opentracker_running ) {
@@ -59,12 +56,11 @@ static void * fullscrape_worker( void * args ) {
59 ot_taskid taskid = mutex_workqueue_poptask( &tasktype ); 56 ot_taskid taskid = mutex_workqueue_poptask( &tasktype );
60#ifdef WANT_COMPRESSION_GZIP 57#ifdef WANT_COMPRESSION_GZIP
61 if (tasktype & TASK_FLAG_GZIP) 58 if (tasktype & TASK_FLAG_GZIP)
62 fullscrape_make_gzip( &iovec_entries, &iovector, tasktype ); 59 fullscrape_make_gzip( taskid, tasktype );
63 else 60 else
64#endif 61#endif
65 fullscrape_make( &iovec_entries, &iovector, tasktype ); 62 fullscrape_make( taskid, tasktype );
66 if( mutex_workqueue_pushresult( taskid, iovec_entries, iovector ) ) 63 mutex_workqueue_pushchunked( taskid, NULL );
67 iovec_free( &iovec_entries, &iovector );
68 } 64 }
69 return NULL; 65 return NULL;
70} 66}
@@ -123,14 +119,13 @@ static char * fullscrape_write_one( ot_tasktype mode, char *r, ot_torrent *torre
123 return r; 119 return r;
124} 120}
125 121
126static void fullscrape_make( int *iovec_entries, struct iovec **iovector, ot_tasktype mode ) { 122static void fullscrape_make( int taskid, ot_tasktype mode ) {
127 int bucket; 123 int bucket;
128 char *r, *re; 124 char *r, *re;
125 struct iovec iovector = { NULL, 0 };
129 126
130 /* Setup return vector... */ 127 /* Setup return vector... */
131 *iovec_entries = 0; 128 r = iovector.iov_base = malloc( OT_SCRAPE_CHUNK_SIZE );
132 *iovector = NULL;
133 r = iovec_increase( iovec_entries, iovector, OT_SCRAPE_CHUNK_SIZE );
134 if( !r ) 129 if( !r )
135 return; 130 return;
136 131
@@ -152,8 +147,14 @@ static void fullscrape_make( int *iovec_entries, struct iovec **iovector, ot_tas
152 r = fullscrape_write_one( mode, r, torrents+i, &torrents[i].hash ); 147 r = fullscrape_write_one( mode, r, torrents+i, &torrents[i].hash );
153 148
154 if( r > re) { 149 if( r > re) {
150 iovector.iov_len = r - (char *)iovector.iov_base;
151
152 if (mutex_workqueue_pushchunked(taskid, &iovector) ) {
153 free(iovector.iov_base);
154 return mutex_bucket_unlock( bucket, 0 );
155 }
155 /* Allocate a fresh output buffer at the end of our buffers list */ 156 /* Allocate a fresh output buffer at the end of our buffers list */
156 r = iovec_fix_increase_or_free( iovec_entries, iovector, r, OT_SCRAPE_CHUNK_SIZE ); 157 r = iovector.iov_base = malloc( OT_SCRAPE_CHUNK_SIZE );
157 if( !r ) 158 if( !r )
158 return mutex_bucket_unlock( bucket, 0 ); 159 return mutex_bucket_unlock( bucket, 0 );
159 160
@@ -174,7 +175,9 @@ static void fullscrape_make( int *iovec_entries, struct iovec **iovector, ot_tas
174 r += sprintf( r, "ee" ); 175 r += sprintf( r, "ee" );
175 176
176 /* Release unused memory in current output buffer */ 177 /* Release unused memory in current output buffer */
177 iovec_fixlast( iovec_entries, iovector, r ); 178 iovector.iov_len = r - (char *)iovector.iov_base;
179 if( mutex_workqueue_pushchunked(taskid, &iovector) )
180 free(iovector.iov_base);
178} 181}
179 182
180#ifdef WANT_COMPRESSION_GZIP 183#ifdef WANT_COMPRESSION_GZIP