[SCM] Samba Shared Repository - branch v3-3-test updated - release-3-2-0pre2-2532-gf845dbb

Volker Lendecke vlendec at samba.org
Tue May 20 16:37:43 GMT 2008


The branch, v3-3-test has been updated
       via  f845dbbceeff032cd248117ddf63af3d3736b21c (commit)
      from  68d6b0053f3ce63747bc26a2bebb1fb0b46c8ca0 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-3-test


- Log -----------------------------------------------------------------
commit f845dbbceeff032cd248117ddf63af3d3736b21c
Author: Volker Lendecke <vl at samba.org>
Date:   Tue May 20 18:35:23 2008 +0200

    Fix memcache_flush()
    
    I have no idea what I've been smoking when I checked this in :-(
    
    Karolin, this fixes the join bug 3.0.28->3.2.0rc1
    
    Thanks,
    
    Volker

-----------------------------------------------------------------------

Summary of changes:
 source/lib/memcache.c |   39 ++++++++++++++++++++++++++++++++++-----
 1 files changed, 34 insertions(+), 5 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/lib/memcache.c b/source/lib/memcache.c
index 6dee61a..e1426bc 100644
--- a/source/lib/memcache.c
+++ b/source/lib/memcache.c
@@ -120,11 +120,11 @@ static int memcache_compare(struct memcache_element *e, enum memcache_number n,
 {
 	DATA_BLOB this_key, this_value;
 
-	if ((int)e->n < (int)n) return -1;
-	if ((int)e->n > (int)n) return 1;
+	if ((int)e->n < (int)n) return 1;
+	if ((int)e->n > (int)n) return -1;
 
-	if (e->keylength < key.length) return -1;
-	if (e->keylength > key.length) return 1;
+	if (e->keylength < key.length) return 1;
+	if (e->keylength > key.length) return -1;
 
 	memcache_element_parse(e, &this_key, &this_value);
 	return memcmp(this_key.data, key.data, key.length);
@@ -357,10 +357,18 @@ void memcache_flush(struct memcache *cache, enum memcache_number n)
 		return;
 	}
 
+	/*
+	 * First, find *any* element of number n
+	 */
+
 	while (true) {
 		struct memcache_element *elem = memcache_node2elem(node);
 		struct rb_node *next;
 
+		if ((int)elem->n == (int)n) {
+			break;
+		}
+
 		if ((int)elem->n < (int)n) {
 			next = node->rb_right;
 		}
@@ -373,15 +381,36 @@ void memcache_flush(struct memcache *cache, enum memcache_number n)
 		node = next;
 	}
 
-	node = rb_next(node);
 	if (node == NULL) {
 		return;
 	}
 
+	/*
+	 * Then, find the leftmost element with number n
+	 */
+
+	while (true) {
+		struct rb_node *prev = rb_prev(node);
+		struct memcache_element *elem;
+
+		if (prev == NULL) {
+			break;
+		}
+		elem = memcache_node2elem(prev);
+		if ((int)elem->n != (int)n) {
+			break;
+		}
+		node = prev;
+	}
+
 	while (node != NULL) {
 		struct memcache_element *e = memcache_node2elem(node);
 		struct rb_node *next = rb_next(node);
 
+		if (e->n != n) {
+			break;
+		}
+
 		memcache_delete_element(cache, e);
 		node = next;
 	}


-- 
Samba Shared Repository


More information about the samba-cvs mailing list