Explorar o código

The current object database allows duplicate key names per object. This
is a bit of a nightmare to manage and provides no useful functionality
that I can see. Making keys unique has been discussed on IRC several
times and there seem to be no objections...so here is the patch:

Note that I have removed some now-useless parameters from the objdb API
too.



git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@1783 fd59a12c-fef9-0310-b244-a6a79926bd2f

Christine Caulfield %!s(int64=17) %!d(string=hai) anos
pai
achega
d604803280
Modificáronse 5 ficheiros con 37 adicións e 43 borrados
  1. 33 25
      exec/objdb.c
  2. 1 5
      include/corosync/engine/coroapi.h
  3. 1 5
      include/corosync/engine/objdb.h
  4. 1 3
      lib/sa-confdb.c
  5. 1 5
      services/confdb.c

+ 33 - 25
exec/objdb.c

@@ -497,9 +497,9 @@ static int object_key_create (
 	struct object_instance *instance;
 	struct object_key *object_key;
 	unsigned int res;
+	struct list_head *list;
 	int found = 0;
 	int i;
-	unsigned int val;
 
 	objdb_rdlock();
 
@@ -541,27 +541,45 @@ static int object_key_create (
 		}
 	}
 
-	object_key = malloc (sizeof (struct object_key));
-	if (object_key == 0) {
-		goto error_put;
+	/* See if it already exists */
+	found = 0;
+	for (list = instance->key_head.next;
+		list != &instance->key_head; list = list->next) {
+
+		object_key = list_entry (list, struct object_key, list);
+
+		if ((object_key->key_len == key_len) &&
+		    (memcmp (object_key->key_name, key_name, key_len) == 0)) {
+			found = 1;
+			break;
+		}
 	}
-	object_key->key_name = malloc (key_len);
-	if (object_key->key_name == 0) {
-		goto error_put_object;
+
+	if (found) {
+		free(object_key->value);
+	}
+	else {
+		object_key = malloc (sizeof (struct object_key));
+		if (object_key == 0) {
+			goto error_put;
+		}
+		object_key->key_name = malloc (key_len);
+		if (object_key->key_name == 0) {
+			goto error_put_object;
+		}
+		memcpy (object_key->key_name, key_name, key_len);
+		list_init (&object_key->list);
+		list_add_tail (&object_key->list, &instance->key_head);
 	}
-	memcpy (&val, value, 4);
 	object_key->value = malloc (value_len);
 	if (object_key->value == 0) {
 		goto error_put_key;
 	}
-	memcpy (object_key->key_name, key_name, key_len);
 	memcpy (object_key->value, value, value_len);
 
 	object_key->key_len = key_len;
 	object_key->value_len = value_len;
 
-	list_init (&object_key->list);
-	list_add_tail (&object_key->list, &instance->key_head);
 	object_key_changed_notification(object_handle, key_name, key_len,
 								value, value_len, OBJECT_KEY_CREATED);
 	objdb_rdunlock();
@@ -976,9 +994,7 @@ error_exit:
 static int object_key_delete (
 	hdb_handle_t object_handle,
 	void *key_name,
-	int key_len,
-	void *value,
-	int value_len)
+	int key_len)
 {
 	unsigned int res;
 	int ret = 0;
@@ -999,10 +1015,7 @@ static int object_key_delete (
 		object_key = list_entry (list, struct object_key, list);
 
 		if ((object_key->key_len == key_len) &&
-		    (memcmp (object_key->key_name, key_name, key_len) == 0) &&
-		    (value == NULL ||
-		     (object_key->value_len == value_len &&
-		      (memcmp (object_key->value, value, value_len) == 0)))) {
+		    (memcmp (object_key->key_name, key_name, key_len) == 0)) {
 			found = 1;
 			break;
 		}
@@ -1021,7 +1034,7 @@ static int object_key_delete (
 	hdb_handle_put (&object_instance_database, object_handle);
 	if (ret == 0)
 		object_key_changed_notification(object_handle, key_name, key_len,
-										value, value_len, OBJECT_KEY_DELETED);
+										NULL, 0, OBJECT_KEY_DELETED);
 	objdb_rdunlock();
 	return (ret);
 
@@ -1034,8 +1047,6 @@ static int object_key_replace (
 	hdb_handle_t object_handle,
 	void *key_name,
 	int key_len,
-	void *old_value,
-	int old_value_len,
 	void *new_value,
 	int new_value_len)
 {
@@ -1059,10 +1070,7 @@ static int object_key_replace (
 		object_key = list_entry (list, struct object_key, list);
 
 		if ((object_key->key_len == key_len) &&
-		    (memcmp (object_key->key_name, key_name, key_len) == 0) &&
-		    (old_value == NULL ||
-		     (object_key->value_len == old_value_len &&
-		      (memcmp (object_key->value, old_value, old_value_len) == 0)))) {
+		    (memcmp (object_key->key_name, key_name, key_len) == 0)) {
 			found = 1;
 			break;
 		}

+ 1 - 5
include/corosync/engine/coroapi.h

@@ -277,17 +277,13 @@ struct corosync_api_v1 {
 		hdb_handle_t object_handle,
 		void *key_name,
 		int key_len,
-		void *old_value,
-		int old_value_len,
 		void *new_value,
 		int new_value_len);
 
 	int (*object_key_delete) (
 		hdb_handle_t object_handle,
 		void *key_name,
-		int key_len,
-		void *value,
-		int value_len);
+		int key_len);
 
 	int (*object_iter_reset) (
 		hdb_handle_t parent_object_handle);

+ 1 - 5
include/corosync/engine/objdb.h

@@ -152,17 +152,13 @@ struct objdb_iface_ver0 {
 		hdb_handle_t object_handle,
 		void *key_name,
 		int key_len,
-		void *old_value,
-		int old_value_len,
 		void *new_value,
 		int new_value_len);
 
 	int (*object_key_delete) (
 		hdb_handle_t object_handle,
 		void *key_name,
-		int key_len,
-		void *value,
-		int value_len);
+		int key_len);
 
 	int (*object_iter_reset) (
 		hdb_handle_t parent_object_handle);

+ 1 - 3
lib/sa-confdb.c

@@ -227,8 +227,7 @@ int confdb_sa_key_delete (
 	int value_len)
 {
 	return objdb->object_key_delete(parent_object_handle,
-					key_name, key_name_len,
-					value, value_len);
+					key_name, key_name_len);
 }
 
 int confdb_sa_key_get (
@@ -290,7 +289,6 @@ int confdb_sa_key_replace (
 {
 	return objdb->object_key_replace(parent_object_handle,
 					 key_name, key_name_len,
-					 old_value, old_value_len,
 					 new_value, new_value_len);
 }
 

+ 1 - 5
services/confdb.c

@@ -430,8 +430,6 @@ static void message_handler_req_lib_confdb_key_replace (void *conn, void *messag
 	if (api->object_key_replace(req_lib_confdb_key_replace->object_handle,
 					     req_lib_confdb_key_replace->key_name.value,
 					     req_lib_confdb_key_replace->key_name.length,
-					     req_lib_confdb_key_replace->old_value.value,
-					     req_lib_confdb_key_replace->old_value.length,
 					     req_lib_confdb_key_replace->new_value.value,
 					     req_lib_confdb_key_replace->new_value.length))
 		ret = CS_ERR_ACCESS;
@@ -450,9 +448,7 @@ static void message_handler_req_lib_confdb_key_delete (void *conn, void *message
 
 	if (api->object_key_delete(req_lib_confdb_key_delete->object_handle,
 					    req_lib_confdb_key_delete->key_name.value,
-					    req_lib_confdb_key_delete->key_name.length,
-					    req_lib_confdb_key_delete->value.value,
-					    req_lib_confdb_key_delete->value.length))
+				   req_lib_confdb_key_delete->key_name.length))
 		ret = CS_ERR_ACCESS;
 
 	res.size = sizeof(res);