Fossil SCM
Additional work on the xfer mechanism, trying to increase the use of delta compression.
Commit
bd3c1d0023c2e573dbf92d19de29952603d24a92
Parent
73bddaebb9ec5d6…
1 file changed
+40
-16
+40
-16
| --- src/xfer.c | ||
| +++ src/xfer.c | ||
| @@ -236,23 +236,47 @@ | ||
| 236 | 236 | |
| 237 | 237 | /* |
| 238 | 238 | ** Send all pending files. |
| 239 | 239 | */ |
| 240 | 240 | static int send_all_pending(Blob *pOut){ |
| 241 | - int iRidSent = 0; | |
| 241 | + int rid, xid, i; | |
| 242 | + int nIgot = 0; | |
| 242 | 243 | int sent = 0; |
| 243 | 244 | int nSent = 0; |
| 244 | 245 | int maxSize = db_get_int("http-msg-size", 500000); |
| 245 | - Stmt q; | |
| 246 | + static const char *azQuery[] = { | |
| 247 | + "SELECT srcid FROM delta JOIN pending ON pending.rid=delta.srcid" | |
| 248 | + " WHERE delta.rid=%d" | |
| 249 | + " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=srcid)", | |
| 250 | + | |
| 251 | + "SELECT delta.rid FROM delta JOIN pending ON pending.rid=delta.rid" | |
| 252 | + " WHERE srcid=%d" | |
| 253 | + " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=delta.rid)", | |
| 254 | + | |
| 255 | + "SELECT pid FROM plink JOIN pending ON rid=pid" | |
| 256 | + " WHERE cid=%d" | |
| 257 | + " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=pid)", | |
| 258 | + | |
| 259 | + "SELECT cid FROM plink JOIN pending ON rid=cid" | |
| 260 | + " WHERE pid=%d" | |
| 261 | + " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=cid)", | |
| 262 | + | |
| 263 | + "SELECT pid FROM mlink JOIN pending ON rid=pid" | |
| 264 | + " WHERE fid=%d" | |
| 265 | + " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=pid)", | |
| 266 | + | |
| 267 | + "SELECT fid FROM mlink JOIN pending ON rid=fid" | |
| 268 | + " WHERE pid=%d" | |
| 269 | + " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=fid)", | |
| 270 | + }; | |
| 246 | 271 | |
| 247 | - db_prepare(&q, "SELECT rid FROM pending ORDER BY rid"); | |
| 248 | - while( db_step(&q)==SQLITE_ROW ){ | |
| 249 | - int rid = db_column_int(&q, 0); | |
| 272 | + rid = db_int(0, "SELECT rid FROM pending"); | |
| 273 | + while( rid && nIgot<200 ){ | |
| 274 | + db_multi_exec("DELETE FROM pending WHERE rid=%d", rid); | |
| 250 | 275 | if( sent<maxSize ){ |
| 251 | 276 | sent += send_file(rid, pOut); |
| 252 | 277 | nSent++; |
| 253 | - iRidSent = rid; | |
| 254 | 278 | }else{ |
| 255 | 279 | char *zUuid = db_text(0, |
| 256 | 280 | "SELECT uuid FROM blob WHERE rid=%d AND size>=0", rid); |
| 257 | 281 | if( zUuid ){ |
| 258 | 282 | if( pOut ){ |
| @@ -259,22 +283,22 @@ | ||
| 259 | 283 | blob_appendf(pOut, "igot %s\n", zUuid); |
| 260 | 284 | }else{ |
| 261 | 285 | cgi_printf("igot %s\n", zUuid); |
| 262 | 286 | } |
| 263 | 287 | free(zUuid); |
| 288 | + nIgot++; | |
| 264 | 289 | } |
| 265 | 290 | } |
| 266 | - } | |
| 267 | - db_finalize(&q); | |
| 268 | - | |
| 269 | - /* Delete the 'pending' records for all files just sent. Otherwise, | |
| 270 | - ** we can wind up sending some files more than once. | |
| 271 | - */ | |
| 272 | - if( nSent>0 ){ | |
| 273 | - db_multi_exec("DELETE FROM pending WHERE rid <= %d", iRidSent); | |
| 274 | - } | |
| 275 | - | |
| 291 | + xid = 0; | |
| 292 | + for(i=0; xid==0 && i<sizeof(azQuery)/sizeof(azQuery[0]); i++){ | |
| 293 | + xid = db_int(0, azQuery[i], rid); | |
| 294 | + } | |
| 295 | + rid = xid; | |
| 296 | + if( rid==0 ){ | |
| 297 | + rid = db_int(0, "SELECT rid FROM pending"); | |
| 298 | + } | |
| 299 | + } | |
| 276 | 300 | return nSent; |
| 277 | 301 | } |
| 278 | 302 | |
| 279 | 303 | |
| 280 | 304 | /* |
| 281 | 305 |
| --- src/xfer.c | |
| +++ src/xfer.c | |
| @@ -236,23 +236,47 @@ | |
| 236 | |
| 237 | /* |
| 238 | ** Send all pending files. |
| 239 | */ |
| 240 | static int send_all_pending(Blob *pOut){ |
| 241 | int iRidSent = 0; |
| 242 | int sent = 0; |
| 243 | int nSent = 0; |
| 244 | int maxSize = db_get_int("http-msg-size", 500000); |
| 245 | Stmt q; |
| 246 | |
| 247 | db_prepare(&q, "SELECT rid FROM pending ORDER BY rid"); |
| 248 | while( db_step(&q)==SQLITE_ROW ){ |
| 249 | int rid = db_column_int(&q, 0); |
| 250 | if( sent<maxSize ){ |
| 251 | sent += send_file(rid, pOut); |
| 252 | nSent++; |
| 253 | iRidSent = rid; |
| 254 | }else{ |
| 255 | char *zUuid = db_text(0, |
| 256 | "SELECT uuid FROM blob WHERE rid=%d AND size>=0", rid); |
| 257 | if( zUuid ){ |
| 258 | if( pOut ){ |
| @@ -259,22 +283,22 @@ | |
| 259 | blob_appendf(pOut, "igot %s\n", zUuid); |
| 260 | }else{ |
| 261 | cgi_printf("igot %s\n", zUuid); |
| 262 | } |
| 263 | free(zUuid); |
| 264 | } |
| 265 | } |
| 266 | } |
| 267 | db_finalize(&q); |
| 268 | |
| 269 | /* Delete the 'pending' records for all files just sent. Otherwise, |
| 270 | ** we can wind up sending some files more than once. |
| 271 | */ |
| 272 | if( nSent>0 ){ |
| 273 | db_multi_exec("DELETE FROM pending WHERE rid <= %d", iRidSent); |
| 274 | } |
| 275 | |
| 276 | return nSent; |
| 277 | } |
| 278 | |
| 279 | |
| 280 | /* |
| 281 |
| --- src/xfer.c | |
| +++ src/xfer.c | |
| @@ -236,23 +236,47 @@ | |
| 236 | |
| 237 | /* |
| 238 | ** Send all pending files. |
| 239 | */ |
| 240 | static int send_all_pending(Blob *pOut){ |
| 241 | int rid, xid, i; |
| 242 | int nIgot = 0; |
| 243 | int sent = 0; |
| 244 | int nSent = 0; |
| 245 | int maxSize = db_get_int("http-msg-size", 500000); |
| 246 | static const char *azQuery[] = { |
| 247 | "SELECT srcid FROM delta JOIN pending ON pending.rid=delta.srcid" |
| 248 | " WHERE delta.rid=%d" |
| 249 | " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=srcid)", |
| 250 | |
| 251 | "SELECT delta.rid FROM delta JOIN pending ON pending.rid=delta.rid" |
| 252 | " WHERE srcid=%d" |
| 253 | " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=delta.rid)", |
| 254 | |
| 255 | "SELECT pid FROM plink JOIN pending ON rid=pid" |
| 256 | " WHERE cid=%d" |
| 257 | " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=pid)", |
| 258 | |
| 259 | "SELECT cid FROM plink JOIN pending ON rid=cid" |
| 260 | " WHERE pid=%d" |
| 261 | " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=cid)", |
| 262 | |
| 263 | "SELECT pid FROM mlink JOIN pending ON rid=pid" |
| 264 | " WHERE fid=%d" |
| 265 | " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=pid)", |
| 266 | |
| 267 | "SELECT fid FROM mlink JOIN pending ON rid=fid" |
| 268 | " WHERE pid=%d" |
| 269 | " AND NOT EXISTS(SELECT 1 FROM phantom WHERE rid=fid)", |
| 270 | }; |
| 271 | |
| 272 | rid = db_int(0, "SELECT rid FROM pending"); |
| 273 | while( rid && nIgot<200 ){ |
| 274 | db_multi_exec("DELETE FROM pending WHERE rid=%d", rid); |
| 275 | if( sent<maxSize ){ |
| 276 | sent += send_file(rid, pOut); |
| 277 | nSent++; |
| 278 | }else{ |
| 279 | char *zUuid = db_text(0, |
| 280 | "SELECT uuid FROM blob WHERE rid=%d AND size>=0", rid); |
| 281 | if( zUuid ){ |
| 282 | if( pOut ){ |
| @@ -259,22 +283,22 @@ | |
| 283 | blob_appendf(pOut, "igot %s\n", zUuid); |
| 284 | }else{ |
| 285 | cgi_printf("igot %s\n", zUuid); |
| 286 | } |
| 287 | free(zUuid); |
| 288 | nIgot++; |
| 289 | } |
| 290 | } |
| 291 | xid = 0; |
| 292 | for(i=0; xid==0 && i<sizeof(azQuery)/sizeof(azQuery[0]); i++){ |
| 293 | xid = db_int(0, azQuery[i], rid); |
| 294 | } |
| 295 | rid = xid; |
| 296 | if( rid==0 ){ |
| 297 | rid = db_int(0, "SELECT rid FROM pending"); |
| 298 | } |
| 299 | } |
| 300 | return nSent; |
| 301 | } |
| 302 | |
| 303 | |
| 304 | /* |
| 305 |