about summary refs log tree commit diff
path: root/nscd/nscd.h
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-08-26 18:35:05 +0000
committerUlrich Drepper <drepper@redhat.com>2004-08-26 18:35:05 +0000
commita95a08b4af38992cbcf3d1da97199ef19528fbde (patch)
tree669bba61a337bf8b9c9c15857877bc589792435c /nscd/nscd.h
parent1114ffff54dfbd35cbff9c845376b8221c2c9ced (diff)
downloadglibc-a95a08b4af38992cbcf3d1da97199ef19528fbde.tar.gz
glibc-a95a08b4af38992cbcf3d1da97199ef19528fbde.tar.xz
glibc-a95a08b4af38992cbcf3d1da97199ef19528fbde.zip
Update.
2004-08-26  Ulrich Drepper  <drepper@redhat.com>

	* nscd/cache.c: Major rewrite.  The data is now optionally kept in
	a mmaped memory region which is automatically mirrored on disk.
	This implements persistent data storage.  The Memory handled
	needed to be completely revamped, it now uses a garbage collection
	mechanism instead of malloc.
	* nscd/connections.c: Likewise.
	* nscd/nscd.c: Likewise.
	* nscd/nscd.h: Likewise.
	* nscd/nscd_conf.c: Likewise.
	* nscd/nscd_stat.c: Likewise.
	* nscd/grpcache.c: Likewise.
	* nscd/hstcache.c:: Likewise.
	* nscd/pwdcache.c:: Likewise.
	* nscd/Makefile: Add rules to build mem.c.
	* nscd/mem.c: New file.
	* nscd/nscd.conf: Describe new configuration options.
Diffstat (limited to 'nscd/nscd.h')
-rw-r--r--nscd/nscd.h208
1 files changed, 158 insertions, 50 deletions
diff --git a/nscd/nscd.h b/nscd/nscd.h
index af7ae9a7e5..45a93fdf29 100644
--- a/nscd/nscd.h
+++ b/nscd/nscd.h
@@ -1,4 +1,5 @@
-/* Copyright (c) 1998, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
+/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998.
 
@@ -21,6 +22,7 @@
 #define _NSCD_H	1
 
 #include <pthread.h>
+#include <stdbool.h>
 #include <time.h>
 #include <sys/uio.h>
 
@@ -40,56 +42,134 @@ typedef enum
 } dbtype;
 
 
+/* Head of record in data part of database.  */
+struct datahead
+{
+  size_t allocsize;	/* Allocated Bytes.  */
+  size_t recsize;	/* Size of the record.  */
+  time_t timeout;	/* Time when this entry becomes invalid.  */
+  bool notfound;	/* Nonzero if data for key has not been found.  */
+  uint8_t nreloads;	/* Reloads without use.  */
+  bool usable;		/* False if the entry must be ignored.  */
+
+  /* We need to have the following element aligned for the response
+     header data types and their use in the 'struct dataset' types
+     defined in the XXXcache.c files.  */
+  union
+  {
+    pw_response_header pwdata;
+    gr_response_header grdata;
+    hst_response_header hstdata;
+    ssize_t align1;
+    time_t align2;
+  } data[0];
+};
+
+
+/* Default limit on the number of times a value gets reloaded without
+   being used in the meantime.  NSCD does not throw a value out as
+   soon as it times out.  It tries to reload the value from the
+   server.  Only if the value has not been used for so many rounds it
+   is removed.  */
+#define DEFAULT_RELOAD_LIMIT 5
+
+
+/* Type for offsets in data part of database.  */
+typedef uint32_t ref_t;
+/* Value for invalid/no reference.  */
+#define ENDREF	UINT32_MAX
+
+
 /* Structure for one hash table entry.  */
 struct hashentry
 {
-  request_type type;		/* Which type of dataset.  */
+  request_type type:8;		/* Which type of dataset.  */
+  bool first;			/* True if this was the original key.  */
   size_t len;			/* Length of key.  */
-  void *key;			/* Pointer to key.  */
-  uid_t owner;                  /* If secure table, this is the owner.  */
-  struct hashentry *next;	/* Next entry in this hash bucket list.  */
-  time_t timeout;		/* Time when this entry becomes invalid.  */
-  ssize_t total;		/* Number of bytes in PACKET.  */
-  const void *packet;		/* Records for the result.  */
-  void *data;			/* The malloc()ed respond record.  */
-  int last;			/* Nonzero if DATA should be free()d.  */
-  struct hashentry *dellist;	/* Next record to be deleted.  */
+  ref_t key;			/* Pointer to key.  */
+  uid_t owner;			/* If secure table, this is the owner.  */
+  ref_t next;			/* Next entry in this hash bucket list.  */
+  ref_t packet;			/* Records for the result.  */
+  union
+  {
+    struct hashentry *dellist;	/* Next record to be deleted.  This can be a
+				   pointer since only nscd uses this field.  */
+    ref_t *prevp;		/* Pointer to field containing forward
+				   reference.  */
+  };
+};
+
+
+/* Current persistent database version.  */
+#define DB_VERSION	1
+
+/* Header of persistent database file.  */
+struct database_pers_head
+{
+  int version;
+  int header_size;
+
+  size_t module;
+  size_t data_size;
+
+  size_t first_free;		/* Offset of first free byte in data area.  */
+
+  size_t nentries;
+  size_t maxnentries;
+  size_t maxnsearched;
+
+  uintmax_t poshit;
+  uintmax_t neghit;
+  uintmax_t posmiss;
+  uintmax_t negmiss;
+
+  uintmax_t rdlockdelayed;
+  uintmax_t wrlockdelayed;
+
+  uintmax_t addfailed;
+
+  ref_t array[0];
 };
 
