[Gluster-devel] Glusterd daemon management code refactoring

Krishnan Parthasarathi kparthas at redhat.com
Tue Dec 9 12:18:19 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.

### 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];

            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/


More information about the Gluster-devel mailing list