Skip to content

Commit

Permalink
Using hash as key for caching improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeroen committed Sep 15, 2011
1 parent f80c1ee commit 8c634e7
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 19 deletions.
1 change: 1 addition & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
* 2011/09/13 v1.06 Jeroen Nijhof <[email protected]>
Using hash as key for caching improvements
Using structs and check for overflows
Added websense version 1 and 4 support
Websense keepalive needs to be answered by accept
Expand Down
37 changes: 24 additions & 13 deletions cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,17 @@
#include "openufp.h"
#define DATABASE "/var/cache/openufp/cache.db"

void get_hash(const char *s, char hash[10]) {
unsigned int _hash = 0;
int c;

while((c = *s++)) {
/* hash = hash * 33 ^ c */
_hash = ((_hash << 5) + _hash) ^ c;
}
snprintf(hash, sizeof(hash), "%u", _hash);
}

DB *open_cache() {
DB *dbp;
int ret;
Expand All @@ -34,7 +45,7 @@ int close_cache(DB *dbp, int debug) {
return dbp->close(dbp, 0);
}

int in_cache(DB *dbp, char url[URL_SIZE], int expire_sec, int debug) {
int in_cache(DB *dbp, char hash[10], int expire_sec, int debug) {
DBT key, data;
int ret;
char sec[15];
Expand All @@ -48,28 +59,28 @@ int in_cache(DB *dbp, char url[URL_SIZE], int expire_sec, int debug) {

bzero(&key, sizeof(key));
bzero(&data, sizeof(data));
key.data = url;
key.size = strlen(url)+1;
key.data = hash;
key.size = strlen(hash)+1;
data.data = sec;
data.size = strlen(sec)+1;

if ((ret = dbp->get(dbp, NULL, &key, &data, 0)) == 0) {
if (strcmp((char *)data.data, sec) > 0) {
if (debug > 0)
syslog(LOG_INFO, "cache: url %s retrieved, time %s expire at %s.",
syslog(LOG_INFO, "cache: hash %s retrieved, time %s expire at %s.",
(char *)key.data, (char *)data.data, sec);
return 1;
}
if (debug > 0)
syslog(LOG_INFO, "cache: url in cache expired.");
rm_cache(dbp, url, debug);
syslog(LOG_INFO, "cache: hash in cache expired.");
rm_cache(dbp, hash, debug);
}
if (debug > 0)
syslog(LOG_INFO, "cache: url not in cache.");
syslog(LOG_INFO, "cache: hash not in cache.");
return 0;
}

int add_cache(DB *dbp, char url[URL_SIZE], int debug) {
int add_cache(DB *dbp, char hash[10], int debug) {
DBT key, data;
int ret;
char sec[15];
Expand All @@ -83,8 +94,8 @@ int add_cache(DB *dbp, char url[URL_SIZE], int debug) {

bzero(&key, sizeof(key));
bzero(&data, sizeof(data));
key.data = url;
key.size = strlen(url)+1;
key.data = hash;
key.size = sizeof(hash);
data.data = sec;
data.size = strlen(sec)+1;

Expand All @@ -98,7 +109,7 @@ int add_cache(DB *dbp, char url[URL_SIZE], int debug) {
return -1;
}

int rm_cache(DB *dbp, char url[URL_SIZE], int debug) {
int rm_cache(DB *dbp, char hash[10], int debug) {
DBT key;
int ret;

Expand All @@ -111,8 +122,8 @@ int rm_cache(DB *dbp, char url[URL_SIZE], int debug) {
}

bzero(&key, sizeof(key));
key.data = url;
key.size = strlen(url)+1;
key.data = hash;
key.size = sizeof(hash);

if ((ret = dbp->del(dbp, NULL, &key, 0)) == 0) {
dbp->sync(dbp, 0);
Expand Down
7 changes: 4 additions & 3 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@

#include <db.h>

extern void get_hash(const char *s, char hash[10]);
extern DB *open_cache();
extern int close_cache(DB *dbp, int debug);
extern int in_cache(DB *dbp, char url[URL_SIZE], int expire_sec, int debug);
extern int add_cache(DB *dbp, char url[URL_SIZE], int debug);
extern int rm_cache(DB *dbp, char url[URL_SIZE], int debug);
extern int in_cache(DB *dbp, char hash[10], int expire_sec, int debug);
extern int add_cache(DB *dbp, char hash[10], int debug);
extern int rm_cache(DB *dbp, char hash[10], int debug);

10 changes: 7 additions & 3 deletions openufp.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ int main(int argc, char**argv) {
int c;
while ((c = getopt(argc, argv, "l:r:c:C:d:nwp:f:g")) != -1) {
char *p;
char hash[10];
DB *cachedb;
int ret = 0;
switch(c) {
Expand All @@ -80,7 +81,8 @@ int main(int argc, char**argv) {
break;
case 'C':
cachedb = open_cache();
if (rm_cache(cachedb, optarg, 255) == -1)
get_hash(optarg, hash);
if (rm_cache(cachedb, hash, 255) == -1)
ret = 1;
close_cache(cachedb, 0);
exit(ret);
Expand Down Expand Up @@ -199,6 +201,7 @@ int main(int argc, char**argv) {
syslog(LOG_INFO, "caching disabled.");

int cached = 0;
char hash[10];
struct websns_req *websns_request = NULL;
struct n2h2_req *n2h2_request = NULL;
for(;;) {
Expand Down Expand Up @@ -248,7 +251,8 @@ int main(int argc, char**argv) {
syslog(LOG_INFO, "received url request.");

// check if cached
cached = in_cache(cachedb, request.url, cache_exp_secs, debug);
get_hash(request.url, hash);
cached = in_cache(cachedb, hash, cache_exp_secs, debug);
if (cached == -1) // Happens when there is a cache problem
cached = 0;

Expand Down Expand Up @@ -283,7 +287,7 @@ int main(int argc, char**argv) {
websns_accept(cli_fd, websns_request);
}
if (!cached)
add_cache(cachedb, request.url, debug);
add_cache(cachedb, hash, debug);
if (debug > 0)
syslog(LOG_INFO, "url accepted: srcip %s, dstip %s, url %s.",
inet_ntoa(request.srcip), inet_ntoa(request.dstip), request.url);
Expand Down

0 comments on commit 8c634e7

Please sign in to comment.