-/* Structure describing one database.  */
-struct database
+/* Structure describing dynamic part of one database.  */
+struct database_dyn
 {
   pthread_rwlock_t lock;
 
   int enabled;
   int check_file;
+  int persistent;
   const char *filename;
+  const char *db_filename;
   time_t file_mtime;
-  size_t module;
+  size_t suggested_module;
+  int secure;
 
-  const struct iovec *disabled_iov;
+  unsigned long int postimeout;	/* In seconds.  */
+  unsigned long int negtimeout;	/* In seconds.  */
 
-  unsigned long int postimeout;
-  unsigned long int negtimeout;
+  int wr_fd;			/* Writable file descriptor.  */
+  int ro_fd;			/* Unwritable file descriptor.  */
 
-  unsigned long int poshit;
-  unsigned long int neghit;
-  unsigned long int posmiss;
-  unsigned long int negmiss;
+  const struct iovec *disabled_iov;
 
-  unsigned long int nentries;
-  unsigned long int maxnentries;
-  unsigned long int maxnsearched;
+  struct database_pers_head *head;
+  char *data;
+  size_t memsize;
+  pthread_mutex_t memlock;
+  bool mmap_used;
+  bool last_alloc_failed;
+};
 
-  unsigned long int rdlockdelayed;
-  unsigned long int wrlockdelayed;
 
-  struct hashentry **array;
-};
+/* Paths of the file for the persistent storage.  */
+#define _PATH_NSCD_PASSWD_DB	"/var/run/nscd/passwd"
+#define _PATH_NSCD_GROUP_DB	"/var/run/nscd/group"
+#define _PATH_NSCD_HOSTS_DB	"/var/run/nscd/hosts"
 
 
 /* Global variables.  */
-extern struct database dbs[lastdb];
+extern struct database_dyn dbs[lastdb];
 extern const char *dbnames[lastdb];
 extern const char *serv2str[LASTREQ];
 
@@ -97,11 +177,11 @@ extern const struct iovec pwd_iov_disabled;
 extern const struct iovec grp_iov_disabled;
 extern const struct iovec hst_iov_disabled;
 
+
 /* Number of threads to run.  */
 extern int nthreads;
 
 /* Tables for which we cache data with uid.  */
-extern int secure[lastdb];
 extern int secure_in_use; /* Is one of the above 1?  */
 
 /* User name to run server processes as.  */
@@ -117,6 +197,13 @@ extern time_t start_time;
 /* Number of times clients had to wait.  */
 extern unsigned long int client_queued;
 
+/* Maximum needed alignment.  */
+extern const size_t block_align;
+
+/* Number of times a value is reloaded without being used.  UINT_MAX
+   means unlimited.  */
+extern unsigned int reload_count;
+
 /* Prototypes for global functions.  */
 
 /* nscd.c */
