Make ndblib not reopen and reread files all the time.
authorRonald G. Minnich <rminnich@google.com>
Thu, 17 Apr 2014 19:00:45 +0000 (12:00 -0700)
committerRonald G. Minnich <rminnich@google.com>
Thu, 17 Apr 2014 19:00:45 +0000 (12:00 -0700)
Sadly, stat(2) returns 0 for mtime still. So we've got some
nasty hacks in here to make sure we only read files once. We'll
need to come back to this or better yet rewrite this mess in Go.
It's the 21st century and it's silly not to cache everything, and
it's super silly to write code like this in C.

Result:
cs&
mount -a '#s/cs' /net
csquery /net/cs tcp!localhost!22

The first time, it is slow, as it is now. Subsequent
csquery commands, if it hits the cache, are quite fast,
basically intantaneous, even in qemu.
This should make go test much more palatable.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
user/ndblib/ndbhash.c
user/ndblib/ndbopen.c

index f9cf3b6..c970f02 100755 (executable)
@@ -63,6 +63,7 @@ hfread(struct ndbhf *hf, long off, int len)
 static struct ndbhf*
 hfopen(struct ndb *db, char *attr)
 {
+       static int beenhere = 0;
        struct ndbhf *hf;
        char buf[sizeof(hf->attr)+sizeof(db->file)+2];
        uint8_t *p;
@@ -77,12 +78,14 @@ hfopen(struct ndb *db, char *attr)
        if((d = dirfstat(Bfildes(&db->b))) == NULL || db->qid.path != d->qid.path
        || db->qid.vers != d->qid.vers){
 #else
-       if (1){
+       if (! beenhere){
 #endif
                if(ndbreopen(db) < 0){
                        free(d);
                        return 0;
                }
+               beenhere = 1;
+               db->mtime = 1;
        }
        free(d);
 
@@ -134,7 +137,6 @@ ndbsearch(struct ndb *db, struct ndbs *s, char *attr, char *val)
        uint8_t *p;
        struct ndbtuple *t;
        struct ndbhf *hf;
-
        hf = hfopen(db, attr);
 
        memset(s, 0, sizeof(*s));
index 1f3cead..cb11f3f 100755 (executable)
@@ -31,6 +31,7 @@ static char *deffile = "/lib/ndb/local";
 struct ndb*
 ndbopen(char *file)
 {
+
        struct ndb *db, *first, *last;
        struct ndbs s;
        struct ndbtuple *t, *nt;
@@ -38,13 +39,15 @@ ndbopen(char *file)
        if(file == 0)
                file = deffile;
        db = doopen(file);
-       if(db == 0)
+       if(db == 0) {
                return 0;
+       }
        first = last = db;
        t = ndbsearch(db, &s, "database", "");
        fseek(db->b, 0, 0);
-       if(t == 0)
+       if(t == 0) {
                return db;
+       }
        for(nt = t; nt; nt = nt->entry){
                if(strcmp(nt->attr, "file") != 0)
                        continue;
@@ -77,11 +80,13 @@ ndbopen(char *file)
 static struct ndb*
 doopen(char *file)
 {
+
        struct ndb *db;
 
        db = (struct ndb*)calloc(sizeof(struct ndb), 1);
-       if(db == 0)
+       if(db == 0) {
                return 0;
+       }
        memset(db, 0, sizeof(struct ndb));
        strncpy(db->file, file, sizeof(db->file)-1);
 
@@ -99,6 +104,7 @@ doopen(char *file)
 int
 ndbreopen(struct ndb *db)
 {
+
        int fd;
        struct dir *d;
 
@@ -113,8 +119,9 @@ ndbreopen(struct ndb *db)
 
        /* try the open again */
        db->b = fopen(db->file, "r");
-       if(! db->b)
+       if(! db->b) {
                return -1;
+       }
 #if 0
        d = dirfstat(fd);
        if(d == NULL){
@@ -122,10 +129,17 @@ ndbreopen(struct ndb *db)
                return -1;
        }
 
-       db->qid = d->qid;
+       db->qid.path = d->qid.path;
        db->mtime = d->mtime;
        db->length = d->length;
        free(d);
+#else
+       struct stat s;
+       /* we opened it, this WILL work */
+       stat(db->file, &s);
+       db->qid.path = s.st_ino;
+       db->mtime = s.st_mtime + 1;
+       db->length = s.st_size;
 #endif
        db->isopen = 1;
        return 0;
@@ -137,6 +151,7 @@ ndbreopen(struct ndb *db)
 void
 ndbclose(struct ndb *db)
 {
+
        struct ndb *nextdb;
 
        for(; db; db = nextdb){
@@ -154,6 +169,7 @@ ndbclose(struct ndb *db)
 static void
 hffree(struct ndb *db)
 {
+
        struct ndbhf *hf, *next;
 
        for(hf = db->hf; hf; hf = next){
@@ -170,7 +186,8 @@ hffree(struct ndb *db)
 int
 ndbchanged(struct ndb *db)
 {
-       return 1;
+#warning "ndbchanged always returns 0"
+       return 0;
 #if 0
        struct ndb *ndb;
        struct dir *d;