Fossil SCM

This version is able to clone the entire TCL repository in 12.5 minutes and to rebuild the cloned TCL repository in 2.5 minutes. There is still a lot of performance work to be done, but this is good enough for the time being.

drh 2008-03-08 14:52 trunk
Commit 0afb5e8e39c3865cabcd5d4fe09c3c4bc95e6300
--- src/clone.c
+++ src/clone.c
@@ -74,7 +74,8 @@
7474
}
7575
db_finalize(&q);
7676
}else{
7777
client_sync(0,0,1);
7878
}
79
+ verify_cancel();
7980
db_end_transaction(0);
8081
}
8182
--- src/clone.c
+++ src/clone.c
@@ -74,7 +74,8 @@
74 }
75 db_finalize(&q);
76 }else{
77 client_sync(0,0,1);
78 }
 
79 db_end_transaction(0);
80 }
81
--- src/clone.c
+++ src/clone.c
@@ -74,7 +74,8 @@
74 }
75 db_finalize(&q);
76 }else{
77 client_sync(0,0,1);
78 }
79 verify_cancel();
80 db_end_transaction(0);
81 }
82
+6 -7
--- src/manifest.c
+++ src/manifest.c
@@ -53,11 +53,10 @@
5353
struct Manifest {
5454
Blob content; /* The original content blob */
5555
int type; /* Type of file */
5656
int mode; /* Access mode */
5757
char *zComment; /* Decoded comment */
58
- char zUuid[UUID_SIZE+1]; /* Self UUID */
5958
double rDate; /* Time in the "D" line */
6059
char *zUser; /* Name of the user */
6160
char *zRepoCksum; /* MD5 checksum of the baseline content */
6261
char *zWiki; /* Text of the wiki page */
6362
char *zWikiTitle; /* Name of the wiki page */
@@ -143,18 +142,14 @@
143142
int manifest_parse(Manifest *p, Blob *pContent){
144143
int seenHeader = 0;
145144
int seenZ = 0;
146145
int i, lineNo=0;
147146
Blob line, token, a1, a2, a3;
148
- Blob selfuuid;
149147
char cPrevType = 0;
150148
151149
memset(p, 0, sizeof(*p));
152150
memcpy(&p->content, pContent, sizeof(p->content));
153
- sha1sum_blob(&p->content, &selfuuid);
154
- memcpy(p->zUuid, blob_buffer(&selfuuid), UUID_SIZE);
155
- p->zUuid[UUID_SIZE] = 0;
156151
blob_zero(pContent);
157152
pContent = &p->content;
158153
159154
blob_zero(&a1);
160155
blob_zero(&a2);
@@ -486,11 +481,11 @@
486481
defossilize(zValue);
487482
}
488483
if( blob_size(&a2)==UUID_SIZE && validate16(zUuid, UUID_SIZE) ){
489484
/* A valid uuid */
490485
}else if( blob_size(&a2)==1 && zUuid[0]=='*' ){
491
- zUuid = p->zUuid;
486
+ zUuid = 0;
492487
}else{
493488
goto manifest_syntax_error;
494489
}
495490
defossilize(zName);
496491
if( zName[0]!='-' && zName[0]!='+' && zName[0]!='*' ){
@@ -823,11 +818,15 @@
823818
}
824819
if( m.type==CFTYPE_CONTROL || m.type==CFTYPE_MANIFEST ){
825820
for(i=0; i<m.nTag; i++){
826821
int tid;
827822
int type;
828
- tid = uuid_to_rid(m.aTag[i].zUuid, 1);
823
+ if( m.aTag[i].zUuid ){
824
+ tid = uuid_to_rid(m.aTag[i].zUuid, 1);
825
+ }else{
826
+ tid = rid;
827
+ }
829828
switch( m.aTag[i].zName[0] ){
830829
case '+': type = 1; break;
831830
case '*': type = 2; break;
832831
case '-': type = 0; break;
833832
default:
834833
--- src/manifest.c
+++ src/manifest.c
@@ -53,11 +53,10 @@
53 struct Manifest {
54 Blob content; /* The original content blob */
55 int type; /* Type of file */
56 int mode; /* Access mode */
57 char *zComment; /* Decoded comment */
58 char zUuid[UUID_SIZE+1]; /* Self UUID */
59 double rDate; /* Time in the "D" line */
60 char *zUser; /* Name of the user */
61 char *zRepoCksum; /* MD5 checksum of the baseline content */
62 char *zWiki; /* Text of the wiki page */
63 char *zWikiTitle; /* Name of the wiki page */
@@ -143,18 +142,14 @@
143 int manifest_parse(Manifest *p, Blob *pContent){
144 int seenHeader = 0;
145 int seenZ = 0;
146 int i, lineNo=0;
147 Blob line, token, a1, a2, a3;
148 Blob selfuuid;
149 char cPrevType = 0;
150
151 memset(p, 0, sizeof(*p));
152 memcpy(&p->content, pContent, sizeof(p->content));
153 sha1sum_blob(&p->content, &selfuuid);
154 memcpy(p->zUuid, blob_buffer(&selfuuid), UUID_SIZE);
155 p->zUuid[UUID_SIZE] = 0;
156 blob_zero(pContent);
157 pContent = &p->content;
158
159 blob_zero(&a1);
160 blob_zero(&a2);
@@ -486,11 +481,11 @@
486 defossilize(zValue);
487 }
488 if( blob_size(&a2)==UUID_SIZE && validate16(zUuid, UUID_SIZE) ){
489 /* A valid uuid */
490 }else if( blob_size(&a2)==1 && zUuid[0]=='*' ){
491 zUuid = p->zUuid;
492 }else{
493 goto manifest_syntax_error;
494 }
495 defossilize(zName);
496 if( zName[0]!='-' && zName[0]!='+' && zName[0]!='*' ){
@@ -823,11 +818,15 @@
823 }
824 if( m.type==CFTYPE_CONTROL || m.type==CFTYPE_MANIFEST ){
825 for(i=0; i<m.nTag; i++){
826 int tid;
827 int type;
828 tid = uuid_to_rid(m.aTag[i].zUuid, 1);
 
 
 
 
829 switch( m.aTag[i].zName[0] ){
830 case '+': type = 1; break;
831 case '*': type = 2; break;
832 case '-': type = 0; break;
833 default:
834
--- src/manifest.c
+++ src/manifest.c
@@ -53,11 +53,10 @@
53 struct Manifest {
54 Blob content; /* The original content blob */
55 int type; /* Type of file */
56 int mode; /* Access mode */
57 char *zComment; /* Decoded comment */
 
58 double rDate; /* Time in the "D" line */
59 char *zUser; /* Name of the user */
60 char *zRepoCksum; /* MD5 checksum of the baseline content */
61 char *zWiki; /* Text of the wiki page */
62 char *zWikiTitle; /* Name of the wiki page */
@@ -143,18 +142,14 @@
142 int manifest_parse(Manifest *p, Blob *pContent){
143 int seenHeader = 0;
144 int seenZ = 0;
145 int i, lineNo=0;
146 Blob line, token, a1, a2, a3;
 
147 char cPrevType = 0;
148
149 memset(p, 0, sizeof(*p));
150 memcpy(&p->content, pContent, sizeof(p->content));
 
 
 
151 blob_zero(pContent);
152 pContent = &p->content;
153
154 blob_zero(&a1);
155 blob_zero(&a2);
@@ -486,11 +481,11 @@
481 defossilize(zValue);
482 }
483 if( blob_size(&a2)==UUID_SIZE && validate16(zUuid, UUID_SIZE) ){
484 /* A valid uuid */
485 }else if( blob_size(&a2)==1 && zUuid[0]=='*' ){
486 zUuid = 0;
487 }else{
488 goto manifest_syntax_error;
489 }
490 defossilize(zName);
491 if( zName[0]!='-' && zName[0]!='+' && zName[0]!='*' ){
@@ -823,11 +818,15 @@
818 }
819 if( m.type==CFTYPE_CONTROL || m.type==CFTYPE_MANIFEST ){
820 for(i=0; i<m.nTag; i++){
821 int tid;
822 int type;
823 if( m.aTag[i].zUuid ){
824 tid = uuid_to_rid(m.aTag[i].zUuid, 1);
825 }else{
826 tid = rid;
827 }
828 switch( m.aTag[i].zName[0] ){
829 case '+': type = 1; break;
830 case '*': type = 2; break;
831 case '-': type = 0; break;
832 default:
833
--- src/verify.c
+++ src/verify.c
@@ -103,10 +103,17 @@
103103
assert( !inFinalVerify );
104104
if( rid>0 ){
105105
bag_insert(&toVerify, rid);
106106
}
107107
}
108
+
109
+/*
110
+** Cancel all pending verification operations.
111
+*/
112
+void verify_cancel(void){
113
+ bag_clear(&toVerify);
114
+}
108115
109116
/*
110117
** COMMAND: test-verify-all
111118
**
112119
** Verify all records in the repository.
113120
--- src/verify.c
+++ src/verify.c
@@ -103,10 +103,17 @@
103 assert( !inFinalVerify );
104 if( rid>0 ){
105 bag_insert(&toVerify, rid);
106 }
107 }
 
 
 
 
 
 
 
108
109 /*
110 ** COMMAND: test-verify-all
111 **
112 ** Verify all records in the repository.
113
--- src/verify.c
+++ src/verify.c
@@ -103,10 +103,17 @@
103 assert( !inFinalVerify );
104 if( rid>0 ){
105 bag_insert(&toVerify, rid);
106 }
107 }
108
109 /*
110 ** Cancel all pending verification operations.
111 */
112 void verify_cancel(void){
113 bag_clear(&toVerify);
114 }
115
116 /*
117 ** COMMAND: test-verify-all
118 **
119 ** Verify all records in the repository.
120
+6 -5
--- src/xfer.c
+++ src/xfer.c
@@ -770,17 +770,18 @@
770770
nMsg += send_unclustered(&xfer);
771771
}
772772
773773
/* Exchange messages with the server */
774774
nFileSend = xfer.nFileSent + xfer.nDeltaSent;
775
- printf("Send: %10d bytes, %3d messages, %3d files (%d+%d)\n",
775
+ printf("Sent: %10d bytes, %4d messages, %4d files (%d+%d)\n",
776776
blob_size(&send), nMsg+xfer.nGimmeSent+xfer.nIGotSent,
777777
nFileSend, xfer.nFileSent, xfer.nDeltaSent);
778778
nMsg = 0;
779779
xfer.nFileSent = 0;
780780
xfer.nDeltaSent = 0;
781781
xfer.nGimmeSent = 0;
782
+ fflush(stdout);
782783
http_exchange(&send, &recv);
783784
blob_reset(&send);
784785
785786
/* Begin constructing the next message (which might never be
786787
** sent) by beginning with the pull or push messages
@@ -798,10 +799,13 @@
798799
while( blob_line(&recv, &xfer.line) ){
799800
if( blob_buffer(&xfer.line)[0]=='#' ){
800801
continue;
801802
}
802803
xfer.nToken = blob_tokenize(&xfer.line, xfer.aToken, count(xfer.aToken));
804
+ nMsg++;
805
+ printf("\r%d", nMsg);
806
+ fflush(stdout);
803807
804808
/* file UUID SIZE \n CONTENT
805809
** file UUID DELTASRC SIZE \n CONTENT
806810
**
807811
** Receive a file transmitted from the server.
@@ -818,11 +822,10 @@
818822
*/
819823
if( blob_eq(&xfer.aToken[0], "gimme")
820824
&& xfer.nToken==2
821825
&& blob_is_uuid(&xfer.aToken[1])
822826
){
823
- nMsg++;
824827
if( pushFlag ){
825828
int rid = rid_from_uuid(&xfer.aToken[1], 0);
826829
send_file(&xfer, rid, &xfer.aToken[1], 0);
827830
}
828831
}else
@@ -838,11 +841,10 @@
838841
if( xfer.nToken==2
839842
&& blob_eq(&xfer.aToken[0], "igot")
840843
&& blob_is_uuid(&xfer.aToken[1])
841844
){
842845
int rid = 0;
843
- nMsg++;
844846
if( pullFlag || cloneFlag ){
845847
if( !db_exists("SELECT 1 FROM blob WHERE uuid='%b' AND size>=0",
846848
&xfer.aToken[1]) ){
847849
rid = content_put(0, blob_str(&xfer.aToken[1]), 0);
848850
newPhantom = 1;
@@ -867,11 +869,10 @@
867869
&& blob_is_uuid(&xfer.aToken[2])
868870
){
869871
if( blob_eq_str(&xfer.aToken[1], zSCode, -1) ){
870872
fossil_fatal("server loop");
871873
}
872
- nMsg++;
873874
if( zPCode==0 ){
874875
zPCode = mprintf("%b", &xfer.aToken[2]);
875876
db_set("project-code", zPCode, 0);
876877
}
877878
blob_appendf(&send, "clone\n");
@@ -920,11 +921,11 @@
920921
fossil_fatal("%b", &xfer.err);
921922
}
922923
blobarray_reset(xfer.aToken, xfer.nToken);
923924
blob_reset(&xfer.line);
924925
}
925
- printf("Received: %10d bytes, %3d messages, %3d files (%d+%d+%d)\n",
926
+ printf("\rReceived: %10d bytes, %4d messages, %4d files (%d+%d+%d)\n",
926927
blob_size(&recv), nMsg,
927928
xfer.nFileRcvd + xfer.nDeltaRcvd + xfer.nDanglingFile,
928929
xfer.nFileRcvd, xfer.nDeltaRcvd, xfer.nDanglingFile);
929930
930931
blob_reset(&recv);
931932
--- src/xfer.c
+++ src/xfer.c
@@ -770,17 +770,18 @@
770 nMsg += send_unclustered(&xfer);
771 }
772
773 /* Exchange messages with the server */
774 nFileSend = xfer.nFileSent + xfer.nDeltaSent;
775 printf("Send: %10d bytes, %3d messages, %3d files (%d+%d)\n",
776 blob_size(&send), nMsg+xfer.nGimmeSent+xfer.nIGotSent,
777 nFileSend, xfer.nFileSent, xfer.nDeltaSent);
778 nMsg = 0;
779 xfer.nFileSent = 0;
780 xfer.nDeltaSent = 0;
781 xfer.nGimmeSent = 0;
 
782 http_exchange(&send, &recv);
783 blob_reset(&send);
784
785 /* Begin constructing the next message (which might never be
786 ** sent) by beginning with the pull or push messages
@@ -798,10 +799,13 @@
798 while( blob_line(&recv, &xfer.line) ){
799 if( blob_buffer(&xfer.line)[0]=='#' ){
800 continue;
801 }
802 xfer.nToken = blob_tokenize(&xfer.line, xfer.aToken, count(xfer.aToken));
 
 
 
803
804 /* file UUID SIZE \n CONTENT
805 ** file UUID DELTASRC SIZE \n CONTENT
806 **
807 ** Receive a file transmitted from the server.
@@ -818,11 +822,10 @@
818 */
819 if( blob_eq(&xfer.aToken[0], "gimme")
820 && xfer.nToken==2
821 && blob_is_uuid(&xfer.aToken[1])
822 ){
823 nMsg++;
824 if( pushFlag ){
825 int rid = rid_from_uuid(&xfer.aToken[1], 0);
826 send_file(&xfer, rid, &xfer.aToken[1], 0);
827 }
828 }else
@@ -838,11 +841,10 @@
838 if( xfer.nToken==2
839 && blob_eq(&xfer.aToken[0], "igot")
840 && blob_is_uuid(&xfer.aToken[1])
841 ){
842 int rid = 0;
843 nMsg++;
844 if( pullFlag || cloneFlag ){
845 if( !db_exists("SELECT 1 FROM blob WHERE uuid='%b' AND size>=0",
846 &xfer.aToken[1]) ){
847 rid = content_put(0, blob_str(&xfer.aToken[1]), 0);
848 newPhantom = 1;
@@ -867,11 +869,10 @@
867 && blob_is_uuid(&xfer.aToken[2])
868 ){
869 if( blob_eq_str(&xfer.aToken[1], zSCode, -1) ){
870 fossil_fatal("server loop");
871 }
872 nMsg++;
873 if( zPCode==0 ){
874 zPCode = mprintf("%b", &xfer.aToken[2]);
875 db_set("project-code", zPCode, 0);
876 }
877 blob_appendf(&send, "clone\n");
@@ -920,11 +921,11 @@
920 fossil_fatal("%b", &xfer.err);
921 }
922 blobarray_reset(xfer.aToken, xfer.nToken);
923 blob_reset(&xfer.line);
924 }
925 printf("Received: %10d bytes, %3d messages, %3d files (%d+%d+%d)\n",
926 blob_size(&recv), nMsg,
927 xfer.nFileRcvd + xfer.nDeltaRcvd + xfer.nDanglingFile,
928 xfer.nFileRcvd, xfer.nDeltaRcvd, xfer.nDanglingFile);
929
930 blob_reset(&recv);
931
--- src/xfer.c
+++ src/xfer.c
@@ -770,17 +770,18 @@
770 nMsg += send_unclustered(&xfer);
771 }
772
773 /* Exchange messages with the server */
774 nFileSend = xfer.nFileSent + xfer.nDeltaSent;
775 printf("Sent: %10d bytes, %4d messages, %4d files (%d+%d)\n",
776 blob_size(&send), nMsg+xfer.nGimmeSent+xfer.nIGotSent,
777 nFileSend, xfer.nFileSent, xfer.nDeltaSent);
778 nMsg = 0;
779 xfer.nFileSent = 0;
780 xfer.nDeltaSent = 0;
781 xfer.nGimmeSent = 0;
782 fflush(stdout);
783 http_exchange(&send, &recv);
784 blob_reset(&send);
785
786 /* Begin constructing the next message (which might never be
787 ** sent) by beginning with the pull or push messages
@@ -798,10 +799,13 @@
799 while( blob_line(&recv, &xfer.line) ){
800 if( blob_buffer(&xfer.line)[0]=='#' ){
801 continue;
802 }
803 xfer.nToken = blob_tokenize(&xfer.line, xfer.aToken, count(xfer.aToken));
804 nMsg++;
805 printf("\r%d", nMsg);
806 fflush(stdout);
807
808 /* file UUID SIZE \n CONTENT
809 ** file UUID DELTASRC SIZE \n CONTENT
810 **
811 ** Receive a file transmitted from the server.
@@ -818,11 +822,10 @@
822 */
823 if( blob_eq(&xfer.aToken[0], "gimme")
824 && xfer.nToken==2
825 && blob_is_uuid(&xfer.aToken[1])
826 ){
 
827 if( pushFlag ){
828 int rid = rid_from_uuid(&xfer.aToken[1], 0);
829 send_file(&xfer, rid, &xfer.aToken[1], 0);
830 }
831 }else
@@ -838,11 +841,10 @@
841 if( xfer.nToken==2
842 && blob_eq(&xfer.aToken[0], "igot")
843 && blob_is_uuid(&xfer.aToken[1])
844 ){
845 int rid = 0;
 
846 if( pullFlag || cloneFlag ){
847 if( !db_exists("SELECT 1 FROM blob WHERE uuid='%b' AND size>=0",
848 &xfer.aToken[1]) ){
849 rid = content_put(0, blob_str(&xfer.aToken[1]), 0);
850 newPhantom = 1;
@@ -867,11 +869,10 @@
869 && blob_is_uuid(&xfer.aToken[2])
870 ){
871 if( blob_eq_str(&xfer.aToken[1], zSCode, -1) ){
872 fossil_fatal("server loop");
873 }
 
874 if( zPCode==0 ){
875 zPCode = mprintf("%b", &xfer.aToken[2]);
876 db_set("project-code", zPCode, 0);
877 }
878 blob_appendf(&send, "clone\n");
@@ -920,11 +921,11 @@
921 fossil_fatal("%b", &xfer.err);
922 }
923 blobarray_reset(xfer.aToken, xfer.nToken);
924 blob_reset(&xfer.line);
925 }
926 printf("\rReceived: %10d bytes, %4d messages, %4d files (%d+%d+%d)\n",
927 blob_size(&recv), nMsg,
928 xfer.nFileRcvd + xfer.nDeltaRcvd + xfer.nDanglingFile,
929 xfer.nFileRcvd, xfer.nDeltaRcvd, xfer.nDanglingFile);
930
931 blob_reset(&recv);
932

Keyboard Shortcuts

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