@@ -129,42 +216,63 @@ extern void close_sockets (void);
 extern void start_threads (void) __attribute__ ((__noreturn__));
 
 /* nscd_conf.c */
-extern int nscd_parse_file (const char *fname, struct database dbs[lastdb]);
+extern int nscd_parse_file (const char *fname,
+			    struct database_dyn dbs[lastdb]);
 
 /* nscd_stat.c */
-extern void send_stats (int fd, struct database dbs[lastdb]);
+extern void send_stats (int fd, struct database_dyn dbs[lastdb]);
 extern int receive_print_stats (void) __attribute__ ((__noreturn__));
 
 /* cache.c */
-extern struct hashentry *cache_search (request_type, void *key, size_t len,
-				       struct database *table, uid_t owner);
-extern void cache_add (int type, void *key, size_t len,
-		       const void *packet, size_t iovtotal, void *data,
-		       int last, time_t t, struct database *table,
-		       uid_t owner);
-extern void prune_cache (struct database *table, time_t now);
+extern struct datahead *cache_search (request_type, void *key, size_t len,
+				      struct database_dyn *table,
+				      uid_t owner);
+extern int cache_add (int type, const void *key, size_t len,
+		      struct datahead *packet, bool first,
+		      struct database_dyn *table, uid_t owner);
+extern void prune_cache (struct database_dyn *table, time_t now);
 
 /* pwdcache.c */
-extern void addpwbyname (struct database *db, int fd, request_header *req,
+extern void addpwbyname (struct database_dyn *db, int fd, request_header *req,
 			 void *key, uid_t uid);
-extern void addpwbyuid (struct database *db, int fd, request_header *req,
+extern void addpwbyuid (struct database_dyn *db, int fd, request_header *req,
 			void *key, uid_t uid);
+extern void readdpwbyname (struct database_dyn *db, struct hashentry *he,
+			   struct datahead *dh);
+extern void readdpwbyuid (struct database_dyn *db, struct hashentry *he,
+			  struct datahead *dh);
 
 /* grpcache.c */
-extern void addgrbyname (struct database *db, int fd, request_header *req,
+extern void addgrbyname (struct database_dyn *db, int fd, request_header *req,
 			 void *key, uid_t uid);
-extern void addgrbygid (struct database *db, int fd, request_header *req,
+extern void addgrbygid (struct database_dyn *db, int fd, request_header *req,
 			void *key, uid_t uid);
+extern void readdgrbyname (struct database_dyn *db, struct hashentry *he,
+			   struct datahead *dh);
+extern void readdgrbygid (struct database_dyn *db, struct hashentry *he,
+			  struct datahead *dh);
 
 /* hstcache.c */
-extern void addhstbyname (struct database *db, int fd, request_header *req,
+extern void addhstbyname (struct database_dyn *db, int fd, request_header *req,
 			  void *key, uid_t uid);
-extern void addhstbyaddr (struct database *db, int fd, request_header *req,
+extern void addhstbyaddr (struct database_dyn *db, int fd, request_header *req,
 			  void *key, uid_t uid);
-extern void addhstbynamev6 (struct database *db, int fd, request_header *req,
-			    void *key, uid_t uid);
-extern void addhstbyaddrv6 (struct database *db, int fd, request_header *req,
-			    void *key, uid_t uid);
-
+extern void addhstbynamev6 (struct database_dyn *db, int fd,
+			    request_header *req, void *key, uid_t uid);
+extern void addhstbyaddrv6 (struct database_dyn *db, int fd,
+			    request_header *req, void *key, uid_t uid);
+extern void readdhstbyname (struct database_dyn *db, struct hashentry *he,
+			    struct datahead *dh);
+extern void readdhstbyaddr (struct database_dyn *db, struct hashentry *he,
+			    struct datahead *dh);
+extern void readdhstbynamev6 (struct database_dyn *db, struct hashentry *he,
+			      struct datahead *dh);
+extern void readdhstbyaddrv6 (struct database_dyn *db, struct hashentry *he,
+			      struct datahead *dh);
+
+
+/* mem.c */
+extern void *mempool_alloc (struct database_dyn *db, size_t len);
+extern void gc (struct database_dyn *db);
 
 #endif /* nscd.h */