On 2014-12-09 13:18, Krishnan Parthasarathi wrote: > All, > > 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. > > ### 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); > } Great, one place to fix IPv6/IPv4 coexistence :-) > > 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]; > > 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@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@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@xxxxxxxxxxx > http://supercolony.gluster.org/mailman/listinfo/gluster-devel > /Anders -- Anders Blomdell Email: anders.blomdell@xxxxxxxxxxxxxx Department of Automatic Control Lund University Phone: +46 46 222 4625 P.O. Box 118 Fax: +46 46 138118 SE-221 00 Lund, Sweden _______________________________________________ Gluster-devel mailing list Gluster-devel@xxxxxxxxxxx http://supercolony.gluster.org/mailman/listinfo/gluster-devel