Fossil SCM

Additional work on the xfer mechanism, trying to increase the use of delta compression.

drh 2007-08-09 19:07 trunk
Commit bd3c1d0023c2e573dbf92d19de29952603d24a92
1 file changed +40 -16
+40 -16
--- src/xfer.c
+++ src/xfer.c
@@ -236,23 +236,47 @@
236236
237237
/*
238238
** Send all pending files.
239239
*/
240240
static int send_all_pending(Blob *pOut){
241
- int iRidSent = 0;
241
+ int rid, xid, i;
242
+ int nIgot = 0;
242243
int sent = 0;
243244
int nSent = 0;
244245
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
+ };
246271
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);
250275
if( sent<maxSize ){
251276
sent += send_file(rid, pOut);
252277
nSent++;
253
- iRidSent = rid;
254278
}else{
255279
char *zUuid = db_text(0,
256280
"SELECT uuid FROM blob WHERE rid=%d AND size>=0", rid);
257281
if( zUuid ){
258282
if( pOut ){
@@ -259,22 +283,22 @@
259283
blob_appendf(pOut, "igot %s\n", zUuid);
260284
}else{
261285
cgi_printf("igot %s\n", zUuid);
262286
}
263287
free(zUuid);
288
+ nIgot++;
264289
}
265290
}
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
+ }
276300
return nSent;
277301
}
278302
279303
280304
/*
281305
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button