PERFORCE change 84475 for review
soc-bushman
soc-bushman at FreeBSD.org
Thu Sep 29 03:59:02 PDT 2005
http://perforce.freebsd.org/chv.cgi?CH=84475
Change 84475 by soc-bushman at soc-bushman_stinger on 2005/09/29 10:58:33
negative responses are now cached - client side needs to be modified to support this
Affected files ...
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/Makefile#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.8#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.c#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.conf#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.conf.5#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cachelib.c#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cachelib.h#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cacheplcs.c#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cacheplcs.h#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/config.c#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/config.h#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/debug.c#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/debug.h#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/hashtable.h#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/log.c#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/log.h#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_rs_query.c#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_rs_query.h#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_ws_query.c#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_ws_query.h#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/parser.c#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/parser.h#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/protocol.c#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/protocol.h#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/query.c#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/query.h#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/singletons.c#4 edit
.. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/singletons.h#4 edit
.. //depot/projects/soc2005/nsswitch_cached/tests/nsdispatch_test/nsdispatch.c#8 edit
Differences ...
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/Makefile#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.8#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.c#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.conf#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.conf.5#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cachelib.c#4 (text+ko) ====
@@ -61,7 +61,7 @@
int (*)(struct cache_common_entry_ *,
struct cache_policy_item_ *));
static int ht_items_cmp_func(const void *, const void *);
-static hashtable_index_t ht_item_hash_func(const void *);
+static hashtable_index_t ht_item_hash_func(const void *, size_t);
static int
ht_items_cmp_func(const void *p1, const void *p2)
@@ -81,7 +81,7 @@
}
static hashtable_index_t
-ht_item_hash_func(const void *p)
+ht_item_hash_func(const void *p, size_t cache_entries_size)
{
struct cache_ht_item_data_ *hp;
size_t i;
@@ -93,7 +93,8 @@
retval = 0;
for (i = 0; i < hp->key_size; ++i)
- retval = (127 * retval + (unsigned char)hp->key[i]) % CACHE_HT_SIZE;
+ retval = (127 * retval + (unsigned char)hp->key[i]) %
+ cache_entries_size;
return retval;
}
@@ -324,9 +325,10 @@
ht_key.key = item->key;
ht_key.key_size = item->key_size;
- hash = HASHTABLE_CALCULATE_HASH(cache_ht_, &ht_key);
+ hash = HASHTABLE_CALCULATE_HASH(cache_ht_, &entry->items,
+ &ht_key);
assert(hash >= 0);
- assert(hash < CACHE_HT_SIZE);
+ assert(hash < HASHTABLE_ENTRIES_COUNT(&entry->items));
ht_item = HASHTABLE_GET_ENTRY(&(entry->items), hash);
ht_item_data = HASHTABLE_ENTRY_FIND(cache_ht_, ht_item, &ht_key);
@@ -509,8 +511,11 @@
new_common_entry->name = new_common_entry->common_params.entry_name;
TRACE_STR(new_common_entry->name);
+ TRACE_POINT();
HASHTABLE_INIT(&(new_common_entry->items),
- struct cache_ht_item_data_, data);
+ struct cache_ht_item_data_, data,
+ new_common_entry->common_params.cache_entries_size);
+ TRACE_POINT();
if (new_common_entry->common_params.policy == CPT_FIFO)
policies_size = 1;
@@ -648,9 +653,10 @@
item_data.key = (char *)key;
item_data.key_size = key_size;
- hash = HASHTABLE_CALCULATE_HASH(cache_ht_, &item_data);
+ hash = HASHTABLE_CALCULATE_HASH(cache_ht_, &common_entry->items,
+ &item_data);
assert(hash >= 0);
- assert(hash < CACHE_HT_SIZE);
+ assert(hash < HASHTABLE_ENTRIES_COUNT(&common_entry->items));
item = HASHTABLE_GET_ENTRY(&(common_entry->items), hash);
find_res = HASHTABLE_ENTRY_FIND(cache_ht_, item, &item_data);
@@ -747,9 +753,10 @@
item_data.key = (char *)key;
item_data.key_size = key_size;
- hash = HASHTABLE_CALCULATE_HASH(cache_ht_, &item_data);
+ hash = HASHTABLE_CALCULATE_HASH(cache_ht_, &common_entry->items,
+ &item_data);
assert(hash >= 0);
- assert(hash < CACHE_HT_SIZE);
+ assert(hash < HASHTABLE_ENTRIES_COUNT(&common_entry->items));
item = HASHTABLE_GET_ENTRY(&(common_entry->items), hash);
find_res = HASHTABLE_ENTRY_FIND(cache_ht_, item, &item_data);
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cachelib.h#4 (text+ko) ====
@@ -34,8 +34,6 @@
#include "hashtable.h"
#include "cacheplcs.h"
-#define CACHE_HT_SIZE 257
-
enum cache_entry_t {
CET_COMMON = 0, /* cache item is atomic */
CET_MULTIPART /* cache item is formed part by part */
@@ -86,6 +84,8 @@
/* unique fields */
char *entry_name;
+ size_t cache_entries_size;
+
size_t max_elemsize; /* if 0 then no check is made */
size_t satisf_elemsize;
struct timeval max_lifetime; /* if 0 then no check is made */
@@ -136,7 +136,7 @@
struct common_cache_entry_params common_params;
- HASHTABLE_HEAD(cache_ht_, cache_ht_item_, CACHE_HT_SIZE) items;
+ HASHTABLE_HEAD(cache_ht_, cache_ht_item_) items;
size_t items_size;
struct cache_policy_ ** policies;
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cacheplcs.c#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cacheplcs.h#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/config.c#4 (text+ko) ====
@@ -49,18 +49,6 @@
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 *);
-/*static void destroy_configuration_entry(struct configuration_entry *);
-static int add_configuration_entry(struct configuration *,
- struct configuration_entry *);*/
-
-/*static int process_root_parser_pair(struct configuration *,
- struct parser_pair_ *, char const **, int *);
-static int process_parser_common_group_pair(struct common_cache_entry_params *,
- struct parser_pair_ *, char const **, int *);
-static int process_parser_mp_group_pair(struct mp_cache_entry_params *,
- struct parser_pair_ *, char const **, int *);
-static int process_parser_group(struct configuration *,
- struct parser_group_ *, char const **, int *);*/
static int
configuration_entry_cmp(const void *e1, const void *e2)
@@ -183,6 +171,7 @@
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;
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/config.h#4 (text+ko) ====
@@ -37,6 +37,7 @@
#define DEFAULT_COMMON_ENTRY_TIMEOUT 10
#define DEFAULT_MP_ENTRY_TIMEOUT 60
+#define DEFAULT_CACHE_HT_SIZE 257
extern const char *c_default_entries[6];
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/debug.c#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/debug.h#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/hashtable.h#4 (text+ko) ====
@@ -40,16 +40,21 @@
size_t size; \
}
-#define HASHTABLE_HEAD(name, entry, size) struct name { \
- struct entry entries[size]; \
+#define HASHTABLE_HEAD(name, entry) struct name { \
+ struct entry *entries; \
+ size_t entries_size; \
}
-#define HASHTABLE_ENTRIES_COUNT(table) ((sizeof(*(table))) / \
- (sizeof(*((table)->entries))))
+#define HASHTABLE_ENTRIES_COUNT(table) ((table)->entries_size)
-#define HASHTABLE_INIT(table, type, field) \
+#define HASHTABLE_INIT(table, type, field, _entries_size) \
do { \
hashtable_index_t var; \
+ (table)->entries = (void *)malloc( \
+ sizeof(*(table)->entries) * (_entries_size)); \
+ memset((table)->entries, 0, \
+ sizeof(*(table)->entries) * (_entries_size)); \
+ (table)->entries_size = (_entries_size); \
for (var = 0; var < HASHTABLE_ENTRIES_COUNT(table); ++var) {\
(table)->entries[var].field.capacity = \
HASHTABLE_INITIAL_ENTRIES_CAPACITY; \
@@ -101,15 +106,15 @@
(entry)->field.capacity * sizeof(type));
#define HASHTABLE_PROTOTYPE(name, entry_, type) \
-hashtable_index_t name##_CALCULATE_HASH(type *); \
+hashtable_index_t name##_CALCULATE_HASH(struct name *, type *); \
void name##_ENTRY_STORE(struct entry_*, type *); \
type *name##_ENTRY_FIND(struct entry_*, type *); \
void name##_ENTRY_REMOVE(struct entry_*, type *); \
#define HASHTABLE_GENERATE(name, entry_, type, field, HASH, CMP) \
-hashtable_index_t name##_CALCULATE_HASH(type *data) \
+hashtable_index_t name##_CALCULATE_HASH(struct name *table, type *data) \
{ \
- return HASH(data); \
+ return HASH(data, table->entries_size); \
} \
\
void name##_ENTRY_STORE(struct entry_ *the_entry, type *data) \
@@ -137,8 +142,8 @@
sizeof(type)); \
}
-#define HASHTABLE_CALCULATE_HASH(name, data) \
- (name##_CALCULATE_HASH(data))
+#define HASHTABLE_CALCULATE_HASH(name, table, data) \
+ (name##_CALCULATE_HASH((table), data))
#define HASHTABLE_ENTRY_STORE(name, entry, data) \
name##_ENTRY_STORE((entry), data)
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/log.c#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/log.h#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_rs_query.c#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_rs_query.h#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_ws_query.c#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_ws_query.h#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/parser.c#4 (text+ko) ====
@@ -60,7 +60,7 @@
static void set_positive_time_to_live(struct configuration *,
const char *, int);
static void set_suggested_size(struct configuration *, const char *,
- enum cache_policy_t);
+ int size);
static int strbreak(char *, char **, int);
static int
@@ -291,9 +291,27 @@
static void
set_suggested_size(struct configuration *config,
- const char *entry_name, enum cache_policy_t policy)
+ const char *entry_name, int size)
{
+ struct configuration_entry *entry;
+
TRACE_IN(set_suggested_size);
+ assert(config != NULL);
+ assert(entry_name != NULL);
+ assert(size > 0);
+
+ entry = find_create_entry(config, entry_name, EUT_COMMON);
+ assert(entry != NULL);
+ assert(entry->c_params->entry_type == CET_COMMON);
+ ((struct common_cache_entry_params *)
+ entry->c_params)->cache_entries_size = size;
+
+ entry = find_create_entry(config, entry_name, EUT_NEGATIVE);
+ assert(entry != NULL);
+ assert(entry->c_params->entry_type == CET_COMMON);
+ ((struct common_cache_entry_params *)
+ entry->c_params)->cache_entries_size = size;
+
TRACE_OUT(set_suggested_size);
}
@@ -457,7 +475,7 @@
if ((field_count == 3) &&
(strcmp(fields[0], "set-suggested-size") == 0) &&
(check_cachename(fields[1]) == 0) &&
- ((value = get_number(fields[2], 0, -1)) != -1)) {
+ ((value = get_number(fields[2], 1, -1)) != -1)) {
set_suggested_size(config, fields[1], value);
continue;
}
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/parser.h#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/protocol.c#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/protocol.h#4 (text+ko) ====
@@ -50,7 +50,7 @@
struct cache_write_response
{
- int error_code;
+ int error_code;
};
struct cache_read_request
@@ -67,7 +67,7 @@
char *data; // ignored if error_code is not 0
size_t data_size; // ignored if error_code is not 0
- int error_code;
+ int error_code;
};
struct cache_transform_request
@@ -75,12 +75,12 @@
char *entry; // ignored if entry_length is 0
size_t entry_length;
- int transformation_type;
+ int transformation_type;
};
struct cache_transform_response
{
- int error_code;
+ int error_code;
};
struct cache_mp_write_session_request {
@@ -89,7 +89,7 @@
};
struct cache_mp_write_session_response {
- int error_code;
+ int error_code;
};
struct cache_mp_write_session_write_request {
@@ -98,7 +98,7 @@
};
struct cache_mp_write_session_write_response {
- int error_code;
+ int error_code;
};
struct cache_mp_read_session_request {
@@ -107,14 +107,14 @@
};
struct cache_mp_read_session_response {
- int error_code;
+ int error_code;
};
struct cache_mp_read_session_read_response {
char *data;
size_t data_size;
- int error_code;
+ int error_code;
};
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/query.c#4 (text+ko) ====
@@ -43,6 +43,8 @@
#include "mp_rs_query.h"
#include "singletons.h"
+static const char negative_data[1] = { 0 };
+
extern void get_time_func(struct timeval *);
static int on_query_startup(struct query_state *);
@@ -60,6 +62,7 @@
static int on_write_request_read1(struct query_state *);
static int on_write_request_read2(struct query_state *);
+static int on_negative_write_request_process(struct query_state *);
static int on_write_request_process(struct query_state *);
static int on_write_response_write1(struct query_state *);
@@ -220,7 +223,8 @@
if (BUFSIZE_INVALID(write_request->entry_length) ||
BUFSIZE_INVALID(write_request->cache_key_size) ||
- BUFSIZE_INVALID(write_request->data_size)) {
+ (BUFSIZE_INVALID(write_request->data_size) &&
+ (write_request->data_size != 0))) {
TRACE_OUT(on_write_request_read1);
return (-1);
}
@@ -239,9 +243,13 @@
memset(write_request->cache_key + qstate->eid_str_length, 0,
write_request->cache_key_size);
- write_request->data = (char *)malloc(write_request->data_size);
- assert(write_request->data != NULL);
- memset(write_request->data, 0, write_request->data_size);
+ if (write_request->data_size != 0) {
+ write_request->data = (char *)malloc(
+ write_request->data_size);
+ assert(write_request->data != NULL);
+ memset(write_request->data, 0,
+ write_request->data_size);
+ }
qstate->kevent_watermark = write_request->entry_length +
write_request->cache_key_size +
@@ -266,8 +274,9 @@
write_request->entry_length);
result += qstate->read_func(qstate, write_request->cache_key +
qstate->eid_str_length, write_request->cache_key_size);
- result += qstate->read_func(qstate, write_request->data,
- write_request->data_size);
+ if (write_request->data_size != 0)
+ result += qstate->read_func(qstate, write_request->data,
+ write_request->data_size);
if (result != qstate->kevent_watermark) {
TRACE_INT(result);
@@ -277,7 +286,10 @@
write_request->cache_key_size += qstate->eid_str_length;
qstate->kevent_watermark = 0;
- qstate->process_func = on_write_request_process;
+ if (write_request->data_size != 0)
+ qstate->process_func = on_write_request_process;
+ else
+ qstate->process_func = on_negative_write_request_process;
TRACE_OUT(on_write_request_read2);
return (0);
}
@@ -329,13 +341,14 @@
write_request->cache_key_size,
write_request->data,
write_request->data_size);
- configuration_unlock_entry(qstate->config_entry);
-
+
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));
+ configuration_unlock_entry(qstate->config_entry);
+
} else {
TRACE_POINT();
write_response->error_code = -1;
@@ -351,6 +364,70 @@
}
static int
+on_negative_write_request_process(struct query_state *qstate)
+{
+ struct cache_write_request *write_request;
+ struct cache_write_response *write_response;
+ cache_entry c_entry;
+ char *neg_entry_name;
+
+ TRACE_IN(on_negative_write_request_process);
+ init_comm_element(&qstate->response, CET_WRITE_RESPONSE);
+ write_response = get_cache_write_response(&qstate->response);
+ write_request = get_cache_write_request(&qstate->request);
+
+ asprintf(&neg_entry_name, "%s_neg", write_request->entry);
+ assert(neg_entry_name != NULL);
+ qstate->config_entry = find_config_entry_by_name_and_euid(
+ s_configuration, neg_entry_name, qstate->euid);
+ free(neg_entry_name);
+
+ if (qstate->config_entry == NULL) {
+ TRACE_MSG("can't find corresponding configuration"
+ " entry. aborting request");
+ TRACE_OUT(on_negative_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_negative_write_request_process);
+ return (-1);
+ }
+
+ configuration_lock_rdlock(s_configuration);
+ c_entry = find_cache_entry(s_cache,
+ qstate->config_entry->c_params->entry_name);
+ configuration_unlock(s_configuration);
+ if (c_entry != NULL) {
+ //TRACE_STR(write_request->cache_key);
+ configuration_lock_entry(qstate->config_entry);
+ write_response->error_code = cache_write(c_entry,
+ write_request->cache_key,
+ write_request->cache_key_size,
+ negative_data,
+ sizeof(negative_data));
+
+ 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));
+ configuration_unlock_entry(qstate->config_entry);
+ } else {
+ TRACE_POINT();
+ write_response->error_code = -1;
+ }
+
+ qstate->kevent_filter = EVFILT_WRITE;
+ qstate->kevent_watermark = sizeof(int);
+ qstate->process_func = on_write_response_write1;
+ TRACE_OUT(on_negative_write_request_process);
+ return (0);
+}
+
+static int
on_write_response_write1(struct query_state *qstate)
{
struct cache_write_response *write_response;
@@ -460,9 +537,12 @@
static int
on_read_request_process(struct query_state *qstate)
{
+ struct configuration_entry *neg_entry, *timeout_entry;
+ char *neg_entry_name;
+
struct cache_read_request *read_request;
struct cache_read_response *read_response;
- cache_entry c_entry;
+ cache_entry c_entry, neg_c_entry;
struct agent *lookup_agent;
TRACE_IN(on_read_request_process);
@@ -480,18 +560,33 @@
if (qstate->config_entry == NULL) {
TRACE_MSG("can't find corresponding configuration "
"entry. aborting request");
- TRACE_OUT(on_write_request_process);
+ TRACE_OUT(on_read_request_process);
return (-1);
}
+
+ asprintf(&neg_entry_name, "%s_neg", read_request->entry);
+ assert(neg_entry_name != NULL);
+ neg_entry = find_config_entry_by_name_and_euid(
+ s_configuration, neg_entry_name, qstate->euid);
+ free(neg_entry_name);
+ if (neg_entry == NULL) {
+ TRACE_MSG("can't find corresponding configuration "
+ "entry. aborting request");
+ TRACE_OUT(on_read_request_process);
+ return (-1);
+ }
configuration_lock_rdlock(s_configuration);
c_entry = find_cache_entry(s_cache,
qstate->config_entry->c_params->entry_name);
+ neg_c_entry = find_cache_entry(s_cache,
+ neg_entry->c_params->entry_name);
configuration_unlock(s_configuration);
- if (c_entry != NULL) {
+ if ((c_entry != NULL) && (neg_c_entry != NULL)) {
TRACE_POINT();
//TRACE_STR(read_request->cache_key);
- configuration_lock_entry(qstate->config_entry);
+ timeout_entry = qstate->config_entry;
+ configuration_lock_entry(qstate->config_entry);
read_response->error_code = cache_read(c_entry,
read_request->cache_key,
read_request->cache_key_size, NULL,
@@ -508,9 +603,26 @@
read_response->data,
&read_response->data_size);
}
+ configuration_unlock_entry(qstate->config_entry);
- if ((read_response->error_code == -1)
- && (qstate->config_entry->perform_actual_lookups != 0)){
+ configuration_lock_entry(neg_entry);
+ if (read_response->error_code == -1) {
+ read_response->error_code = cache_read(neg_c_entry,
+ read_request->cache_key,
+ read_request->cache_key_size, NULL,
+ &read_response->data_size);
+
+ if (read_response->error_code == -2) {
+ timeout_entry = neg_entry;
+ read_response->error_code = 0;
+ read_response->data = NULL;
+ read_response->data_size = 0;
+ }
+ }
+ configuration_unlock_entry(neg_entry);
+
+ if ((read_response->error_code == -1) &&
+ (qstate->config_entry->perform_actual_lookups != 0)) {
free(read_response->data);
read_response->data = NULL;
read_response->data_size = 0;
@@ -532,21 +644,37 @@
if (res == NS_SUCCESS) {
read_response->error_code = 0;
+ configuration_lock_entry(qstate->config_entry);
cache_write(c_entry,
read_request->cache_key,
read_request->cache_key_size,
read_response->data,
read_response->data_size);
+ configuration_unlock_entry(qstate->config_entry);
+ } else if (res & NS_TERMINATE) {
+ configuration_lock_entry(neg_entry);
+ cache_write(neg_c_entry,
+ read_request->cache_key,
+ read_request->cache_key_size,
+ negative_data,
+ sizeof(negative_data));
+ configuration_unlock_entry(neg_entry);
+
+ timeout_entry = neg_entry;
+ read_response->error_code = 0;
+ read_response->data = NULL;
+ read_response->data_size = 0;
}
}
}
- configuration_unlock_entry(qstate->config_entry);
-
+
+ configuration_lock_entry(timeout_entry);
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));
+ configuration_unlock_entry(timeout_entry);
} else {
TRACE_POINT();
read_response->error_code = -1;
@@ -614,8 +742,9 @@
TRACE_IN(on_read_response_write2);
read_response = get_cache_read_response(&qstate->response);
- result = qstate->write_func(qstate, read_response->data,
- read_response->data_size);
+ if (read_response->data_size > 0)
+ result = qstate->write_func(qstate, read_response->data,
+ read_response->data_size);
if (result != qstate->kevent_watermark) {
TRACE_POINT();
TRACE_OUT(on_read_response_write2);
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/query.h#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/singletons.c#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/singletons.h#4 (text+ko) ====
==== //depot/projects/soc2005/nsswitch_cached/tests/nsdispatch_test/nsdispatch.c#8 (text+ko) ====
@@ -696,7 +696,7 @@
result = nss_mp_cache_write_submit(retval,
cache_data_p, ap);
} else {
- result = nss_common_cache_write_negative(cache_data_p);
+// result = nss_common_cache_write_negative(cache_data_p);
}
}
va_end(ap);
More information about the p4-projects
mailing list