The attached patch helps us add entries to the objdb to do things like tell corosync about new nodes when using udpu transport mode:

[r...@mrg-02 ~]# corosync-objctl | grep interface
totem.interface.ringnumber=0
totem.interface.bindnetaddr=192.168.100.0
totem.interface.mcastport=5405
totem.interface.mcastaddr=224.1.1.9
totem.interface.member.memberaddr=192.168.100.2
totem.interface.member.memberaddr=192.168.100.3
totem.interface.member.memberaddr=192.168.100.4
totem.interface.member.memberaddr=192.168.100.5

[r...@mrg-02 ~]# corosync-objctl -n totem.interface.member.memberaddr=192.168.100.6

[r...@mrg-02 ~]# corosync-objctl | grep interface
totem.interface.ringnumber=0
totem.interface.bindnetaddr=192.168.100.0
totem.interface.mcastport=5405
totem.interface.mcastaddr=224.1.1.9
totem.interface.member.memberaddr=192.168.100.2
totem.interface.member.memberaddr=192.168.100.3
totem.interface.member.memberaddr=192.168.100.4
totem.interface.member.memberaddr=192.168.100.5
totem.interface.member.memberaddr=192.168.100.6
Index: tools/corosync-objctl.c
===================================================================
--- tools/corosync-objctl.c     (revision 3057)
+++ tools/corosync-objctl.c     (working copy)
@@ -56,6 +56,7 @@
        ACTION_READ,
        ACTION_WRITE,
        ACTION_CREATE,
+       ACTION_CREATE_KEY,
        ACTION_DELETE,
        ACTION_PRINT_ALL,
        ACTION_PRINT_DEFAULT,
@@ -91,6 +92,8 @@
        size_t name_len);
 
 static void create_object(confdb_handle_t handle, char * name_pt);
+static void create_object_key(confdb_handle_t handle, char * name_pt);
+static void destroy_object_key(confdb_handle_t handle, char * name_pt);
 static void write_key(confdb_handle_t handle, char * path_pt);
 static void get_parent_name(const char * name_pt, char * parent_name);
 
@@ -314,6 +317,7 @@
        printf ("        corosync-objctl -c object%cchild_obj ...           
Create Object\n", SEPERATOR);
        printf ("        corosync-objctl -d object%cchild_obj ...           
Delete object\n", SEPERATOR);
        printf ("        corosync-objctl -w object%cchild_obj.key=value ... 
Create a key\n", SEPERATOR);
+       printf ("        corosync-objctl -n object%cchild_obj.key=value ... 
Create a new object with the key\n", SEPERATOR);
        printf ("        corosync-objctl -t object%cchild_obj ...           
Track changes\n", SEPERATOR);
        printf ("        corosync-objctl -a                                
Print all objects\n");
        printf ("        corosync-objctl -p <filename> Load in config from the 
specified file.\n");
@@ -550,6 +554,78 @@
        }
 }
 
+static void create_object_key(confdb_handle_t handle, char *name_pt)
+{
+       char * obj_name_pt;
+       char * new_obj_name_pt;
+       char * save_pt;
+       hdb_handle_t obj_handle;
+       hdb_handle_t parent_object_handle = OBJECT_PARENT_HANDLE;
+       char tmp_name[OBJ_NAME_SIZE];
+       cs_error_t res;
+       char parent_name[OBJ_NAME_SIZE];
+       char key_name[OBJ_NAME_SIZE];
+       char key_value[OBJ_NAME_SIZE];
+
+       get_parent_name(name_pt, parent_name);
+       get_key(name_pt, key_name, key_value);
+
+       strncpy (tmp_name, parent_name, OBJ_NAME_SIZE);
+       obj_name_pt = strtok_r(tmp_name, SEPERATOR_STR, &save_pt);
+
+       /*
+        * Create parent object tree
+        */
+       while (obj_name_pt != NULL) {
+               res = confdb_object_find_start(handle, parent_object_handle);
+               if (res != CS_OK) {
+                       fprintf (stderr, "Could not start object_find %d\n", 
res);
+                       exit (EXIT_FAILURE);
+               }
+
+               new_obj_name_pt = strtok_r (NULL, SEPERATOR_STR, &save_pt);
+               res = confdb_object_find(handle, parent_object_handle,
+                        obj_name_pt, strlen (obj_name_pt), &obj_handle);
+               if (res != CS_OK || new_obj_name_pt == NULL) {
+
+                       if (validate_name(obj_name_pt) != CS_OK) {
+                               fprintf(stderr, "Incorrect object name \"%s\", 
\"=\" not allowed.\n",
+                                               obj_name_pt);
+                               exit(EXIT_FAILURE);
+                       }
+
+                       if (debug)
+                               printf ("%s:%d: %s\n", __func__,__LINE__, 
obj_name_pt);
+                       res = confdb_object_create (handle,
+                               parent_object_handle,
+                               obj_name_pt,
+                               strlen (obj_name_pt),
+                               &obj_handle);
+                       if (res != CS_OK) {
+                               fprintf(stderr, "Failed to create object 
\"%s\". Error %d.\n",
+                                       obj_name_pt, res);
+                       }
+               }
+               parent_object_handle = obj_handle;
+               obj_name_pt = new_obj_name_pt;
+       }
+
+       /*
+        * Create key
+        */
+       res = confdb_key_create_typed (handle,
+               obj_handle,
+               key_name,
+               key_value,
+               strlen(key_value),
+               CONFDB_VALUETYPE_STRING);
+       if (res != CS_OK) {
+               fprintf(stderr,
+                       "Failed to create the key %s=%s. Error %d\n",
+                       key_name, key_value, res);
+       }
+}
+
 /* Print "?" in place of any non-printable byte of OBJ. */
 static void print_name (FILE *fp, const void *obj, size_t obj_len)
 {
@@ -724,7 +800,7 @@
        action = ACTION_READ;
 
        for (;;){
-               c = getopt (argc,argv,"hawcvdtp:");
+               c = getopt (argc,argv,"hawncvdtp:");
                if (c==-1) {
                        break;
                }
@@ -750,6 +826,9 @@
                        case 'w':
                                action = ACTION_WRITE;
                                break;
+                       case 'n':
+                               action = ACTION_CREATE_KEY;
+                               break;
                        case 't':
                                action = ACTION_TRACK;
                                break;
@@ -785,6 +864,9 @@
                        case ACTION_CREATE:
                                create_object(handle, argv[optind++]);
                                break;
+                       case ACTION_CREATE_KEY:
+                               create_object_key(handle, argv[optind++]);
+                               break;
                        case ACTION_DELETE:
                                delete_object(handle, argv[optind++]);
                                break;
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to