]> arthur.barton.de Git - netatalk.git/commitdiff
lazy init dbd database, help with pre tiger OS and a lot of volumes.
authordidg <didg>
Wed, 7 Sep 2005 15:23:21 +0000 (15:23 +0000)
committerdidg <didg>
Wed, 7 Sep 2005 15:23:21 +0000 (15:23 +0000)
include/atalk/cnid.h
include/atalk/cnid_dbd_private.h
libatalk/cnid/dbd/cnid_dbd.c

index 7aa037661f1eb88826f69fc4f701044b3b9f3ed2..e64a677aa66b72637dd379f36762914ae18e095e 100644 (file)
@@ -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 <rlewczuk@pronet.pl>
@@ -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
  *
index 930a87c5a1fa14132a0fb861595ab97bc149f7b8..c4c48f545aa2d223371067cdc4d64b4cb37db501 100644 (file)
@@ -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;
index 64676bc3aa63aacef53756dabbe27a3a6e3d5e3c..085e0cd2e0c633e471f0bbabb6dfbfea4450acd1 100644 (file)
@@ -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;
 }
 
 /* ---------------------- */