[Gluster-devel] Glusterd daemon management code refactoring

Jeff Darcy jdarcy at redhat.com
Tue Dec 9 12:54:12 UTC 2014


> I would like to propose refactoring of the code managing
> various daemons in glusterd. Unlike other high(er) level proposals
> about feature design, this one is at the implementation
> level. Please go through the details of the proposal below
> and share your thoughts/suggestions on the approach.

I like this idea, as a way of reducing technical debt.  Can we take it a
step further, and provide default *implementations* for some of these
methods?  For example, connect/disconnect and is_running are likely to
be the same for practically all daemons.

> ### Introduction
> 
> Glusterd manages GlusterFS daemons providing services like NFS, Proactive
> self-heal, Quota, User servicable snapshots etc. Following are some of the
> aspects that come under daemon management.
> 
> - Connection Management
>   - unix domain sockets based channel for internal communication
>   - Methods - connect, disconnect, notify
> 
> - Process Management
>   - pidfile to detect if the daemon is running
>   - Environment; run-dir, svc-dir, log-dir etc.
>   - Methods - start, stop, status, kill
> 
> - Daemon-specific Management
> 
> Currently, the daemon management code is fragmented and doesn't elicit the
> structure described above. This results in further fragmentation since new
> developers may not identify common patterns, worse even, they won't be able
> to
> do anything about it.
> 
> This proposal aims to do the following,
> 
> - Provide an abstract data type that encapsulates what is common among
> daemons
>   that are managed by glusterd.
> 
> - 'Port' existing code to make use of the abstract type. This would help in
>   making this change self-documented to an extent.
> 
> - Prescribe a way to maintain per-feature daemon code separate to glusterd's
>   common code.
> 
> ### Abstract data types
> 
>         struct conn_mgmt {
>             struct rpc_clnt *rpc;
>             int (*connect) (struct conn_mgmt *self);
>             int (*disconnect) (struct conn_mgmt self);
>             int (*notify) (struct conn_mgmt *self, rpc_clnt_event_t
>             *rpc_event);
>         }
> 
>         struct proc_mgmt {
>             char svcdir[PATH_MAX];
>             char rundir[PATH_MAX];
>             char logdir[PATH_MAX];
>             char pidfile[PATH_MAX];
>             char logfile[PATH_MAX];
> 
>             char volid[UUID_CANONICAL_FORM_LEN];

How about a PID, so that default implementations (e.g. is_running
or kill) can use it?

>             int (*start) (struct proc_mgmt *self, int flags);
>             int (*stop) (struct proc_mgmt *self, int flags);
>             int (*is_running) (struct proc_mgmt *self);
>             int (*kill) (struct proc_mgmt *self, int flags);
> 
>         }
> 
> Feature authors can define data type representing their service by
> implementing
> the above 'abstract' class. For e.g,
> 
>         struct my_service {
>             char name[PATH_MAX];
>             /* my_service specific data members and methods */
> 
>             /* The methods in the following structures should be implemented
>             by
>                respective feature authors */
> 
>             struct conn_mgmt conn;
>             struct proc_mgmt proc;
>         }
> 
> ### Code structure guidelines
> 
> Each feature that introduces a daemon would implement the abstract data type.
> The implementations should be in separate files named appropriately. The
> intent
> is to avoid feature specific code to leak into common glusterd codebase.
> glusterd-utils.c is testament to such practices in the past.
> 
> For e.g,
> [kp at trantor glusterd]$ tree
> .
> └── src
>     ├── glusterd-conn-mgmt.c
>     ├── glusterd-conn-mgmt.h
>     ├── glusterd-proc-mgmt.c
>     ├── glusterd-proc-mgmt.h
>     ├── my-feature-service.c
>     └── my-feature-service.h
> 
> [kp at trantor glusterd]$ cat src/my-feature-service.h
>         #include "glusterd-conn-mgmt.h"
>         #include "glusterd-proc-mgmt.h"
> 
> ...
> [rest of the code elided]
> 
> ### Bibliography
> 
> - Object-oriented design patterns in the kernel, part 1 -
> http://lwn.net/Articles/444910/
> - Object-oriented design patterns in the kernel, part 2 -
> http://lwn.net/Articles/446317/
> 
> 
> thanks,
> kp
> _______________________________________________
> Gluster-devel mailing list
> Gluster-devel at gluster.org
> http://supercolony.gluster.org/mailman/listinfo/gluster-devel
> 


More information about the Gluster-devel mailing list