From cc2ebb523efc96d3981e6a1c772509bfd9a79977 Mon Sep 17 00:00:00 2001 From: didg Date: Wed, 7 Sep 2005 15:23:21 +0000 Subject: [PATCH] lazy init dbd database, help with pre tiger OS and a lot of volumes. --- include/atalk/cnid.h | 9 +++- include/atalk/cnid_dbd_private.h | 2 + libatalk/cnid/dbd/cnid_dbd.c | 73 +++++++++++++------------------- 3 files changed, 38 insertions(+), 46 deletions(-) diff --git a/include/atalk/cnid.h b/include/atalk/cnid.h index 7aa03766..e64a677a 100644 --- a/include/atalk/cnid.h +++ b/include/atalk/cnid.h @@ -1,5 +1,5 @@ /* - * $Id: cnid.h,v 1.11 2005-05-03 14:55:12 didg Exp $ + * $Id: cnid.h,v 1.12 2005-09-07 15:23:21 didg Exp $ * * Copyright (c) 2003 the Netatalk Team * Copyright (c) 2003 Rafal Lewczuk @@ -32,6 +32,7 @@ #define CNID_FLAG_SETUID 0x04 /* Set db owner to parent folder owner. */ #define CNID_FLAG_BLOCK 0x08 /* block signals in update. */ #define CNID_FLAG_NODEV 0x10 /* don't use device number only inode */ +#define CNID_FLAG_LAZY_INIT 0x20 /* */ #define CNID_INVALID 0 @@ -116,7 +117,11 @@ void cnid_close(struct _cnid_db *db); /* * $Log: cnid.h,v $ - * Revision 1.11 2005-05-03 14:55:12 didg + * Revision 1.12 2005-09-07 15:23:21 didg + * + * lazy init dbd database, help with pre tiger OS and a lot of volumes. + * + * Revision 1.11 2005/05/03 14:55:12 didg * * remove gcc warning * diff --git a/include/atalk/cnid_dbd_private.h b/include/atalk/cnid_dbd_private.h index 930a87c5..c4c48f54 100644 --- a/include/atalk/cnid_dbd_private.h +++ b/include/atalk/cnid_dbd_private.h @@ -94,6 +94,8 @@ typedef struct CNID_private { char db_dir[MAXPATHLEN + 1]; /* Database directory without /.AppleDB appended */ int fd; /* File descriptor to cnid_dbd */ char stamp[ADEDLEN_PRIVSYN]; /* db timestamp */ + char *client_stamp; + size_t stamp_size; int notfirst; /* already open before */ int changed; /* stamp differ */ } CNID_private; diff --git a/libatalk/cnid/dbd/cnid_dbd.c b/libatalk/cnid/dbd/cnid_dbd.c index 64676bc3..085e0cd2 100644 --- a/libatalk/cnid/dbd/cnid_dbd.c +++ b/libatalk/cnid/dbd/cnid_dbd.c @@ -1,5 +1,5 @@ /* - * $Id: cnid_dbd.c,v 1.3 2005-05-03 14:55:13 didg Exp $ + * $Id: cnid_dbd.c,v 1.4 2005-09-07 15:23:22 didg Exp $ * * Copyright (C) Joerg Lenneis 2003 * All Rights Reserved. See COPYING. @@ -314,37 +314,44 @@ static int transmit(CNID_private *db, struct cnid_dbd_rqst *rqst, struct cnid_db while (1) { if (db->fd == -1) { + struct cnid_dbd_rqst rqst_stamp; + struct cnid_dbd_rply rply_stamp; + char stamp[ADEDLEN_PRIVSYN]; + if ((db->fd = init_tsock(db)) < 0) { time(&t); if (t - orig > MAX_DELAY) return -1; continue; } + dbd_initstamp(&rqst_stamp); + memset(stamp, 0, ADEDLEN_PRIVSYN); + rply_stamp.name = stamp; + rply_stamp.namelen = ADEDLEN_PRIVSYN; + + if (dbd_rpc(db, &rqst_stamp, &rply_stamp, silent) < 0) + goto transmit_fail; + if (dbd_reply_stamp(&rply_stamp ) < 0) + goto transmit_fail; + if (db->notfirst) { - struct cnid_dbd_rqst rqst_stamp; - struct cnid_dbd_rply rply_stamp; - char stamp[ADEDLEN_PRIVSYN]; - - dbd_initstamp(&rqst_stamp); - memset(stamp, 0, ADEDLEN_PRIVSYN); - rply_stamp.name = stamp; - rply_stamp.namelen = ADEDLEN_PRIVSYN; - - if (dbd_rpc(db, &rqst_stamp, &rply_stamp, silent) < 0) - goto transmit_fail; - if (dbd_reply_stamp(&rply_stamp ) < 0) - goto transmit_fail; if (memcmp(stamp, db->stamp, ADEDLEN_PRIVSYN)) { LOG(log_error, logtype_cnid, "transmit: not the same db!"); db->changed = 1; return -1; } } - + else { + db->notfirst = 1; + if (db->client_stamp) { + memcpy(db->client_stamp, stamp, ADEDLEN_PRIVSYN); + } + memcpy(db->stamp, stamp, ADEDLEN_PRIVSYN); + } } - if (!dbd_rpc(db, rqst, rply, silent)) + if (!dbd_rpc(db, rqst, rply, silent)) { return 0; - + } transmit_fail: silent = 0; /* From now on dbd_rpc and subroutines called from there will log messages if something goes wrong again */ @@ -379,7 +386,7 @@ static struct _cnid_db *cnid_dbd_new(const char *volpath) return NULL; } - cdb->flags = CNID_FLAG_PERSISTENT; + cdb->flags = CNID_FLAG_PERSISTENT | CNID_FLAG_LAZY_INIT; cdb->cnid_add = cnid_dbd_add; cdb->cnid_delete = cnid_dbd_delete; @@ -632,42 +639,20 @@ char *cnid_dbd_resolve(struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t le return name; } -/* --------------------- */ -static int dbd_getstamp(CNID_private *db, void *buffer, const size_t len) -{ - struct cnid_dbd_rqst rqst; - struct cnid_dbd_rply rply; - - memset(buffer, 0, len); - dbd_initstamp(&rqst); - - rply.name = buffer; - rply.namelen = len; - - if (transmit(db, &rqst, &rply) < 0) { - errno = CNID_ERR_DB; - return -1; - } - return dbd_reply_stamp(&rply); -} - /* ---------------------- */ int cnid_dbd_getstamp(struct _cnid_db *cdb, void *buffer, const size_t len) { CNID_private *db; - int ret; if (!cdb || !(db = cdb->_private) || len != ADEDLEN_PRIVSYN) { LOG(log_error, logtype_cnid, "cnid_getstamp: Parameter error"); errno = CNID_ERR_PARAM; return -1; } - ret = dbd_getstamp(db, buffer, len); - if (!ret) { - db->notfirst = 1; - memcpy(db->stamp, buffer, len); - } - return ret; + db->client_stamp = buffer; + db->stamp_size = len; + memset(buffer,0, len); + return 0; } /* ---------------------- */ -- 2.39.2