Skip to content

Contributing

Thank you for your interest in contributing to pgraft! This guide will help you get started.

Getting Started

  1. Fork the repository on GitHub
  2. Clone your fork:
    git clone https://github.com/YOUR_USERNAME/pgraft.git
    cd pgraft
    
  3. Create a feature branch:
    git checkout -b feature/my-new-feature
    

Development Environment

Setup

Follow the Building from Source guide to set up your development environment.

Prerequisites

  • PostgreSQL 17+
  • Go 1.21+
  • GCC/Clang
  • Make

Coding Standards

C Code Standards

pgraft follows strict PostgreSQL C coding standards:

C89/C90 Compliance

/* All variables at function start */
void my_function(void)
{
    int result;
    char *message;
    bool success;

    /* Initialize variables */
    result = 0;
    message = NULL;
    success = false;

    /* Function code */
}

Comments

/*
 * Use C-style comments only
 * Multi-line comments like this
 */

/* Single line comments */

/* NO C++ style comments */
// Don't use these

Indentation

  • Tabs only (no spaces)
  • Tab width: 4 spaces equivalent
  • Opening brace on same line (usually):
if (condition)
{
    /* code */
}

Naming Conventions

/* Functions: snake_case with pgraft_ prefix */
void pgraft_do_something(void);

/* Variables: snake_case */
int node_count;
char *cluster_id;

/* Macros: UPPER_CASE */
#define PGRAFT_MAX_NODES 7

Go Code Standards

Follow standard Go conventions:

// Use gofmt
gofmt -w src/pgraft_go.go

// Use golint
golint src/pgraft_go.go

// Keep functions focused
// Add comments for exported functions
// Handle errors explicitly

Code Quality

Before Submitting

1. No compilation errors or warnings:

make clean && make 2>&1 | grep -E "(error|warning)"
# Should be empty

2. Format code:

# C code: Follow PostgreSQL style
# Go code:
gofmt -w src/pgraft_go.go

3. Test thoroughly:

cd examples
./run.sh --destroy
./run.sh --init
./run.sh --status

4. Check for memory leaks (optional but recommended):

valgrind --leak-check=full postgres -D /path/to/data

Testing Requirements

Minimum Testing

Before submitting a pull request:

  1. Build successfully with no errors or warnings
  2. Initialize test cluster successfully
  3. All existing tests pass
  4. New feature works as documented

Testing Your Changes

# 1. Clean build
make clean && make

# 2. Install
make install

# 3. Test cluster
cd examples
./run.sh --destroy
./run.sh --init
./run.sh --status

# 4. Run manual tests
psql -p 5432 -c "SELECT pgraft_test();"
# ... test your feature ...

# 5. Check logs for errors
tail -100 examples/logs/primary1/postgresql.log | grep -i error

Pull Request Process

1. Prepare Your Changes

# Make your changes
vim src/pgraft_core.c

# Test thoroughly
make clean && make
make install
# Run tests

# Commit with good message
git add src/pgraft_core.c
git commit -m "Add feature: description of change

Detailed explanation of:
- What changed
- Why it changed
- How to use it"

2. Push to Your Fork

git push origin feature/my-new-feature

3. Create Pull Request

On GitHub:

  1. Navigate to your fork
  2. Click "New Pull Request"
  3. Select your feature branch
  4. Fill out the template:
## Description
Brief description of the change

## Motivation
Why is this change needed?

## Changes
- List of specific changes
- Another change

## Testing
How did you test this?

## Checklist
- [ ] Code compiles without errors
- [ ] Code compiles without warnings
- [ ] Tests pass
- [ ] Documentation updated (if needed)
- [ ] Follows coding standards

4. Code Review

Maintainers will review your PR:

  • Respond to feedback
  • Make requested changes
  • Push updates to same branch (PR updates automatically)

5. Merge

Once approved, maintainers will merge your PR!

Commit Message Guidelines

Format

Short summary (50 chars or less)

Longer explanation if needed. Wrap at 72 characters.
Explain what and why, not how.

- Bullet points are fine
- Use present tense: "Add feature" not "Added feature"

Good Examples

Add support for dynamic cluster membership

Allows nodes to be added and removed from cluster at runtime
without restarting. Uses Raft's joint consensus protocol.

Fix memory leak in log compaction

Free allocated memory after snapshot creation.

Improve error handling in network layer

Add retries for transient network failures and better
error messages for debugging.

Documentation

Update Documentation

If your change affects:

  • User-facing features: Update relevant .md files
  • Configuration: Update GUC documentation
  • SQL functions: Update function reference
  • Architecture: Update architecture docs

Documentation Style

# Use sentence case for headings

Write clear, concise sentences. Use active voice.

Provide examples:
\`\`\`sql
SELECT pgraft_example();
\`\`\`

Use admonitions for important information:
!!! warning
    Important warning here

Areas for Contribution

We welcome contributions in these areas:

High Priority

  • Testing: More test cases and scenarios
  • Documentation: Examples, tutorials, guides
  • Bug fixes: Check GitHub issues
  • Performance: Optimization improvements

Medium Priority

  • Monitoring: Better metrics and observability
  • Security: TLS, authentication
  • Platform support: Windows, BSD

Nice to Have

  • Tools: Cluster management utilities
  • Examples: Real-world use cases
  • Integrations: Connection poolers, HA tools

Bug Reports

Before Reporting

  1. Search existing issues: Check if already reported
  2. Test latest version: Bug may be fixed
  3. Reproduce: Verify you can reproduce it

Creating Good Bug Reports

Use this template:

**Describe the bug**
Clear description of the bug

**To Reproduce**
Steps to reproduce:
1. Do X
2. Do Y
3. See error

**Expected behavior**
What should happen

**Actual behavior**
What actually happens

**Environment**
- OS: [e.g. Ubuntu 22.04]
- PostgreSQL version: [e.g. 17.2]
- pgraft version: [e.g. 1.0.0]

**Logs**
\`\`\`
Relevant log output
\`\`\`

**Configuration**
\`\`\`ini
pgraft.cluster_id = 'test'
...
\`\`\`

Feature Requests

Creating Feature Requests

**Feature Description**
What feature do you want?

**Use Case**
Why is this needed? What problem does it solve?

**Proposed Solution**
How might this work?

**Alternatives**
Other solutions you've considered?

**Additional Context**
Any other information

Communication

  • GitHub Issues: Bug reports, feature requests
  • Pull Requests: Code contributions
  • Discussions: Questions, ideas, help

License

By contributing, you agree that your contributions will be licensed under the MIT License.

Code of Conduct

Our Standards

  • Be respectful and inclusive
  • Welcome newcomers
  • Accept constructive criticism gracefully
  • Focus on what's best for the project

Unacceptable Behavior

  • Harassment or discrimination
  • Trolling or insulting comments
  • Publishing others' private information
  • Other unprofessional conduct

Recognition

Contributors will be recognized in:

  • Release notes
  • CONTRIBUTORS file
  • Git history

Thank you for contributing to pgraft!