Namazu-devel-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
missing cache in 'nmz/field.c - nmz_get_field_data()'
- From: Youichi Iwakiri <yiwakiri@xxxxxxxxxxxx>
- Date: Thu, 03 Oct 2002 11:21:31 +0900
- X-ml-name: namazu-devel-ja
- X-mail-count: 02681
いわきりです
nmz/field.cの中のnmz_get_field_data()で、cache機能が
実装されていますが、hitミスが発生します。
同一プロセス内で、インデックスを切り替えながら複数回検索を
じっしする場合に発生します。
[php-users]で報告されています。
http://ns1.php.gr.jp/pipermail/php-users/2002-September/010012.html
nmz_free_internal()にcacheのクリアを実装した方が良くないでしょうか?
クイックハックなので、マルチスレッドサーバでの
libnamazu.soの利用は考慮していません。
--- libnamazu.c.orig Tue Mar 26 19:49:33 2002
+++ libnamazu.c Thu Oct 3 11:13:42 2002
@@ -62,6 +62,7 @@
#include "codeconv.h"
#include "search.h"
#include "hlist.h"
+#include "field.h"
#include "i18n.h"
#include "regex.h"
#include "var.h"
@@ -95,6 +96,7 @@
nmz_free_idxnames();
nmz_free_aliases();
nmz_free_replaces();
+ nmz_free_field_cache();
}
void
--- field.h.orig Sun Jan 9 17:52:27 2000
+++ field.h Thu Oct 3 11:09:31 2002
@@ -10,5 +10,6 @@
extern int nmz_isfield ( const char *key );
extern char *nmz_get_field_name ( const char *fieldpat );
extern void nmz_get_field_data ( int idxid, int docid, const char *field, char
*data );
+extern void nmz_free_field_cache ( void );
#endif /* _FIELD_H */
--- field.c.orig Fri Dec 21 14:36:40 2001
+++ field.c Thu Oct 3 11:04:11 2002
@@ -148,22 +148,22 @@
return field_name;
}
+static int cache_idx = 0, cache_num = 0;
+struct field_cache {
+ int idxid;
+ int docid;
+ char field[BUFSIZE];
+ char data[BUFSIZE];
+};
+static struct field_cache fc[FIELD_CACHE_SIZE];
+
void
nmz_get_field_data(int idxid, int docid, const char *field, char *data)
{
char fname[BUFSIZE];
char tmpfield[BUFSIZE];
int i;
- static int cache_idx = 0, cache_num = 0;
FILE *fp_field, *fp_field_idx;
- struct field_cache {
- int idxid;
- int docid;
- char field[BUFSIZE];
- char data[BUFSIZE];
- };
- static struct field_cache fc[FIELD_CACHE_SIZE];
-
strcpy(data, ""); /* For safety. */
strncpy(tmpfield, field, BUFSIZE - 1);
@@ -225,4 +225,15 @@
}
}
-
+void
+nmz_free_field_cache(void)
+{
+ int i;
+ for(i=0; i++; i < cache_num) {
+ fc[i].idxid =0;
+ fc[i].docid =0;
+ strcpy(fc[i].field, "");
+ strcpy(fc[i].data, "");
+ }
+ cache_num = 0;
+}
--
Youichi Iwakiri