Add a mechanism where we can register notifications to be sent out to a SRVID when...
authorRonnie Sahlberg <ronniesahlberg@gmail.com>
Fri, 23 Oct 2009 04:24:51 +0000 (15:24 +1100)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Fri, 23 Oct 2009 04:24:51 +0000 (15:24 +1100)
commitf1b6ee4a55cdca60f93d992f0431d91bf301af2c
tree880198cba14af00c3110cfdd44e84a43481c599f
parent0785afba8e5cd501b9e0ecb4a6a44edf43b57ab0
Add a mechanism where we can register notifications to be sent out to a SRVID when the client disconnects.

The way to use this is from a client to :
1, first create a message handle and bind it to a SRVID
   A special prefix for the srvid space has been set aside for samba :
   Only samba is allowed to use srvid's with the top 32 bits set like this.
   The lower 32 bits are for samba to use internally.

2, register a "notification" using the new control :
                    CTDB_CONTROL_REGISTER_NOTIFY         = 114,
   This control takes as indata a structure like this :
struct ctdb_client_notify_register {
        uint64_t srvid;
        uint32_t len;
        uint8_t notify_data[1];
};

srvid is the srvid used in the space set aside above.
len and notify_data is an arbitrary blob.
When notifications are later sent out to all clients, this is the payload of that notification message.

If a client has registered with control 114 and then disconnects from ctdbd, ctdbd will broadcast a message to that srvid to all nodes/listeners in the cluster.

A client can resister itself with as many different srvid's it want, but this is handled through a linked list from the client structure so it mainly designed for "few notifications per client".

3, a client that no longer wants to have a notification set up can deregister using control
                    CTDB_CONTROL_DEREGISTER_NOTIFY       = 115,
which takes this as arguments :
struct ctdb_client_notify_deregister {
        uint64_t srvid;
};

When a client deregisters, there will no longer be sent a message to all other clients when this client disconnects from ctdbd.
include/ctdb.h
include/ctdb_private.h
server/ctdb_control.c
server/ctdb_daemon.c