PERFORCE change 84550 for review
soc-bushman
soc-bushman at FreeBSD.org
Fri Sep 30 06:48:43 PDT 2005
http://perforce.freebsd.org/chv.cgi?CH=84550
Change 84550 by soc-bushman at soc-bushman_stinger on 2005/09/30 13:47:57
negative caching fully implemented
passwd, services and hosts agents are implemented - soon cached will be able to perform lookups by itself
still some problems during self-performed lookups are possible - it requires lot of testing
Affected files ...
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/Makefile#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/Makefile.inc#1 add
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/hosts.c#1 add
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/hosts.h#1 add
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/passwd.c#1 add
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/passwd.h#1 add
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/services.c#1 add
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/services.h#1 add
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.8#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.c#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.conf#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.conf.5#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cachelib.c#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cachelib.h#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cacheplcs.c#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cacheplcs.h#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/config.c#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/config.h#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/debug.c#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/debug.h#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/hashtable.h#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/log.c#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/log.h#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_rs_query.c#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_rs_query.h#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_ws_query.c#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_ws_query.h#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/parser.c#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/parser.h#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/protocol.c#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/protocol.h#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/query.c#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/query.h#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/singletons.c#5 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/singletons.h#5 edit
.. //depot/projects/soc2005/nsswitch_cached/src/include/nscache.h#6 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/gen/getgrent.c#7 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/gen/getpwent.c#9 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/gethostnamadr.c#5 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getprotoent.c#8 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getservent.c#18 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/nscache.c#5 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/nsdispatch.c#9 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/rpc/getrpcent.c#9 edit
.. //depot/projects/soc2005/nsswitch_cached/src/usr.sbin/Makefile#3 edit
.. //depot/projects/soc2005/nsswitch_cached/src/usr.sbin/ntp/ntptrace/Makefile#2 integrate
.. //depot/projects/soc2005/nsswitch_cached/src/usr.sbin/pccard/Makefile#2 integrate
.. //depot/projects/soc2005/nsswitch_cached/src/usr.sbin/pmccontrol/pmccontrol.c#2 integrate
.. //depot/projects/soc2005/nsswitch_cached/src/usr.sbin/powerd/powerd.8#3 integrate
.. //depot/projects/soc2005/nsswitch_cached/src/usr.sbin/powerd/powerd.c#3 integrate
.. //depot/projects/soc2005/nsswitch_cached/src/usr.sbin/sysinstall/Makefile#2 integrate
.. //depot/projects/soc2005/nsswitch_cached/src/usr.sbin/sysinstall/sysinstall.h#2 integrate
.. //depot/projects/soc2005/nsswitch_cached/src/usr.sbin/syslogd/syslogd.c#3 integrate
.. //depot/projects/soc2005/nsswitch_cached/tests/nsdispatch_test/getservent.c#6 edit
.. //depot/projects/soc2005/nsswitch_cached/tests/nsdispatch_test/nscache.c#9 edit
.. //depot/projects/soc2005/nsswitch_cached/tests/nsdispatch_test/nscache.h#5 edit
.. //depot/projects/soc2005/nsswitch_cached/tests/nsdispatch_test/nsdispatch.c#9 edit
.. //depot/projects/soc2005/nsswitch_cached/tests/nsdispatch_test/nsdispatch_test.c#9 edit
Differences ...
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/Makefile#5 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.8#5 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.c#5 (text+ko) ====
@@ -8,7 +8,7 @@
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
+ * notice, this list of conditions and the following disclaimer in thereg
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
@@ -162,6 +162,7 @@
struct configuration_entry *config_entry;
size_t size, i;
+ int res;
TRACE_IN(init_cache_);
@@ -176,8 +177,10 @@
* we should register common entries now - multipart entries
* would be registered automatically during the queries
*/
- if (config_entry->c_params->entry_type == CET_COMMON)
- register_cache_entry(retval, config_entry->c_params);
+ res = register_cache_entry(retval, (struct cache_entry_params *)
+ &config_entry->positive_cache_params);
+ res = register_cache_entry(retval, (struct cache_entry_params *)
+ &config_entry->negative_cache_params);
}
TRACE_OUT(init_cache_);
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.conf#5 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.conf.5#5 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cachelib.c#5 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cachelib.h#5 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cacheplcs.c#5 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cacheplcs.h#5 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/config.c#5 (text+ko) ====
@@ -48,12 +48,15 @@
static int configuration_entry_cmp(const void *, const void *);
static struct configuration_entry *create_configuration_entry(const char *,
- uid_t, int, struct timeval const *, struct cache_entry_params const *);
+ struct timeval const *, struct timeval const *,
+ struct common_cache_entry_params const *,
+ struct common_cache_entry_params const *,
+ struct mp_cache_entry_params const *);
static int
configuration_entry_cmp(const void *e1, const void *e2)
{
- struct configuration_entry *entry1;
+/* struct configuration_entry *entry1;
struct configuration_entry *entry2;
int res;
@@ -75,23 +78,104 @@
res = 0;
}
- return (res);
+ return (res);*/
+ return (strcmp((const char *)e1,
+ (*((struct configuration_entry **)e2))->name
+ ));
}
static struct configuration_entry *
-create_configuration_entry(const char *name, uid_t desired_euid,
- int use_desired_euid, struct timeval const *timeout,
- struct cache_entry_params const *params)
+create_configuration_entry(const char *name,
+ struct timeval const *common_timeout,
+ struct timeval const *mp_timeout,
+ struct common_cache_entry_params const *positive_params,
+ struct common_cache_entry_params const *negative_params,
+ struct mp_cache_entry_params const *mp_params)
{
- struct configuration_entry *retval;
+ struct configuration_entry *retval;
size_t size;
pthread_mutexattr_t attr;
- int res;
+ int res;
TRACE_IN(create_configuration_entry);
assert(name != NULL);
+ assert(positive_params != NULL);
+ assert(negative_params != NULL);
+ assert(mp_params != NULL);
+
+
+ res = pthread_mutexattr_init(&attr);
+ if (res != 0) {
+ TRACE_INT(res);
+ TRACE_OUT(create_configuration_entry);
+ return (NULL);
+ }
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL);
+
+ retval = (struct configuration_entry *)malloc(
+ sizeof(struct configuration_entry));
+ assert(retval != NULL);
+ memset(retval, 0, sizeof(struct configuration_entry));
+
+ res = pthread_mutex_init(&retval->positive_cache_lock, &attr);
+ if (res != 0) {
+ free(retval);
+ pthread_mutexattr_destroy(&attr);
+ TRACE_OUT(create_configuration_entry);
+ return (NULL);
+ }
+
+ res = pthread_mutex_init(&retval->negative_cache_lock, &attr);
+ if (res != 0) {
+ pthread_mutex_destroy(&retval->positive_cache_lock);
+ free(retval);
+ pthread_mutexattr_destroy(&attr);
+ TRACE_OUT(create_configuration_entry);
+ return (NULL);
+ }
+
+ res = pthread_mutex_init(&retval->mp_cache_lock, &attr);
+ if (res != 0) {
+ pthread_mutex_destroy(&retval->positive_cache_lock);
+ pthread_mutex_destroy(&retval->negative_cache_lock);
+ free(retval);
+ pthread_mutexattr_destroy(&attr);
+ TRACE_OUT(create_configuration_entry);
+ return (NULL);
+ }
+
+ pthread_mutexattr_destroy(&attr);
+
+ memcpy(&retval->positive_cache_params, positive_params,
+ sizeof(struct common_cache_entry_params));
+ memcpy(&retval->negative_cache_params, negative_params,
+ sizeof(struct common_cache_entry_params));
+ memcpy(&retval->mp_cache_params, mp_params,
+ sizeof(struct mp_cache_entry_params));
- switch (params->entry_type) {
+ size = strlen(name);
+ retval->name = (char *)malloc(size + 1);
+ assert(retval->name != NULL);
+ memset(retval->name, 0, size + 1);
+ memcpy(retval->name, name, size);
+
+ memcpy(&retval->common_query_timeout, common_timeout,
+ sizeof(struct timeval));
+ memcpy(&retval->mp_query_timeout, mp_timeout,
+ sizeof(struct timeval));
+
+ asprintf(&retval->positive_cache_params.entry_name, "%s+", name);
+ assert(retval->positive_cache_params.entry_name != NULL);
+
+ asprintf(&retval->negative_cache_params.entry_name, "%s-", name);
+ assert(retval->negative_cache_params.entry_name != NULL);
+
+ asprintf(&retval->mp_cache_params.entry_name, "%s*", name);
+ assert(retval->mp_cache_params.entry_name != NULL);
+
+ TRACE_OUT(create_configuration_entry);
+ return (retval);
+/* switch (params->entry_type) {
case CET_COMMON:
size = sizeof(struct common_cache_entry_params);
break;
@@ -151,57 +235,52 @@
memcpy(&retval->query_timeout, timeout, sizeof(struct timeval));
TRACE_OUT(create_configuration_entry);
- return (retval);
+ return (retval);*/
}
struct configuration_entry *
-create_def_configuration_entry(const char *name, enum cache_entry_t type)
+create_def_configuration_entry(const char *name)
{
- struct common_cache_entry_params common_params;
+ struct common_cache_entry_params positive_params, negative_params;
struct mp_cache_entry_params mp_params;
- struct timeval default_timeout;
+ struct timeval default_common_timeout, default_mp_timeout;
struct configuration_entry *res = NULL;
TRACE_IN(create_def_configuration_entry);
- memset(&default_timeout, 0, sizeof(struct timeval));
- switch (type) {
- case CET_COMMON:
- memset(&common_params, 0,
- sizeof(struct common_cache_entry_params));
- common_params.entry_type = CET_COMMON;
- common_params.entry_name = (char *)name;
- common_params.cache_entries_size = DEFAULT_CACHE_HT_SIZE;
- common_params.max_elemsize = 2048;
- common_params.satisf_elemsize = 1024;
- common_params.max_lifetime.tv_sec = 60 * 60 * 12;
- common_params.policy = CPT_LRU;
+ memset(&positive_params, 0,
+ sizeof(struct common_cache_entry_params));
+ positive_params.entry_type = CET_COMMON;
+ positive_params.cache_entries_size = DEFAULT_CACHE_HT_SIZE;
+ positive_params.max_elemsize = 2048;
+ positive_params.satisf_elemsize = 1024;
+ positive_params.max_lifetime.tv_sec = 60 * 60 * 12;
+ positive_params.policy = CPT_LRU;
+
+ memcpy(&negative_params, &positive_params,
+ sizeof(struct common_cache_entry_params));
+ negative_params.max_elemsize = 512;
+ negative_params.satisf_elemsize = 256;
+ negative_params.max_lifetime.tv_sec = 60 * 60;
+ negative_params.policy = CPT_FIFO;
- default_timeout.tv_sec = DEFAULT_COMMON_ENTRY_TIMEOUT;
+ memset(&default_common_timeout, 0, sizeof(struct timeval));
+ default_common_timeout.tv_sec = DEFAULT_COMMON_ENTRY_TIMEOUT;
+
+ memset(&default_mp_timeout, 0, sizeof(struct timeval));
+ default_mp_timeout.tv_sec = DEFAULT_MP_ENTRY_TIMEOUT;
+
+ memset(&mp_params, 0,
+ sizeof(struct mp_cache_entry_params));
+ mp_params.entry_type = CET_MULTIPART;
+ mp_params.max_elemsize = 1024 * 8;
+ mp_params.max_sessions = 1024;
+ mp_params.max_lifetime.tv_sec = 60 * 60 * 12;
- res = create_configuration_entry(name, -1, 0,
- &default_timeout,
- (struct cache_entry_params *)&common_params);
- break;
- case CET_MULTIPART:
- memset(&mp_params, 0,
- sizeof(struct mp_cache_entry_params));
- mp_params.entry_type = CET_MULTIPART;
- mp_params.entry_name = (char *)name;
- mp_params.max_elemsize = 1024 * 8;
- mp_params.max_sessions = 1024;
- mp_params.max_lifetime.tv_sec = 60 * 60 * 12;
-
- default_timeout.tv_sec = DEFAULT_MP_ENTRY_TIMEOUT;
-
- res = create_configuration_entry(name, -1, 0,
- &default_timeout,
- (struct cache_entry_params *)&mp_params);
- break;
- default:
- break;
- }
-
+ res = create_configuration_entry(name, &default_common_timeout,
+ &default_mp_timeout, &positive_params, &negative_params,
+ &mp_params);
+
TRACE_OUT(create_def_configuration_entry);
return (res);
}
@@ -211,11 +290,14 @@
{
TRACE_IN(destroy_configuration_entry);
assert(entry != NULL);
- pthread_mutex_destroy(&entry->lock);
+ pthread_mutex_destroy(&entry->positive_cache_lock);
+ pthread_mutex_destroy(&entry->negative_cache_lock);
+ pthread_mutex_destroy(&entry->mp_cache_lock);
free(entry->name);
- if (entry->use_desired_euid != 0)
- free(entry->c_params->entry_name);
- free(entry->c_params);
+ free(entry->positive_cache_params.entry_name);
+ free(entry->negative_cache_params.entry_name);
+ free(entry->mp_cache_params.entry_name);
+ free(entry->mp_cache_entries);
free(entry);
TRACE_OUT(destroy_configuration_entry);
}
@@ -225,7 +307,9 @@
struct configuration_entry *entry)
{
TRACE_IN(add_configuration_entry);
- if (configuration_find_entry(config, entry) != NULL) {
+ assert(entry != NULL);
+ assert(entry->name != NULL);
+ if (configuration_find_entry(config, entry->name) != NULL) {
TRACE_OUT(add_configuration_entry);
return (-1);
}
@@ -558,12 +642,13 @@
struct configuration_entry *
configuration_find_entry(struct configuration *config,
- struct configuration_entry const *model)
+ const char *name)
{
struct configuration_entry **retval;
TRACE_IN(configuration_find_entry);
- retval = bsearch(&model, config->entries, config->entries_size,
+
+ retval = bsearch(name, config->entries, config->entries_size,
sizeof(struct configuration_entry *), configuration_entry_cmp);
TRACE_OUT(configuration_find_entry);
@@ -595,20 +680,50 @@
}
void
-configuration_lock_entry(struct configuration_entry *entry)
+configuration_lock_entry(struct configuration_entry *entry,
+ enum config_entry_lock_type lock_type)
{
TRACE_IN(configuration_lock_entry);
assert(entry != NULL);
- pthread_mutex_lock(&entry->lock);
+
+ switch (lock_type) {
+ case CELT_POSITIVE:
+ pthread_mutex_lock(&entry->positive_cache_lock);
+ break;
+ case CELT_NEGATIVE:
+ pthread_mutex_lock(&entry->negative_cache_lock);
+ break;
+ case CELT_MULTIPART:
+ pthread_mutex_lock(&entry->mp_cache_lock);
+ break;
+ default:
+ /* should be unreachable */
+ break;
+ }
TRACE_OUT(configuration_lock_entry);
}
void
-configuration_unlock_entry(struct configuration_entry *entry)
+configuration_unlock_entry(struct configuration_entry *entry,
+ enum config_entry_lock_type lock_type)
{
TRACE_IN(configuration_unlock_entry);
assert(entry != NULL);
- pthread_mutex_unlock(&entry->lock);
+
+ switch (lock_type) {
+ case CELT_POSITIVE:
+ pthread_mutex_unlock(&entry->positive_cache_lock);
+ break;
+ case CELT_NEGATIVE:
+ pthread_mutex_unlock(&entry->negative_cache_lock);
+ break;
+ case CELT_MULTIPART:
+ pthread_mutex_unlock(&entry->mp_cache_lock);
+ break;
+ default:
+ /* should be unreachable */
+ break;
+ }
TRACE_OUT(configuration_unlock_entry);
}
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/config.h#5 (text+ko) ====
@@ -42,15 +42,24 @@
extern const char *c_default_entries[6];
struct configuration_entry {
- struct timeval query_timeout;
- struct cache_entry_params *c_params;
+ struct common_cache_entry_params positive_cache_params;
+ struct common_cache_entry_params negative_cache_params;
+ struct mp_cache_entry_params mp_cache_params;
+
+ cache_entry positive_cache_entry;
+ cache_entry negative_cache_entry;
+
+ cache_entry *mp_cache_entries;
+ size_t mp_cache_entries_size;
+
+ struct timeval common_query_timeout;
+ struct timeval mp_query_timeout;
char *name;
- pthread_mutex_t lock;
+ pthread_mutex_t positive_cache_lock;
+ pthread_mutex_t negative_cache_lock;
+ pthread_mutex_t mp_cache_lock;
- uid_t desired_euid;
- int use_desired_euid;
-
int perform_actual_lookups;
int enabled;
};
@@ -73,28 +82,34 @@
int threads_num;
};
+enum config_entry_lock_type {
+ CELT_POSITIVE,
+ CELT_NEGATIVE,
+ CELT_MULTIPART
+};
+
extern struct configuration *init_configuration(void);
extern void destroy_configuration(struct configuration *);
extern void fill_configuration_defaults(struct configuration *);
-/*extern int read_configuration(const char *, struct configuration *,
- char const **, int *);*/
extern int add_configuration_entry(struct configuration *,
struct configuration_entry *);
extern struct configuration_entry *create_def_configuration_entry(
- const char *, enum cache_entry_t);
+ const char *);
extern void destroy_configuration_entry(struct configuration_entry *);
extern size_t configuration_get_entries_size(struct configuration *);
extern struct configuration_entry *configuration_get_entry(
struct configuration *, size_t);
extern struct configuration_entry *configuration_find_entry(
- struct configuration *, struct configuration_entry const *);
+ struct configuration *, const char *);
extern void configuration_lock_rdlock(struct configuration *config);
extern void configuration_lock_wrlock(struct configuration *config);
extern void configuration_unlock(struct configuration *config);
-extern void configuration_lock_entry(struct configuration_entry *);
-extern void configuration_unlock_entry(struct configuration_entry *);
+extern void configuration_lock_entry(struct configuration_entry *,
+ enum config_entry_lock_type);
+extern void configuration_unlock_entry(struct configuration_entry *,
+ enum config_entry_lock_type);
#endif
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/debug.c#5 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/debug.h#5 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/hashtable.h#5 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/log.c#5 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/log.h#5 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_rs_query.c#5 (text+ko) ====
@@ -60,10 +60,11 @@
finalize_comm_element(&qstate->response);
if (qstate->mdata != NULL) {
- configuration_lock_entry(qstate->config_entry);
+ configuration_lock_entry(qstate->config_entry, CELT_MULTIPART);
close_cache_mp_read_session(
(cache_mp_read_session)qstate->mdata);
- configuration_unlock_entry(qstate->config_entry);
+ configuration_unlock_entry(qstate->config_entry,
+ CELT_MULTIPART);
}
TRACE_OUT(on_mp_read_session_destroy);
}
@@ -149,8 +150,8 @@
&qstate->response);
c_mp_rs_request = get_cache_mp_read_session_request(&qstate->request);
- qstate->config_entry = find_config_entry_by_name_and_euid(
- s_configuration, c_mp_rs_request->entry, qstate->euid);
+ qstate->config_entry = configuration_find_entry(
+ s_configuration, c_mp_rs_request->entry);
if (qstate->config_entry == NULL) {
TRACE_MSG("can't find corresponding configuration entry."
" aborting request");
@@ -159,7 +160,7 @@
}
asprintf(&dec_cache_entry_name, "%s%s", qstate->eid_str,
- qstate->config_entry->c_params->entry_name);
+ qstate->config_entry->mp_cache_params.entry_name);
assert(dec_cache_entry_name != NULL);
configuration_lock_rdlock(s_configuration);
@@ -168,21 +169,22 @@
free(dec_cache_entry_name);
if (c_entry != INVALID_CACHE_ENTRY) {
- configuration_lock_entry(qstate->config_entry);
+ configuration_lock_entry(qstate->config_entry, CELT_MULTIPART);
rs = open_cache_mp_read_session(c_entry);
if (rs == INVALID_CACHE_MP_READ_SESSION)
c_mp_rs_response->error_code = -1;
else {
- qstate->mdata = rs;
- qstate->destroy_func = on_mp_read_session_destroy;
+ qstate->mdata = rs;
+ qstate->destroy_func = on_mp_read_session_destroy;
- if ((qstate->config_entry->query_timeout.tv_sec != 0) ||
- (qstate->config_entry->query_timeout.tv_usec != 0))
- memcpy(&qstate->timeout,
- &qstate->config_entry->query_timeout,
- sizeof(struct timeval));
+ if ((qstate->config_entry->mp_query_timeout.tv_sec != 0) ||
+ (qstate->config_entry->mp_query_timeout.tv_usec != 0))
+ memcpy(&qstate->timeout,
+ &qstate->config_entry->mp_query_timeout,
+ sizeof(struct timeval));
}
- configuration_unlock_entry(qstate->config_entry);
+ configuration_unlock_entry(qstate->config_entry,
+ CELT_MULTIPART);
} else
c_mp_rs_response->error_code = -1;
@@ -271,7 +273,7 @@
read_response = get_cache_mp_read_session_read_response(
&qstate->response);
- configuration_lock_entry(qstate->config_entry);
+ configuration_lock_entry(qstate->config_entry, CELT_MULTIPART);
read_response->error_code = cache_mp_read(
(cache_mp_read_session)qstate->mdata, NULL,
&read_response->data_size);
@@ -285,7 +287,7 @@
read_response->data,
&read_response->data_size);
}
- configuration_unlock_entry(qstate->config_entry);
+ configuration_unlock_entry(qstate->config_entry, CELT_MULTIPART);
if (read_response->error_code == 0)
qstate->kevent_watermark = sizeof(size_t) + sizeof(int);
@@ -374,9 +376,9 @@
on_mp_read_session_close_notification(struct query_state *qstate)
{
TRACE_IN(on_mp_read_session_close_notification);
- configuration_lock_entry(qstate->config_entry);
+ configuration_lock_entry(qstate->config_entry, CELT_MULTIPART);
close_cache_mp_read_session((cache_mp_read_session)qstate->mdata);
- configuration_unlock_entry(qstate->config_entry);
+ configuration_unlock_entry(qstate->config_entry, CELT_MULTIPART);
qstate->mdata = NULL;
qstate->kevent_watermark = 0;
qstate->process_func = NULL;
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_rs_query.h#5 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_ws_query.c#5 (text+ko) ====
@@ -62,10 +62,11 @@
finalize_comm_element(&qstate->response);
if (qstate->mdata != NULL) {
- configuration_lock_entry(qstate->config_entry);
+ configuration_lock_entry(qstate->config_entry, CELT_MULTIPART);
abandon_cache_mp_write_session(
(cache_mp_write_session)qstate->mdata);
- configuration_unlock_entry(qstate->config_entry);
+ configuration_unlock_entry(qstate->config_entry,
+ CELT_MULTIPART);
}
TRACE_OUT(on_mp_write_session_destroy);
}
@@ -143,7 +144,7 @@
struct cache_mp_write_session_request *c_mp_ws_request;
struct cache_mp_write_session_response *c_mp_ws_response;
cache_mp_write_session ws;
- cache_entry c_entry;
+ cache_entry c_entry, *new_mp_entries, *old_mp_entries;
char *dec_cache_entry_name, *en_bkp;
TRACE_IN(on_mp_write_session_request_process);
@@ -152,17 +153,24 @@
&qstate->response);
c_mp_ws_request = get_cache_mp_write_session_request(&qstate->request);
- qstate->config_entry = find_config_entry_by_name_and_euid(
- s_configuration, c_mp_ws_request->entry, qstate->euid);
+ qstate->config_entry = configuration_find_entry(
+ s_configuration, c_mp_ws_request->entry);
if (qstate->config_entry == NULL) {
TRACE_MSG("can't find corresponding configuration entry. "
"aborting request");
TRACE_OUT(on_write_request_process);
return (-1);
}
-
+
+ if (qstate->config_entry->perform_actual_lookups != 0) {
+ TRACE_MSG(
+ "entry performs lookups by itself: can't write to it");
+ TRACE_OUT(on_write_request_process);
+ return (-1);
+ }
+
asprintf(&dec_cache_entry_name, "%s%s", qstate->eid_str,
- qstate->config_entry->c_params->entry_name);
+ qstate->config_entry->mp_cache_params.entry_name);
assert(dec_cache_entry_name != NULL);
configuration_lock_rdlock(s_configuration);
@@ -170,25 +178,44 @@
dec_cache_entry_name);
configuration_unlock(s_configuration);
if (c_entry == INVALID_CACHE_ENTRY) {
+ configuration_lock_entry(qstate->config_entry, CELT_MULTIPART);
+
configuration_lock_wrlock(s_configuration);
- configuration_lock_entry(qstate->config_entry);
- en_bkp = qstate->config_entry->c_params->entry_name;
- qstate->config_entry->c_params->entry_name =
+ en_bkp = qstate->config_entry->mp_cache_params.entry_name;
+ qstate->config_entry->mp_cache_params.entry_name =
dec_cache_entry_name;
- register_cache_entry(s_cache, qstate->config_entry->c_params);
- qstate->config_entry->c_params->entry_name = en_bkp;
- configuration_unlock_entry(qstate->config_entry);
+ register_cache_entry(s_cache, (struct cache_entry_params *)
+ &qstate->config_entry->mp_cache_params);
+ qstate->config_entry->mp_cache_params.entry_name = en_bkp;
configuration_unlock(s_configuration);
configuration_lock_rdlock(s_configuration);
c_entry = find_cache_entry(s_cache,
dec_cache_entry_name);
configuration_unlock(s_configuration);
+
+ ++qstate->config_entry->mp_cache_entries_size;
+ new_mp_entries = (cache_entry *)malloc(sizeof(cache_entry) *
+ qstate->config_entry->mp_cache_entries_size);
+ assert(new_mp_entries != NULL);
+ new_mp_entries[0] = c_entry;
+ if (qstate->config_entry->mp_cache_entries_size -1 > 0) {
+ memcpy(new_mp_entries + 1,
+ qstate->config_entry->mp_cache_entries,
+ qstate->config_entry->mp_cache_entries_size - 1);
+ }
+
+ old_mp_entries = qstate->config_entry->mp_cache_entries;
+ qstate->config_entry->mp_cache_entries = new_mp_entries;
+ free(old_mp_entries);
+
+ configuration_unlock_entry(qstate->config_entry,
+ CELT_MULTIPART);
}
free(dec_cache_entry_name);
assert(c_entry != NULL);
- configuration_lock_entry(qstate->config_entry);
+ configuration_lock_entry(qstate->config_entry, CELT_MULTIPART);
ws = open_cache_mp_write_session(c_entry);
if (ws == INVALID_CACHE_MP_WRITE_SESSION)
c_mp_ws_response->error_code = -1;
@@ -196,13 +223,13 @@
qstate->mdata = ws;
qstate->destroy_func = on_mp_write_session_destroy;
- if ((qstate->config_entry->query_timeout.tv_sec != 0) ||
- (qstate->config_entry->query_timeout.tv_usec != 0))
+ if ((qstate->config_entry->mp_query_timeout.tv_sec != 0) ||
+ (qstate->config_entry->mp_query_timeout.tv_usec != 0))
memcpy(&qstate->timeout,
- &qstate->config_entry->query_timeout,
+ &qstate->config_entry->mp_query_timeout,
sizeof(struct timeval));
}
- configuration_unlock_entry(qstate->config_entry);
+ configuration_unlock_entry(qstate->config_entry, CELT_MULTIPART);
qstate->process_func = on_mp_write_session_response_write1;
qstate->kevent_watermark = sizeof(int);
@@ -358,12 +385,12 @@
write_request = get_cache_mp_write_session_write_request(
&qstate->request);
- configuration_lock_entry(qstate->config_entry);
+ configuration_lock_entry(qstate->config_entry, CELT_MULTIPART);
write_response->error_code = cache_mp_write(
(cache_mp_write_session)qstate->mdata,
write_request->data,
write_request->data_size);
- configuration_unlock_entry(qstate->config_entry);
+ configuration_unlock_entry(qstate->config_entry, CELT_MULTIPART);
qstate->kevent_watermark = sizeof(int);
qstate->process_func = on_mp_write_session_write_response_write1;
@@ -409,9 +436,9 @@
on_mp_write_session_abandon_notification(struct query_state *qstate)
{
TRACE_IN(on_mp_write_session_abandon_notification);
- configuration_lock_entry(qstate->config_entry);
+ configuration_lock_entry(qstate->config_entry, CELT_MULTIPART);
abandon_cache_mp_write_session((cache_mp_write_session)qstate->mdata);
- configuration_unlock_entry(qstate->config_entry);
+ configuration_unlock_entry(qstate->config_entry, CELT_MULTIPART);
qstate->mdata = INVALID_CACHE_MP_WRITE_SESSION;
qstate->kevent_watermark = 0;
@@ -424,9 +451,9 @@
on_mp_write_session_close_notification(struct query_state *qstate)
{
TRACE_IN(on_mp_write_session_close_notification);
- configuration_lock_entry(qstate->config_entry);
+ configuration_lock_entry(qstate->config_entry, CELT_MULTIPART);
close_cache_mp_write_session((cache_mp_write_session)qstate->mdata);
- configuration_unlock_entry(qstate->config_entry);
+ configuration_unlock_entry(qstate->config_entry, CELT_MULTIPART);
qstate->mdata = INVALID_CACHE_MP_WRITE_SESSION;
qstate->kevent_watermark = 0;
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_ws_query.h#5 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/parser.c#5 (text+ko) ====
@@ -33,16 +33,9 @@
#include "log.h"
#include "parser.h"
-enum entry_use_type {
- EUT_COMMON = 0,
- EUT_MULTIPART = 1,
- EUT_NEGATIVE = 2,
- EUT_MAX = 3
-};
-
static void enable_cache(struct configuration *,const char *, int);
static struct configuration_entry *find_create_entry(struct configuration *,
- const char *, enum entry_use_type);
+ const char *);
static int get_number(const char *, int, int);
static enum cache_policy_t get_policy(const char *);
static int get_yesno(const char *);
@@ -86,61 +79,20 @@
static struct configuration_entry *
find_create_entry(struct configuration *config,
- const char *entry_name, enum entry_use_type use_type)
+ const char *entry_name)
{
struct configuration_entry *entry = NULL;
- struct configuration_entry model;
- enum cache_entry_t entry_type;
int res;
- TRACE_IN(find_create_entry);
- memset(&model, 0, sizeof(struct configuration_entry));
- switch (use_type) {
- case EUT_COMMON:
- model.name = (char *)entry_name;
- break;
- case EUT_MULTIPART:
- asprintf(&model.name, "%s_mp", entry_name);
- assert(model.name != NULL);
- break;
- case EUT_NEGATIVE:
- asprintf(&model.name, "%s_neg", entry_name);
- assert(model.name != NULL);
- break;
- default:
- /* should be unreachable */
- break;
- }
-
-
- entry = configuration_find_entry(config, &model);
+ TRACE_IN(find_create_entry);
+ entry = configuration_find_entry(config, entry_name);
if (entry == NULL) {
- switch (use_type) {
- case EUT_COMMON:
- case EUT_NEGATIVE:
- entry_type = CET_COMMON;
- break;
- case EUT_MULTIPART:
- entry_type = CET_MULTIPART;
- break;
- default:
- /* should be unreachable */
- break;
- }
- entry = create_def_configuration_entry(model.name, entry_type);
+ entry = create_def_configuration_entry(entry_name);
assert( entry != NULL);
res = add_configuration_entry(config, entry);
assert(res == 0);
}
- switch (use_type) {
- case EUT_MULTIPART:
- case EUT_NEGATIVE:
- free(model.name);
- break;
- default:
- break;
- }
TRACE_OUT(find_create_entry);
return (entry);
}
@@ -149,14 +101,10 @@
enable_cache(struct configuration *config, const char *entry_name, int flag)
{
struct configuration_entry *entry;
- int i;
TRACE_IN(enable_cache);
- for (i = 0; i < EUT_MAX; ++i) {
- entry = find_create_entry(config, entry_name, i);
- assert(entry != NULL);
- entry->enabled = flag;
- }
+ entry = find_create_entry(config, entry_name);
+ entry->enabled = flag;
TRACE_OUT(enable_cache);
}
@@ -173,17 +121,12 @@
memset(&lifetime, 0, sizeof(struct timeval));
lifetime.tv_sec = ttl;
- entry = find_create_entry(config, entry_name, EUT_COMMON);
- assert(entry->c_params->entry_type == CET_COMMON);
- memcpy(&((struct common_cache_entry_params *)
- entry->c_params)->max_lifetime,
+ entry = find_create_entry(config, entry_name);
+ memcpy(&entry->positive_cache_params.max_lifetime,
+ &lifetime, sizeof(struct timeval));
+ memcpy(&entry->mp_cache_params.max_lifetime,
&lifetime, sizeof(struct timeval));
- entry = find_create_entry(config, entry_name, EUT_MULTIPART);
- assert(entry->c_params->entry_type == CET_MULTIPART);
- memcpy(&((struct mp_cache_entry_params *)entry->c_params)->max_lifetime,
- &lifetime, sizeof(struct timeval));
-
TRACE_OUT(set_positive_time_to_live);
}
@@ -200,12 +143,10 @@
memset(&lifetime, 0, sizeof(struct timeval));
lifetime.tv_sec = nttl;
- entry = find_create_entry(config, entry_name, EUT_NEGATIVE);
+ entry = find_create_entry(config, entry_name);
assert(entry != NULL);
- assert(entry->c_params->entry_type == CET_COMMON);
- memcpy(&((struct common_cache_entry_params *)
- entry->c_params)->max_lifetime,
- &lifetime, sizeof(struct timeval));
+ memcpy(&entry->negative_cache_params.max_lifetime,
+ &lifetime, sizeof(struct timeval));
TRACE_OUT(set_negative_time_to_live);
}
@@ -220,17 +161,13 @@
assert(count >= 0);
assert(entry_name != NULL);
- entry = find_create_entry(config, entry_name, EUT_COMMON);
+ entry = find_create_entry(config, entry_name);
assert(entry != NULL);
- assert(entry->c_params->entry_type == CET_COMMON);
- ((struct common_cache_entry_params *)
- entry->c_params)->max_elemsize = count;
+ entry->positive_cache_params.max_elemsize = count;
- entry = find_create_entry(config, entry_name, EUT_NEGATIVE);
+ entry = find_create_entry(config, entry_name);
assert(entry != NULL);
- assert(entry->c_params->entry_type == CET_COMMON);
- ((struct common_cache_entry_params *)
- entry->c_params)->max_elemsize = count;
+ entry->negative_cache_params.max_elemsize = count;
TRACE_OUT(set_keep_hot_count);
}
@@ -244,11 +181,9 @@
TRACE_IN(set_positive_policy);
assert(entry_name != NULL);
- entry = find_create_entry(config, entry_name, EUT_COMMON);
+ entry = find_create_entry(config, entry_name);
assert(entry != NULL);
- assert(entry->c_params->entry_type == CET_COMMON);
- ((struct common_cache_entry_params *)
- entry->c_params)->policy = policy;
+ entry->positive_cache_params.policy = policy;
TRACE_OUT(set_positive_policy);
}
@@ -262,11 +197,9 @@
TRACE_IN(set_negative_policy);
assert(entry_name != NULL);
- entry = find_create_entry(config, entry_name, EUT_NEGATIVE);
+ entry = find_create_entry(config, entry_name);
assert(entry != NULL);
- assert(entry->c_params->entry_type == CET_COMMON);
- ((struct common_cache_entry_params *)
- entry->c_params)->policy = policy;
+ entry->negative_cache_params.policy = policy;
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list