From: Rusty Russell Date: Sat, 8 May 2010 12:54:11 +0000 (+0930) Subject: ctdb: use full range of IDR X-Git-Tag: ctdb-1.9.1~76 X-Git-Url: http://git.samba.org/?p=rusty%2Fctdb.git;a=commitdiff_plain;h=72efc4122e37798227c3420a65ed1f706ca9ebe7 ctdb: use full range of IDR This resolves a problem with huge numbers of requests which could overflow 16 bits. Fortunately, the IDR should scale reasonably well, so we can simply hold all the requests. Although noone checks for failure, I added a constant for that. BZ: 60540 Signed-off-by: Rusty Russell --- diff --git a/common/ctdb_util.c b/common/ctdb_util.c index 433a2ad8..f73f8b02 100644 --- a/common/ctdb_util.c +++ b/common/ctdb_util.c @@ -159,18 +159,14 @@ void ctdb_reclock_latency(struct ctdb_context *ctdb, const char *name, double *l uint32_t ctdb_reqid_new(struct ctdb_context *ctdb, void *state) { - uint32_t id; - - id = ctdb->idr_cnt++ & 0xFFFF; - id |= (idr_get_new(ctdb->idr, state, 0xFFFF)<<16); - return id; + return idr_get_new(ctdb->idr, state, INT_MAX); } void *_ctdb_reqid_find(struct ctdb_context *ctdb, uint32_t reqid, const char *type, const char *location) { void *p; - p = _idr_find_type(ctdb->idr, (reqid>>16)&0xFFFF, type, location); + p = _idr_find_type(ctdb->idr, reqid, type, location); if (p == NULL) { DEBUG(DEBUG_WARNING, ("Could not find idr:%u\n",reqid)); } @@ -183,7 +179,7 @@ void ctdb_reqid_remove(struct ctdb_context *ctdb, uint32_t reqid) { int ret; - ret = idr_remove(ctdb->idr, (reqid>>16)&0xFFFF); + ret = idr_remove(ctdb->idr, reqid); if (ret != 0) { DEBUG(DEBUG_ERR, ("Removing idr that does not exist\n")); } diff --git a/include/ctdb_private.h b/include/ctdb_private.h index cb7c165f..5dbd3f8e 100644 --- a/include/ctdb_private.h +++ b/include/ctdb_private.h @@ -1039,6 +1039,7 @@ int ctdb_socket_connect(struct ctdb_context *ctdb); void ctdb_latency(struct ctdb_db_context *ctdb_db, const char *name, double *latency, struct timeval t); void ctdb_reclock_latency(struct ctdb_context *ctdb, const char *name, double *latency, double l); +#define CTDB_BAD_REQID ((uint32_t)-1) uint32_t ctdb_reqid_new(struct ctdb_context *ctdb, void *state); void *_ctdb_reqid_find(struct ctdb_context *ctdb, uint32_t reqid, const char *type, const char *location); void ctdb_reqid_remove(struct ctdb_context *ctdb, uint32_t reqid);