public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Kefu Chai <k.chai@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH pve-cluster 00/14 v2] Rewrite pmxcfs with Rust
Date: Fri, 13 Feb 2026 17:33:37 +0800	[thread overview]
Message-ID: <20260213094119.2379288-1-k.chai@proxmox.com> (raw)

Hello,

Thank you for the detailed code reviews. V2 incorporates your feedback
with focus on safety improvements, C compatibility verification, and
code quality. Changes are organized by crate below.

1. pmxcfs-dfsm

Addressing Review Comments
---------------------------

Buffer Overflow Protection in KvStore LOG Parsing
Review: "No overflow check when computing expected_len - could wrap around
on malicious input [...] If node_len is 0, this is offset..offset-1 which wraps!"

Changes:
- Added overflow checking using checked_add() for total size calculation
- Validate individual field lengths are non-zero (must have null terminator)
- Created safe extract_string() helper with bounds checking
- All string extraction operations now validate offsets don't exceed buffer

Before: Could read beyond buffer if malicious field lengths cause wraparound
After: Overflow returns error, bounds checked before every string extraction

Wire Format Buffer Size Validation
Review: "No validation that total_size matches actual data.len() - attacker
could send a small message with large header values"

Changes:
- Added validation that expected total size equals actual buffer length
- Check performed after overflow validation, before parsing fields

FFI Panic Safety in CPG Callbacks
Review: Discussion about panic safety in FFI boundaries (from pmxcfs-services.review)

Changes:
- Added std::panic::catch_unwind to CPG deliver and confchg callbacks
- Panics are now caught and logged instead of unwinding through C code
- Prevents undefined behavior when Rust code panics in C-called callback

Race Condition in Drop Implementation
Review feedback on lifecycle management prompted examination of cleanup order.

Changes:
- Reordered Drop to finalize CPG handle BEFORE recovering Arc
- Prevents callbacks from firing during Arc deallocation
- Old: recover Arc → finalize → potential callback during deallocation
- New: finalize → no more callbacks → safe to recover Arc

Self-Review Improvements
-------------------------

Message Trait Constraints
Review: Self-identified need for stronger type constraints on generic messages.

Changes:
- Extended Message trait bounds from just `Sized` to include:
  - Clone: Required for message queueing and retransmission
  - Debug: Essential for logging and debugging cluster issues
  - Send + Sync: Required for safe cross-thread message passing
  - 'static: Ensures messages don't contain borrowed references
- Prevents runtime issues with message handling across async boundaries

Impact: Compile-time guarantees that message types are safe for concurrent
cluster communication.

Bounded Sync Queue
Review: Self-identified memory exhaustion risk from unbounded queues.

Changes:
- Added MAX_QUEUE_LEN constant (500 messages) for both sync_queue and msg_queue
- C implementation uses unbounded GSequence/GList structures
- When queue is full, oldest messages are dropped with warning log
- Prevents memory exhaustion from slow or stuck nodes

Impact: Protection against memory exhaustion in production clusters with
network congestion or slow nodes.

Broadcast-First Message Ordering
Review: Self-identified EEXIST race condition in v1 implementation.

Changes:
- V1 approach: Create file locally first, then broadcast message to cluster
  - Problem: When originator receives its own broadcast, file already exists
  - Result: deliver_message() would fail with EEXIST on originator node
  - Workaround: Had to ignore errors from self-originated messages

- V2 approach: Send message first via send_message_sync(), then create via callback
  - Originator sends message and waits for delivery callback
  - ALL nodes (including originator) create file via deliver_message()
  - No special case needed - originator creates file same way as other nodes
  - FUSE operation returns the result from deliver_message()

Impact: Eliminates EEXIST race condition and simplifies message handling logic.
All nodes follow identical code path for file operations.


Replace Magic Numbers with Structured Definitions
- Defined ClogEntryHeader struct with #[repr(C)] matching wire format
- Use std::mem::size_of::<ClogEntryHeader>() directly instead of magic constant
- Eliminates 4+1+3+16 calculation, makes structure explicit

Efficient Serialization
- Use std::mem::transmute for #[repr(C)] struct serialization/deserialization
- Replaces 48 lines of field-by-field byte manipulation with single operation
- Safety documented: platform is x86_64 little-endian, layout is well-defined

Minor Fixes
- Removed redundant cast: mtime is already u32, no need for "as u32"
- Added debug_assert! for group name validation (names hardcoded in app)
- Enhanced thread safety documentation with explicit dispatch limitations
- Documented Y2038 limitation for u32 mtime field

2. pmxcfs-logger

Addressing Review Comments
---------------------------

Merge Deduplication Semantics
Review: "BTreeMap::insert overwrites on duplicate. Please re-check whether we
want that; if we want to keep-first, use entry(key).or_insert(...)"

Changes:
- Changed from insert() to entry().or_insert() pattern
- Now correctly implements keep-first semantics for duplicate entries
- Only updates merge_dedup when entry is newly inserted

Impact: Merge behavior now matches C implementation's duplicate handling.

Merge Iteration Order
Review: "C iterates oldest -> newest and clog_copy() makes each entry the new
head, so result is newest first. With .rev() and push_front we likely invert it.
Maybe drop .rev()?"

Changes:
- Removed .rev() from merge iteration
- Entries now processed in correct order matching C behavior

Impact: Merged log entries maintain correct chronological order.

Atomic Merge Operation
Review: "clusterlog_merge() in C updates both cl->dedup and cl->base under the
same mutex. Here we update only dedup but return a RingBuffer which then requires
a separate update_buffer() call. Shouldn't this be an atomic operation?"

Changes:
- Unified ClusterLogInner struct with single mutex protecting both buffer and dedup
- Merge now atomically updates both buffer and dedup in single operation
- Eliminated separate update_buffer() call and associated race window

Impact: Merge is now atomic, preventing race conditions between buffer and dedup updates.

Constant Duplication
Review: "This constant is also defined in ring_buffer.rs."

Changes:
- Removed duplicate CLOG_MAX_ENTRY_SIZE definition from entry.rs
- Now imports constant from ring_buffer module

Impact: Single source of truth for buffer size constants.

Buffer Size Constants Mismatch
Review: "These constants don't match the C constants: #define CLOG_DEFAULT_SIZE
(8192 * 16), #define CLOG_MAX_ENTRY_SIZE 4096"

Changes:
- Corrected CLOG_DEFAULT_SIZE from 5MB to 131,072 bytes (128 KB)
- Corrected CLOG_MAX_ENTRY_SIZE from 12,288 to 4,096 bytes (4 KB)

Impact: Buffer capacity and entry size limits now match C implementation exactly.

String Length Field Overflow
Review: "These three fields are u8 incl. NUL. Payload must cap at 254 bytes,
otherwise len + 1 wraps to 0. C does MIN(strlen + 1,255)"

Changes:
- Truncate node/ident/tag strings to 254 bytes before adding null terminator
- Cap serialized length at 255 in wire format
- Prevents u8 wraparound that could cause buffer overflow

Impact: Eliminates buffer overflow vulnerability from string length wraparound.

JSON Output Order
Review: "C prints entries newest to oldest (walk prev from cpos). Shouldn't
this line be removed?"

Changes:
- Removed .reverse() call from JSON dump generation
- Now outputs newest-first matching C's prev-walk behavior

Impact: JSON output order matches C implementation.

Binary Serialization Format
Review: "Please re-check, but in C, clusterlog_get_state() returns a full
memdump (allocated ring buffer capacity), with cpos pointing at the newest
entry offset (not always 8). Also in C, entry.next is not a pointer to the
next/newer entry, it's the end offset of this entry"

Changes:
- Binary dump now returns full capacity buffer (not just used portion)
- cpos correctly points to newest entry offset
- entry.next is end offset of current entry (not pointer to next)
- Matches C's memdump format exactly

Impact: Binary state format is now wire-compatible with C implementation.

Wrap-Around Guards in Deserialization
Review: "C has wrap/overwrite guards when walking prev. We should probably
mirror those checks here too"

Changes:
- Added visited set to prevent infinite loops
- Check for already-visited positions during prev-walk
- Validate entry bounds before access
- Added C-style wrap-around guard logic

Impact: Prevents infinite loops and crashes when deserializing corrupted state.

Additional Improvements
- UTF-8 truncation safety: Truncate at character boundaries to prevent panics
- Integer overflow protection: Use checked arithmetic in size calculations
- Enhanced documentation: UID wraparound behavior and hash collision risks

3. pmxcfs-memdb

Addressing Review Comments
---------------------------

Integer Overflow in write() Operation
Review: "Cast before check: offset as usize can truncate on 32-bit systems
[...] Addition overflow: offset as usize + data.len() can overflow"

Changes:
- Changed "offset as usize" to usize::try_from(offset)
- Returns error if offset doesn't fit in platform's usize
- Prevents silent truncation that could bypass size limits on 32-bit systems

Extract Magic Numbers to Constants
Review pointed out hardcoded permission modes (0o755, 0o644) scattered in code.

Changes:
- Added MODE_DIR_DEFAULT constant (S_IFDIR | 0o755)
- Added MODE_FILE_DEFAULT constant (S_IFREG | 0o644)
- Replaced hardcoded values in locks.rs for consistency

Verification of Existing C Compatibility
-----------------------------------------

During review response, verified these features already correctly implement
C behavior (no changes needed):

- Error flag checking: All write operations properly check errors flag via
  with_mutation() helper, matching C's memdb->errors check pattern

- Directory deletion: Already validates directory is empty before deletion,
  matching C implementation in memdb.c

- Write guard usage: Consistently used across all mutation operations via
  with_mutation(), serializing writes correctly

- Lock protection: Proper mtime/writer validation for lock directories,
  preventing replay attacks and lock hijacking

4. pmxcfs-status

Addressing Review Comments
---------------------------

Cluster Version Counter Separation
Review: "cluster_version field used as change counter gets overwritten in
update_cluster_info(). In C we have clinfo_version vs cman_version. These
need to be separate fields."

Changes:
- Separated cluster_version (change counter) from config_version (config version)
- cluster_version matches C's clinfo_version (increments on membership changes)
- config_version in ClusterInfo matches C's cman_version (from corosync)
- update_cluster_info() increments cluster_version separately, never overwrites it

Impact: Change detection now works correctly, matching C implementation semantics.

KV Store Version Tracking
Review: "C removes kvstore entry when len==0 and maintains per-key version
counter. Our kvstore currently stores only Vec<u8> and doesn't reflect this."

Changes:
- Changed kvstore structure to HashMap<u32, HashMap<String, (Vec<u8>, u32)>>
- Each key now has tuple of (value, version_counter)
- Empty values are removed from kvstore (matching C behavior)
- Version counter increments on each key update

Impact: Per-key version tracking enables proper state synchronization across cluster.

Node IP Handling
Review: "set_node_status() missing dedicated branch for nodeip. C has separate
handling for nodeip with backing iphash structure."

Changes:
- Added dedicated node_ips HashMap (matches C's iphash structure)
- Implemented dedicated nodeip branch in set_node_status()
- Added 3-way check: rrd vs nodeip vs other
- Strips NUL termination from IP strings
- Atomic check-and-update with version bump

Impact: Node IP tracking now works correctly, matching C's nodeip_hash_set behavior.

VM Version Counter Semantics
Review: "Per-VM version counters instead of global vminfo_version_counter.
C uses global counter to determine update order."

Changes:
- Implemented global vminfo_version_counter (not per-VM counters)
- All VM operations (register, delete, scan) use global counter
- Counter increments on any VM change across entire cluster
- Enables determining VM update order cluster-wide

Impact: VM update ordering now matches C implementation, enabling proper synchronization.

Online Status Preservation
Review: "Doesn't preserve online status from old nodes. C's cfs_status_set_clinfo
copies from oldnode."

Changes:
- update_cluster_info() now preserves online status from existing nodes
- Saves old_nodes before clearing node list
- Restores online status for nodes that still exist after update
- Defaults to false for new nodes

Impact: Online status no longer lost during cluster configuration updates.

Kvstore Cleanup on Node Removal
Review: "No cleanup of kvstore entries when nodes removed"

Changes:
- Added kvstore.retain() in update_cluster_info()
- Removes entries for nodes no longer in cluster
- Prevents memory leak from accumulating stale node data

Impact: Memory usage stays bounded as nodes join/leave cluster.

5. pmxcfs-services

Addressing Review Comments
---------------------------

Note: pmxcfs-services was completely rewritten in v2 with simplified design.
Many review comments from v1 no longer apply due to architectural changes.

Graceful Shutdown with CancellationToken
Review: "handle.abort() doesn't invoke finalization. Should use
shutdown_token.cancel() + handle.await"

Changes:
- Replaced abort() with CancellationToken-based graceful shutdown
- Service tasks monitor cancellation token in main loop
- On cancellation, tasks call finalize() before exiting
- Manager awaits task completion with 30-second timeout
- Ensures proper resource cleanup on shutdown

Impact: Services now shut down gracefully with proper finalization, preventing
resource leaks and ensuring clean state transitions.

Resource Cleanup on AsyncFd Registration Failure
Review: "If AsyncFd::new() fails after initialize(), service marked Failed
but finalize() never called"

Changes:
- Added explicit finalize() call in AsyncFd registration error path
- If initialize() succeeds but AsyncFd::new() fails, finalize() is called
- Ensures resources allocated during initialization are properly cleaned up

Impact: Prevents resource leaks when AsyncFd registration fails after successful
service initialization.

Service Restart Logic Simplification
Review: "reinitialize_service() sets Uninitialized, but retry_failed_services()
refuses if !is_restartable after first attempt"

Changes:
- Eliminated "non-restartable" concept entirely
- All services are now restartable by default
- Dispatch failures trigger automatic reinitialize with 5-second retry loop
- Simpler state machine without stuck states

Impact: Services cannot get stuck in failed state. Automatic retry ensures
services recover from transient failures.

Simplify Service Framework
Review: "The lifecycle overview [...] is great [...] I think the rest should
move to rustdoc to avoid duplication and drift"

Changes:
- Removed unnecessary abstraction layers in service management
- Services now directly implement Service trait without intermediate wrappers
- Clearer ownership model and lifecycle management
- Documentation consolidated per review feedback

IPCC.xs Empty Response Handling
Context: IPCC.xs (Perl XS binding, src/PVE/IPCC.xs line 165) returns undef
when IPC operations succeed but return no data (dsize=0), even though
error=0 indicates success. This affects SET_STATUS and LOG_CLUSTER_MSG.

Note: A bug report about this issue was sent to the mailing list (Subject:
"Confirmation needed: IPCC.xs behavior with empty response data") proposing
to fix IPCC.xs to return empty string instead of undef for successful
operations with no data.

Changes:
- Rust service returns Vec::new() matching C implementation exactly
- Bug handling isolated to integration test layer (IPCTestLib.pm)
- Test library treats "undef with errno=0" as successful empty response
- Documented workaround with reference to production code's handling
  (PVE::Cluster.pm wrapper accepts this pattern)

Rationale:
- Rust service maintains C compatibility exactly
- Bug properly isolated in test layer where it belongs
- Production semantics correct: success returns empty, failure returns error
- When IPCC.xs is fixed, only test library needs update

6. pmxcfs-ipc

Addressing Review Comments
---------------------------

Task Leak - Explicit Task Abortion
Review: "The comment says 'auto-aborted on drop' which is not correct. Tokio
detaches the task, it keeps running in the background."

Changes:
- Store all task handles (connection tasks, worker tasks, sender tasks)
- Explicitly call abort() on all tasks in Connection::drop()
- Remove misleading "auto-aborted" documentation
- Verify cleanup in shutdown tests

Impact: Tasks now properly terminate on connection close instead of leaking.

Connection Memory Leak
Review: "Connections are never removed which could result into memory leak."

Changes:
- Remove connections from server HashMap when they close
- Track connection closure via task completion
- Log connection removal for debugging

Impact: Server no longer accumulates closed connection state in memory.

Unbounded Response Queue - OOM Risk
Review: "if the response ring buffer fills up (slow/stuck client), responses
queue in memory without limit and can OOM the daemon."

Changes:
- Changed response channel from unbounded to bounded (1024 capacity)
- Apply backpressure when queue fills: try_send() returns error
- Match work queue's bounded behavior for consistency

Impact: Slow clients can no longer exhaust server memory.

Cross-Process Ring Buffer Hang
Review: "Tokio notify only works inside one process. But another process frees
up the space. So this would hang likely forever?"

Changes:
- Removed tokio::Notify (intra-process only)
- Use POSIX process-shared semaphore (sem_post/sem_wait)
- Match libqb's notification mechanism exactly
- Verify with cross-process tests

Impact: Ring buffer send/receive now works correctly across processes.

Shutdown-Aware sem_wait - Use-After-Free Fix
Review: "On shutdown the async task can be dropped while the blocking sem_wait
keeps running, but RingBuffer may then sem_destroy/unmap."

Changes:
- Replaced blocking sem_wait with sem_timedwait loop (500ms timeout)
- Check Arc<AtomicBool> shutdown flag after each timeout
- Track active waiters with Arc<AtomicU32> sem_access_count
- RingBuffer::drop() signals shutdown, posts to semaphore, waits for exit
- Follow libqb's BSD replacement pattern (rpl_sem.c:120-136)

Impact: Prevents undefined behavior when recv() futures are cancelled during
shutdown. The blocking thread cleanly exits before shared memory is unmapped.

Memory Ordering - write_pt Race Condition
Review: "write_pt could eventually be peeked before the chunk is committed? We
should publish the chunk by advancing write_pt with Release."

Changes:
- Write chunk data and header first
- Set chunk magic with Ordering::Release
- Update write_pt with Ordering::Release after magic
- Reader loads write_pt with Ordering::Acquire

Impact: Readers can no longer observe new write_pt before chunk is fully
committed. Establishes proper happens-before relationship.

EINTR Handling in sem_wait
Review: "this says 'will retry' but actually crashes?"

Changes:
- Fixed retry loop to actually retry on EINTR
- Changed from bail!() to continue on EINTR
- Only bail on non-EINTR errors

Impact: Signal interruptions no longer crash the server.

Security Hardening
- Clamp client max_msg_size to server maximum (8MB)
- Validate chunk sizes don't exceed buffer bounds
- Set file permissions mode(0o600) explicitly on ring buffer files
- Track ring buffer header files for cleanup (request/response/event)

Input Validation
Review comments on validation addressed:
- Handshake protocol validation already implemented
- Chunk size validation with max bounds checking
- Magic number verification prevents corruption

Documentation and Code Quality
Review: "for consistency with other repos I suggest to remove the emojies"
Review: "nit: not all READMEs have a table of contents"

Changes:
- Removed table of contents from README.md for consistency
- Updated documentation to reflect SHM implementation (not socket streaming)
- Created PATCH_NOTES.md with commit message guidelines for upstream submission
- Removed emojis from all test output and bash scripts
- Consolidated duplicate wait_for_server_ready test utility
- Fixed test helper to check abstract Unix socket instead of ring buffer files

Test Coverage Expansion
Review: "Can we please also test additionally for: the expected behaviour when
the ring buffer is full, connection disconnect cleanup, adversarial inputs,
graceful shutdown, concurrent connections"

Changes:
Added comprehensive edge_cases_test.rs with 7 scenarios:
- Ring buffer full behavior
- Connection disconnect cleanup
- Adversarial inputs
- Graceful shutdown
- Concurrent connections
- Flow control under load
- Resource limits

7. pmxcfs-api-types

Addressing Review Comments
---------------------------

errno Mapping Precision
Review: "Wrong errno mappings: PermissionDenied should map to EACCES not EPERM,
InvalidPath should map to EINVAL not EIO, Lock should explicitly map to
EBUSY/EDEADLK/EAGAIN"

Changes:
- PermissionDenied now maps to EACCES (was EPERM)
- InvalidPath now maps to EINVAL (was EIO)
- Lock explicitly maps to EAGAIN (was generic EIO)
- Added comments explaining EACCES choice matches C implementation
- NoQuorum also maps to EACCES (matching C's access/quorum error handling)

Impact: Error codes returned to FUSE clients now match C implementation,
ensuring consistent behavior and proper error handling in client applications.

7. pmxcfs-rrd

Addressing Review Comments
---------------------------

transform_data() Skip Logic
Review: "Skip logic only applies to Pve2 format, but C implementation skips
unconditionally based on metric type. This causes column misalignment for
Pve9_0 data."

Changes:
- Removed format-conditional skip logic
- Skip now applies unconditionally based on metric type:
  * Node metrics: skip 2 columns
  * VM metrics: skip 4 columns
  * Storage metrics: skip 0 columns
- Matches C implementation behavior exactly
- Added tests for both Pve2 and Pve9_0 formats

Impact: Data transformation now works correctly for all format combinations,
preventing column misalignment and data corruption.

Path Sanitization
Review: "Path components like nodename or storage could contain '..' or '/'
allowing directory traversal attacks."

Changes:
- Added validate_path_component() function in key_type.rs
- Rejects dangerous path components:
  * ".." (parent directory traversal)
  * Absolute paths (starting with "/")
  * Null bytes
  * Backslashes, newlines, carriage returns
- All path components validated during key parsing

Impact: Prevents directory traversal attacks through malicious node names or
storage identifiers.

Real Payload Test Fixtures
Review: "Tests use synthetic data instead of real payloads from running systems
to verify transform_data() correctness."

Changes:
- Added 6 new test cases using real RRD data captured from production PVE systems
- test_real_payload_node_pve2: Real pve2-node data from PVE 6.x
- test_real_payload_vm_pve2: Real pve2.3-vm data from PVE 6.x
- test_real_payload_storage_pve2: Real pve2-storage data from PVE 6.x
- test_real_payload_node_pve9_0: Real pve-node-9.0 data from PVE 8.x
- test_real_payload_with_missing_values: Real data with "U" (unavailable) values
- Validates transform_data() against actual production payloads

Impact: Increased confidence in data transformation correctness using real-world
data instead of only synthetic test data.

File Path Naming Consistency
Review: "Inconsistency between file_path() returning paths without .rrd extension,
but tests using .rrd extension."

Changes:
- Clarified that file_path() returns paths WITHOUT .rrd extension (matching C)
- Updated comments to explain C implementation behavior
- C's rrd_create_r() and rrdc_update() add .rrd internally
- Test helpers correctly add .rrd for filesystem operations
- Consistent with C implementation in status.c:1287

Impact: Code now clearly documents the .rrd extension convention, matching C
implementation behavior exactly.

8. Integration Tests & Documentation Cleanup

Expanded IPC Operation Coverage
--------------------------------

Added comprehensive IPC operation tests:
- LOG_CLUSTER_MSG: Cluster log message sending with various string lengths
- GET_CLUSTER_LOG: Log retrieval with user filtering and limits
- GET_RRD_DUMP: RRD data dump with NUL terminator verification
- Read-only operations: GET_FS_VERSION, GET_CLUSTER_INFO, GET_GUEST_LIST
- Write operations: SET_STATUS roundtrip, VERIFY_TOKEN validation
- Guest config operations: Single/multiple property retrieval
- Complete IPC suite: All 12 operations with error case testing

Perl Test Library (IPCTestLib.pm)
- Provides ipc_call() wrapper handling IPCC.xs behavior
- Treats "undef with errno=0" as successful empty response
- Documented with explanation of IPCC.xs bug and workaround strategy
- Works with both current IPCC.xs and future fixes

Coverage: 12/12 IPC operations (complete)

Documentation & Style Consistency
----------------------------------

Emoji Removal (applies across all crates)
Review: "for consistency with other repos I suggest to remove the emojies"

Changes applied to:
- pmxcfs-ipc: Test output (qb_wire_compat.rs, auth_test.rs, edge_cases_test.rs)
- pmxcfs-logger: Performance test output
- pmxcfs: Integration tests (6 files)
- pmxcfs workspace: Integration tests (8 files)
- Integration test scripts: 46 bash scripts

Replacements:
- Checkmarks (✓/✅) → [OK]
- Cross marks (✗/❌) → [FAIL]
- Warning signs (⚠️/⚠) → [WARN]
- Skip indicators (⏭️) → [SKIP]
- Decorative emojis removed

README Consistency
- Removed table of contents from pmxcfs-ipc README.md
- Matches style of other crate READMEs

Test Utility Consolidation
- Moved wait_for_server_ready() to pmxcfs-test-utils for reuse
- Fixed implementation to check abstract Unix socket (/proc/net/unix)
- Works for all server configurations including reject-all cases

Best regards,

Kefu Chai (14):
  pmxcfs-rs: add Rust workspace configuration
  pmxcfs-rs: add pmxcfs-api-types crate
  pmxcfs-rs: add pmxcfs-config crate
  pmxcfs-rs: add pmxcfs-logger crate
  pmxcfs-rs: add pmxcfs-rrd crate
  pmxcfs-rs: add pmxcfs-memdb crate
  pmxcfs-rs: add pmxcfs-status and pmxcfs-test-utils crates
  pmxcfs-rs: add pmxcfs-services crate
  pmxcfs-rs: add pmxcfs-ipc crate
  pmxcfs-rs: add pmxcfs-dfsm crate
  pmxcfs-rs: vendor patched rust-corosync for CPG compatibility
  pmxcfs-rs: add pmxcfs main daemon binary
  pmxcfs-rs: add integration and workspace tests
  pmxcfs-rs: add project documentation

 src/pmxcfs-rs/.gitignore                      |    3 +
 src/pmxcfs-rs/ARCHITECTURE.txt                |  350 ++
 src/pmxcfs-rs/Cargo.toml                      |  102 +
 src/pmxcfs-rs/Makefile                        |   39 +
 src/pmxcfs-rs/README.md                       |  304 ++
 src/pmxcfs-rs/integration-tests/.gitignore    |    1 +
 src/pmxcfs-rs/integration-tests/README.md     |  367 ++
 .../integration-tests/docker/.dockerignore    |   17 +
 .../integration-tests/docker/Dockerfile       |   96 +
 .../integration-tests/docker/debian.sources   |    5 +
 .../docker/docker-compose.cluster.yml         |  115 +
 .../docker/docker-compose.mixed.yml           |  125 +
 .../docker/docker-compose.yml                 |   55 +
 .../integration-tests/docker/healthcheck.sh   |   19 +
 .../docker/lib/corosync.conf.mixed.template   |   46 +
 .../docker/lib/corosync.conf.template         |   45 +
 .../docker/lib/setup-cluster.sh               |   67 +
 .../docker/proxmox-archive-keyring.gpg        |  Bin 0 -> 2372 bytes
 .../docker/pve-no-subscription.sources        |    5 +
 .../docker/start-cluster-node.sh              |  106 +
 src/pmxcfs-rs/integration-tests/run-tests.sh  |  470 +++
 src/pmxcfs-rs/integration-tests/test          |  238 ++
 src/pmxcfs-rs/integration-tests/test-local    |  333 ++
 .../tests/cluster/01-connectivity.sh          |   56 +
 .../tests/cluster/02-file-sync.sh             |  216 ++
 .../tests/cluster/03-clusterlog-sync.sh       |  292 ++
 .../tests/cluster/04-binary-format-sync.sh    |  350 ++
 .../tests/core/01-test-paths.sh               |   74 +
 .../tests/core/02-plugin-version.sh           |   87 +
 .../integration-tests/tests/dfsm/01-sync.sh   |  218 ++
 .../tests/dfsm/02-multi-node.sh               |  159 +
 .../tests/fuse/01-operations.sh               |  100 +
 .../tests/fuse/02-quorum-permissions.sh       |  317 ++
 .../tests/fuse/03-write-operations.sh         |  285 ++
 .../tests/fuse/04-chmod-chown.sh              |  142 +
 .../tests/ipc/01-socket-api.sh                |  104 +
 .../tests/ipc/02-flow-control.sh              |   89 +
 .../tests/ipc/03-log-cluster-msg.sh           |  231 ++
 .../tests/ipc/04-get-cluster-log.sh           |  344 ++
 .../tests/ipc/05-get-rrd-dump.sh              |  251 ++
 .../tests/ipc/06-readonly-ops.sh              |  231 ++
 .../tests/ipc/07-write-ops.sh                 |  185 +
 .../tests/ipc/08-guest-config-ops.sh          |  273 ++
 .../tests/ipc/09-all-ipc-ops.sh               |  136 +
 .../integration-tests/tests/ipc/COVERAGE.md   |  111 +
 .../integration-tests/tests/ipc/QUICKSTART.md |  143 +
 .../integration-tests/tests/ipc/README.md     |  388 ++
 .../integration-tests/tests/ipc/SUMMARY.md    |  151 +
 .../tests/ipc/TESTING-IMPROVEMENTS.md         |  314 ++
 .../tests/ipc/perl/IPCTestLib.pm              |  102 +
 .../tests/ipc/perl/README.md                  |   45 +
 .../tests/ipc/perl/get-cluster-info.pl        |   38 +
 .../tests/ipc/perl/get-cluster-log.pl         |   52 +
 .../tests/ipc/perl/get-config.pl              |   37 +
 .../tests/ipc/perl/get-fs-version.pl          |   31 +
 .../ipc/perl/get-guest-config-properties.pl   |   51 +
 .../ipc/perl/get-guest-config-property.pl     |   42 +
 .../tests/ipc/perl/get-guest-list.pl          |   38 +
 .../tests/ipc/perl/get-rrd-dump.pl            |   28 +
 .../tests/ipc/perl/get-status.pl              |   33 +
 .../tests/ipc/perl/log-cluster-msg.pl         |   43 +
 .../tests/ipc/perl/set-status.pl              |   30 +
 .../tests/ipc/perl/verify-token.pl            |   29 +
 .../integration-tests/tests/ipc/test-lib.sh   |  101 +
 .../tests/locks/01-lock-management.sh         |  134 +
 .../tests/logger/01-clusterlog-basic.sh       |  119 +
 .../integration-tests/tests/logger/README.md  |  111 +
 .../tests/memdb/01-access.sh                  |  103 +
 .../tests/mixed-cluster/01-node-types.sh      |  135 +
 .../tests/mixed-cluster/02-file-sync.sh       |  180 +
 .../tests/mixed-cluster/03-quorum.sh          |  149 +
 .../04-c-rust-binary-validation.sh            |  360 ++
 .../mixed-cluster/05-merge-correctness.sh     |  328 ++
 .../tests/mixed-cluster/06-stress-test.sh     |  339 ++
 .../tests/mixed-cluster/07-mtime-sync.sh      |  369 ++
 .../08-mixed-cluster-rrd-interop.sh           |  374 ++
 .../tests/plugins/01-plugin-files.sh          |  146 +
 .../tests/plugins/02-clusterlog-plugin.sh     |  355 ++
 .../tests/plugins/03-plugin-write.sh          |  197 +
 .../integration-tests/tests/plugins/README.md |   52 +
 .../tests/rrd/01-rrd-basic.sh                 |   93 +
 .../tests/rrd/02-schema-validation.sh         |  411 ++
 .../tests/rrd/03-rrdcached-integration.sh     |  367 ++
 .../tests/rrd/05-column-skip-transform.sh     |  391 ++
 .../tests/rrd/README-MIXED-CLUSTER-RRD.md     |  373 ++
 .../integration-tests/tests/rrd/README.md     |  164 +
 .../integration-tests/tests/run-c-tests.sh    |  321 ++
 .../tests/status/01-status-tracking.sh        |  113 +
 .../tests/status/02-status-operations.sh      |  193 +
 .../tests/status/03-multinode-sync.sh         |  481 +++
 .../integration-tests/tests/test-config.sh    |  195 +
 src/pmxcfs-rs/pmxcfs-api-types/Cargo.toml     |   19 +
 src/pmxcfs-rs/pmxcfs-api-types/README.md      |   88 +
 src/pmxcfs-rs/pmxcfs-api-types/src/error.rs   |  122 +
 src/pmxcfs-rs/pmxcfs-api-types/src/lib.rs     |   67 +
 src/pmxcfs-rs/pmxcfs-config/Cargo.toml        |   19 +
 src/pmxcfs-rs/pmxcfs-config/README.md         |   15 +
 src/pmxcfs-rs/pmxcfs-config/src/lib.rs        |  521 +++
 src/pmxcfs-rs/pmxcfs-dfsm/Cargo.toml          |   46 +
 src/pmxcfs-rs/pmxcfs-dfsm/README.md           |  340 ++
 src/pmxcfs-rs/pmxcfs-dfsm/src/callbacks.rs    |   80 +
 .../src/cluster_database_service.rs           |  116 +
 src/pmxcfs-rs/pmxcfs-dfsm/src/cpg_service.rs  |  235 ++
 src/pmxcfs-rs/pmxcfs-dfsm/src/dfsm_message.rs |  722 ++++
 src/pmxcfs-rs/pmxcfs-dfsm/src/fuse_message.rs |  194 +
 .../pmxcfs-dfsm/src/kv_store_message.rs       |  387 ++
 src/pmxcfs-rs/pmxcfs-dfsm/src/lib.rs          |   32 +
 src/pmxcfs-rs/pmxcfs-dfsm/src/message.rs      |   21 +
 .../pmxcfs-dfsm/src/state_machine.rs          | 1251 +++++++
 .../pmxcfs-dfsm/src/status_sync_service.rs    |  118 +
 src/pmxcfs-rs/pmxcfs-dfsm/src/types.rs        |  107 +
 src/pmxcfs-rs/pmxcfs-dfsm/src/wire_format.rs  |  279 ++
 .../tests/multi_node_sync_tests.rs            |  563 +++
 src/pmxcfs-rs/pmxcfs-ipc/Cargo.toml           |   44 +
 src/pmxcfs-rs/pmxcfs-ipc/README.md            |  171 +
 .../pmxcfs-ipc/examples/test_server.rs        |   92 +
 src/pmxcfs-rs/pmxcfs-ipc/src/connection.rs    |  772 ++++
 src/pmxcfs-rs/pmxcfs-ipc/src/handler.rs       |   93 +
 src/pmxcfs-rs/pmxcfs-ipc/src/lib.rs           |   41 +
 src/pmxcfs-rs/pmxcfs-ipc/src/protocol.rs      |  332 ++
 src/pmxcfs-rs/pmxcfs-ipc/src/ringbuffer.rs    | 1410 +++++++
 src/pmxcfs-rs/pmxcfs-ipc/src/server.rs        |  298 ++
 src/pmxcfs-rs/pmxcfs-ipc/src/socket.rs        |   84 +
 src/pmxcfs-rs/pmxcfs-ipc/tests/auth_test.rs   |  421 +++
 .../pmxcfs-ipc/tests/edge_cases_test.rs       |  304 ++
 .../pmxcfs-ipc/tests/qb_wire_compat.rs        |  389 ++
 src/pmxcfs-rs/pmxcfs-logger/Cargo.toml        |   15 +
 src/pmxcfs-rs/pmxcfs-logger/README.md         |   58 +
 .../pmxcfs-logger/src/cluster_log.rs          |  615 +++
 src/pmxcfs-rs/pmxcfs-logger/src/entry.rs      |  694 ++++
 src/pmxcfs-rs/pmxcfs-logger/src/hash.rs       |  176 +
 src/pmxcfs-rs/pmxcfs-logger/src/lib.rs        |   27 +
 .../pmxcfs-logger/src/ring_buffer.rs          |  628 ++++
 .../tests/binary_compatibility_tests.rs       |  315 ++
 .../pmxcfs-logger/tests/performance_tests.rs  |  294 ++
 src/pmxcfs-rs/pmxcfs-memdb/Cargo.toml         |   42 +
 src/pmxcfs-rs/pmxcfs-memdb/README.md          |  263 ++
 src/pmxcfs-rs/pmxcfs-memdb/src/database.rs    | 2551 +++++++++++++
 src/pmxcfs-rs/pmxcfs-memdb/src/index.rs       |  823 ++++
 src/pmxcfs-rs/pmxcfs-memdb/src/lib.rs         |   26 +
 src/pmxcfs-rs/pmxcfs-memdb/src/locks.rs       |  316 ++
 src/pmxcfs-rs/pmxcfs-memdb/src/sync.rs        |  257 ++
 src/pmxcfs-rs/pmxcfs-memdb/src/traits.rs      |  102 +
 src/pmxcfs-rs/pmxcfs-memdb/src/types.rs       |  343 ++
 src/pmxcfs-rs/pmxcfs-memdb/src/vmlist.rs      |  257 ++
 .../pmxcfs-memdb/tests/checksum_test.rs       |  175 +
 .../tests/sync_integration_tests.rs           |  394 ++
 src/pmxcfs-rs/pmxcfs-rrd/Cargo.toml           |   23 +
 src/pmxcfs-rs/pmxcfs-rrd/README.md            |  119 +
 src/pmxcfs-rs/pmxcfs-rrd/src/backend.rs       |   62 +
 .../pmxcfs-rrd/src/backend/backend_daemon.rs  |  184 +
 .../pmxcfs-rrd/src/backend/backend_direct.rs  |  586 +++
 .../src/backend/backend_fallback.rs           |  212 ++
 src/pmxcfs-rs/pmxcfs-rrd/src/daemon.rs        |  140 +
 src/pmxcfs-rs/pmxcfs-rrd/src/key_type.rs      |  408 ++
 src/pmxcfs-rs/pmxcfs-rrd/src/lib.rs           |   23 +
 src/pmxcfs-rs/pmxcfs-rrd/src/parse.rs         |  124 +
 .../pmxcfs-rrd/src/rrdcached/LICENSE          |   21 +
 .../pmxcfs-rrd/src/rrdcached/client.rs        |  208 ++
 .../src/rrdcached/consolidation_function.rs   |   30 +
 .../pmxcfs-rrd/src/rrdcached/create.rs        |  410 ++
 .../pmxcfs-rrd/src/rrdcached/errors.rs        |   29 +
 src/pmxcfs-rs/pmxcfs-rrd/src/rrdcached/mod.rs |   45 +
 src/pmxcfs-rs/pmxcfs-rrd/src/rrdcached/now.rs |   18 +
 .../pmxcfs-rrd/src/rrdcached/parsers.rs       |   65 +
 .../pmxcfs-rrd/src/rrdcached/sanitisation.rs  |  100 +
 src/pmxcfs-rs/pmxcfs-rrd/src/schema.rs        |  577 +++
 src/pmxcfs-rs/pmxcfs-rrd/src/writer.rs        |  582 +++
 src/pmxcfs-rs/pmxcfs-services/Cargo.toml      |   17 +
 src/pmxcfs-rs/pmxcfs-services/README.md       |  162 +
 src/pmxcfs-rs/pmxcfs-services/src/error.rs    |   21 +
 src/pmxcfs-rs/pmxcfs-services/src/lib.rs      |   15 +
 src/pmxcfs-rs/pmxcfs-services/src/manager.rs  |  341 ++
 src/pmxcfs-rs/pmxcfs-services/src/service.rs  |  149 +
 .../pmxcfs-services/tests/service_tests.rs    | 1271 +++++++
 src/pmxcfs-rs/pmxcfs-status/Cargo.toml        |   39 +
 src/pmxcfs-rs/pmxcfs-status/README.md         |  142 +
 src/pmxcfs-rs/pmxcfs-status/src/lib.rs        |   94 +
 src/pmxcfs-rs/pmxcfs-status/src/status.rs     | 1852 +++++++++
 src/pmxcfs-rs/pmxcfs-status/src/traits.rs     |  492 +++
 src/pmxcfs-rs/pmxcfs-status/src/types.rs      |   77 +
 src/pmxcfs-rs/pmxcfs-test-utils/Cargo.toml    |   34 +
 src/pmxcfs-rs/pmxcfs-test-utils/src/lib.rs    |  570 +++
 .../pmxcfs-test-utils/src/mock_memdb.rs       |  771 ++++
 src/pmxcfs-rs/pmxcfs/Cargo.toml               |   84 +
 src/pmxcfs-rs/pmxcfs/README.md                |  174 +
 .../pmxcfs/src/cluster_config_service.rs      |  317 ++
 src/pmxcfs-rs/pmxcfs/src/daemon.rs            |  314 ++
 src/pmxcfs-rs/pmxcfs/src/file_lock.rs         |  105 +
 src/pmxcfs-rs/pmxcfs/src/fuse/README.md       |  199 +
 src/pmxcfs-rs/pmxcfs/src/fuse/filesystem.rs   | 1644 ++++++++
 src/pmxcfs-rs/pmxcfs/src/fuse/mod.rs          |    4 +
 src/pmxcfs-rs/pmxcfs/src/ipc/mod.rs           |   16 +
 src/pmxcfs-rs/pmxcfs/src/ipc/request.rs       |  314 ++
 src/pmxcfs-rs/pmxcfs/src/ipc/service.rs       |  684 ++++
 src/pmxcfs-rs/pmxcfs/src/lib.rs               |   13 +
 src/pmxcfs-rs/pmxcfs/src/logging.rs           |   44 +
 src/pmxcfs-rs/pmxcfs/src/main.rs              |  711 ++++
 src/pmxcfs-rs/pmxcfs/src/memdb_callbacks.rs   |  663 ++++
 src/pmxcfs-rs/pmxcfs/src/plugins/README.md    |  203 +
 .../pmxcfs/src/plugins/clusterlog.rs          |  293 ++
 src/pmxcfs-rs/pmxcfs/src/plugins/debug.rs     |  145 +
 src/pmxcfs-rs/pmxcfs/src/plugins/members.rs   |  198 +
 src/pmxcfs-rs/pmxcfs/src/plugins/mod.rs       |   30 +
 src/pmxcfs-rs/pmxcfs/src/plugins/registry.rs  |  305 ++
 src/pmxcfs-rs/pmxcfs/src/plugins/rrd.rs       |   97 +
 src/pmxcfs-rs/pmxcfs/src/plugins/types.rs     |  112 +
 src/pmxcfs-rs/pmxcfs/src/plugins/version.rs   |  178 +
 src/pmxcfs-rs/pmxcfs/src/plugins/vmlist.rs    |  120 +
 src/pmxcfs-rs/pmxcfs/src/quorum_service.rs    |  207 +
 src/pmxcfs-rs/pmxcfs/src/restart_flag.rs      |   60 +
 src/pmxcfs-rs/pmxcfs/src/status_callbacks.rs  |  352 ++
 src/pmxcfs-rs/pmxcfs/tests/common/mod.rs      |  221 ++
 src/pmxcfs-rs/pmxcfs/tests/fuse_basic_test.rs |  216 ++
 .../pmxcfs/tests/fuse_cluster_test.rs         |  220 ++
 .../pmxcfs/tests/fuse_integration_test.rs     |  414 ++
 src/pmxcfs-rs/pmxcfs/tests/fuse_locks_test.rs |  377 ++
 .../pmxcfs/tests/local_integration.rs         |  277 ++
 src/pmxcfs-rs/pmxcfs/tests/quorum_behavior.rs |  274 ++
 .../pmxcfs/tests/single_node_functional.rs    |  361 ++
 .../pmxcfs/tests/symlink_quorum_test.rs       |  145 +
 src/pmxcfs-rs/tests/fuse_basic_test.rs        |  229 ++
 src/pmxcfs-rs/tests/fuse_cluster_test.rs      |  445 +++
 src/pmxcfs-rs/tests/fuse_integration_test.rs  |  436 +++
 src/pmxcfs-rs/tests/fuse_locks_test.rs        |  370 ++
 src/pmxcfs-rs/tests/local_integration.rs      |  151 +
 src/pmxcfs-rs/tests/quorum_behavior_test.rs   |  255 ++
 src/pmxcfs-rs/tests/single_node_test.rs       |  342 ++
 src/pmxcfs-rs/tests/symlink_quorum_test.rs    |  157 +
 src/pmxcfs-rs/tests/two_node_test.rs          |  288 ++
 src/pmxcfs-rs/vendor/rust-corosync/Cargo.toml |   33 +
 .../vendor/rust-corosync/Cargo.toml.orig      |   19 +
 src/pmxcfs-rs/vendor/rust-corosync/LICENSE    |   21 +
 .../vendor/rust-corosync/README.PATCH.md      |   36 +
 src/pmxcfs-rs/vendor/rust-corosync/README.md  |   13 +
 src/pmxcfs-rs/vendor/rust-corosync/build.rs   |   64 +
 .../vendor/rust-corosync/regenerate-sys.sh    |   15 +
 src/pmxcfs-rs/vendor/rust-corosync/src/cfg.rs |  392 ++
 .../vendor/rust-corosync/src/cmap.rs          |  812 ++++
 src/pmxcfs-rs/vendor/rust-corosync/src/cpg.rs |  657 ++++
 src/pmxcfs-rs/vendor/rust-corosync/src/lib.rs |  297 ++
 .../vendor/rust-corosync/src/quorum.rs        |  337 ++
 .../vendor/rust-corosync/src/sys/cfg.rs       | 1239 ++++++
 .../vendor/rust-corosync/src/sys/cmap.rs      | 3323 +++++++++++++++++
 .../vendor/rust-corosync/src/sys/cpg.rs       | 1310 +++++++
 .../vendor/rust-corosync/src/sys/mod.rs       |    8 +
 .../vendor/rust-corosync/src/sys/quorum.rs    |  537 +++
 .../rust-corosync/src/sys/votequorum.rs       |  574 +++
 .../vendor/rust-corosync/src/votequorum.rs    |  556 +++
 249 files changed, 66592 insertions(+)
 create mode 100644 src/pmxcfs-rs/.gitignore
 create mode 100644 src/pmxcfs-rs/ARCHITECTURE.txt
 create mode 100644 src/pmxcfs-rs/Cargo.toml
 create mode 100644 src/pmxcfs-rs/Makefile
 create mode 100644 src/pmxcfs-rs/README.md
 create mode 100644 src/pmxcfs-rs/integration-tests/.gitignore
 create mode 100644 src/pmxcfs-rs/integration-tests/README.md
 create mode 100644 src/pmxcfs-rs/integration-tests/docker/.dockerignore
 create mode 100644 src/pmxcfs-rs/integration-tests/docker/Dockerfile
 create mode 100644 src/pmxcfs-rs/integration-tests/docker/debian.sources
 create mode 100644 src/pmxcfs-rs/integration-tests/docker/docker-compose.cluster.yml
 create mode 100644 src/pmxcfs-rs/integration-tests/docker/docker-compose.mixed.yml
 create mode 100644 src/pmxcfs-rs/integration-tests/docker/docker-compose.yml
 create mode 100644 src/pmxcfs-rs/integration-tests/docker/healthcheck.sh
 create mode 100644 src/pmxcfs-rs/integration-tests/docker/lib/corosync.conf.mixed.template
 create mode 100644 src/pmxcfs-rs/integration-tests/docker/lib/corosync.conf.template
 create mode 100755 src/pmxcfs-rs/integration-tests/docker/lib/setup-cluster.sh
 create mode 100644 src/pmxcfs-rs/integration-tests/docker/proxmox-archive-keyring.gpg
 create mode 100644 src/pmxcfs-rs/integration-tests/docker/pve-no-subscription.sources
 create mode 100755 src/pmxcfs-rs/integration-tests/docker/start-cluster-node.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/run-tests.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/test
 create mode 100755 src/pmxcfs-rs/integration-tests/test-local
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/cluster/01-connectivity.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/cluster/02-file-sync.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/cluster/03-clusterlog-sync.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/cluster/04-binary-format-sync.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/core/01-test-paths.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/core/02-plugin-version.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/dfsm/01-sync.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/dfsm/02-multi-node.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/fuse/01-operations.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/fuse/02-quorum-permissions.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/fuse/03-write-operations.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/fuse/04-chmod-chown.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/01-socket-api.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/02-flow-control.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/03-log-cluster-msg.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/04-get-cluster-log.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/05-get-rrd-dump.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/06-readonly-ops.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/07-write-ops.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/08-guest-config-ops.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/09-all-ipc-ops.sh
 create mode 100644 src/pmxcfs-rs/integration-tests/tests/ipc/COVERAGE.md
 create mode 100644 src/pmxcfs-rs/integration-tests/tests/ipc/QUICKSTART.md
 create mode 100644 src/pmxcfs-rs/integration-tests/tests/ipc/README.md
 create mode 100644 src/pmxcfs-rs/integration-tests/tests/ipc/SUMMARY.md
 create mode 100644 src/pmxcfs-rs/integration-tests/tests/ipc/TESTING-IMPROVEMENTS.md
 create mode 100644 src/pmxcfs-rs/integration-tests/tests/ipc/perl/IPCTestLib.pm
 create mode 100644 src/pmxcfs-rs/integration-tests/tests/ipc/perl/README.md
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/perl/get-cluster-info.pl
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/perl/get-cluster-log.pl
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/perl/get-config.pl
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/perl/get-fs-version.pl
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/perl/get-guest-config-properties.pl
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/perl/get-guest-config-property.pl
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/perl/get-guest-list.pl
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/perl/get-rrd-dump.pl
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/perl/get-status.pl
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/perl/log-cluster-msg.pl
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/perl/set-status.pl
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/ipc/perl/verify-token.pl
 create mode 100644 src/pmxcfs-rs/integration-tests/tests/ipc/test-lib.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/locks/01-lock-management.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/logger/01-clusterlog-basic.sh
 create mode 100644 src/pmxcfs-rs/integration-tests/tests/logger/README.md
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/memdb/01-access.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/mixed-cluster/01-node-types.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/mixed-cluster/02-file-sync.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/mixed-cluster/03-quorum.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/mixed-cluster/04-c-rust-binary-validation.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/mixed-cluster/05-merge-correctness.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/mixed-cluster/06-stress-test.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/mixed-cluster/07-mtime-sync.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/mixed-cluster/08-mixed-cluster-rrd-interop.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/plugins/01-plugin-files.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/plugins/02-clusterlog-plugin.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/plugins/03-plugin-write.sh
 create mode 100644 src/pmxcfs-rs/integration-tests/tests/plugins/README.md
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/rrd/01-rrd-basic.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/rrd/02-schema-validation.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/rrd/03-rrdcached-integration.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/rrd/05-column-skip-transform.sh
 create mode 100644 src/pmxcfs-rs/integration-tests/tests/rrd/README-MIXED-CLUSTER-RRD.md
 create mode 100644 src/pmxcfs-rs/integration-tests/tests/rrd/README.md
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/run-c-tests.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/status/01-status-tracking.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/status/02-status-operations.sh
 create mode 100755 src/pmxcfs-rs/integration-tests/tests/status/03-multinode-sync.sh
 create mode 100644 src/pmxcfs-rs/integration-tests/tests/test-config.sh
 create mode 100644 src/pmxcfs-rs/pmxcfs-api-types/Cargo.toml
 create mode 100644 src/pmxcfs-rs/pmxcfs-api-types/README.md
 create mode 100644 src/pmxcfs-rs/pmxcfs-api-types/src/error.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-api-types/src/lib.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-config/Cargo.toml
 create mode 100644 src/pmxcfs-rs/pmxcfs-config/README.md
 create mode 100644 src/pmxcfs-rs/pmxcfs-config/src/lib.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-dfsm/Cargo.toml
 create mode 100644 src/pmxcfs-rs/pmxcfs-dfsm/README.md
 create mode 100644 src/pmxcfs-rs/pmxcfs-dfsm/src/callbacks.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-dfsm/src/cluster_database_service.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-dfsm/src/cpg_service.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-dfsm/src/dfsm_message.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-dfsm/src/fuse_message.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-dfsm/src/kv_store_message.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-dfsm/src/lib.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-dfsm/src/message.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-dfsm/src/state_machine.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-dfsm/src/status_sync_service.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-dfsm/src/types.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-dfsm/src/wire_format.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-dfsm/tests/multi_node_sync_tests.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-ipc/Cargo.toml
 create mode 100644 src/pmxcfs-rs/pmxcfs-ipc/README.md
 create mode 100644 src/pmxcfs-rs/pmxcfs-ipc/examples/test_server.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-ipc/src/connection.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-ipc/src/handler.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-ipc/src/lib.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-ipc/src/protocol.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-ipc/src/ringbuffer.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-ipc/src/server.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-ipc/src/socket.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-ipc/tests/auth_test.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-ipc/tests/edge_cases_test.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-ipc/tests/qb_wire_compat.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-logger/Cargo.toml
 create mode 100644 src/pmxcfs-rs/pmxcfs-logger/README.md
 create mode 100644 src/pmxcfs-rs/pmxcfs-logger/src/cluster_log.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-logger/src/entry.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-logger/src/hash.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-logger/src/lib.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-logger/src/ring_buffer.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-logger/tests/binary_compatibility_tests.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-logger/tests/performance_tests.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-memdb/Cargo.toml
 create mode 100644 src/pmxcfs-rs/pmxcfs-memdb/README.md
 create mode 100644 src/pmxcfs-rs/pmxcfs-memdb/src/database.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-memdb/src/index.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-memdb/src/lib.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-memdb/src/locks.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-memdb/src/sync.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-memdb/src/traits.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-memdb/src/types.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-memdb/src/vmlist.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-memdb/tests/checksum_test.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-memdb/tests/sync_integration_tests.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/Cargo.toml
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/README.md
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/backend.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/backend/backend_daemon.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/backend/backend_direct.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/backend/backend_fallback.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/daemon.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/key_type.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/lib.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/parse.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/rrdcached/LICENSE
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/rrdcached/client.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/rrdcached/consolidation_function.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/rrdcached/create.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/rrdcached/errors.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/rrdcached/mod.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/rrdcached/now.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/rrdcached/parsers.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/rrdcached/sanitisation.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/schema.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-rrd/src/writer.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-services/Cargo.toml
 create mode 100644 src/pmxcfs-rs/pmxcfs-services/README.md
 create mode 100644 src/pmxcfs-rs/pmxcfs-services/src/error.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-services/src/lib.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-services/src/manager.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-services/src/service.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-services/tests/service_tests.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-status/Cargo.toml
 create mode 100644 src/pmxcfs-rs/pmxcfs-status/README.md
 create mode 100644 src/pmxcfs-rs/pmxcfs-status/src/lib.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-status/src/status.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-status/src/traits.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-status/src/types.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-test-utils/Cargo.toml
 create mode 100644 src/pmxcfs-rs/pmxcfs-test-utils/src/lib.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs-test-utils/src/mock_memdb.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/Cargo.toml
 create mode 100644 src/pmxcfs-rs/pmxcfs/README.md
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/cluster_config_service.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/daemon.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/file_lock.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/fuse/README.md
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/fuse/filesystem.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/fuse/mod.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/ipc/mod.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/ipc/request.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/ipc/service.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/lib.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/logging.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/main.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/memdb_callbacks.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/plugins/README.md
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/plugins/clusterlog.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/plugins/debug.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/plugins/members.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/plugins/mod.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/plugins/registry.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/plugins/rrd.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/plugins/types.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/plugins/version.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/plugins/vmlist.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/quorum_service.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/restart_flag.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/src/status_callbacks.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/tests/common/mod.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/tests/fuse_basic_test.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/tests/fuse_cluster_test.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/tests/fuse_integration_test.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/tests/fuse_locks_test.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/tests/local_integration.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/tests/quorum_behavior.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/tests/single_node_functional.rs
 create mode 100644 src/pmxcfs-rs/pmxcfs/tests/symlink_quorum_test.rs
 create mode 100644 src/pmxcfs-rs/tests/fuse_basic_test.rs
 create mode 100644 src/pmxcfs-rs/tests/fuse_cluster_test.rs
 create mode 100644 src/pmxcfs-rs/tests/fuse_integration_test.rs
 create mode 100644 src/pmxcfs-rs/tests/fuse_locks_test.rs
 create mode 100644 src/pmxcfs-rs/tests/local_integration.rs
 create mode 100644 src/pmxcfs-rs/tests/quorum_behavior_test.rs
 create mode 100644 src/pmxcfs-rs/tests/single_node_test.rs
 create mode 100644 src/pmxcfs-rs/tests/symlink_quorum_test.rs
 create mode 100644 src/pmxcfs-rs/tests/two_node_test.rs
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/Cargo.toml
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/Cargo.toml.orig
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/LICENSE
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/README.PATCH.md
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/README.md
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/build.rs
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/regenerate-sys.sh
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/src/cfg.rs
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/src/cmap.rs
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/src/cpg.rs
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/src/lib.rs
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/src/quorum.rs
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/src/sys/cfg.rs
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/src/sys/cmap.rs
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/src/sys/cpg.rs
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/src/sys/mod.rs
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/src/sys/quorum.rs
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/src/sys/votequorum.rs
 create mode 100644 src/pmxcfs-rs/vendor/rust-corosync/src/votequorum.rs

-- 
2.47.3





             reply	other threads:[~2026-02-13  9:41 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-13  9:33 Kefu Chai [this message]
2026-02-13  9:33 ` [PATCH pve-cluster 01/14 v2] pmxcfs-rs: add Rust workspace configuration Kefu Chai
2026-02-18 10:41   ` Samuel Rufinatscha
2026-02-13  9:33 ` [PATCH pve-cluster 02/14 v2] pmxcfs-rs: add pmxcfs-api-types crate Kefu Chai
2026-02-18 15:06   ` Samuel Rufinatscha
2026-02-13  9:33 ` [PATCH pve-cluster 03/14 v2] pmxcfs-rs: add pmxcfs-config crate Kefu Chai
2026-02-18 16:41   ` Samuel Rufinatscha
2026-02-13  9:33 ` [PATCH pve-cluster 04/14 v2] pmxcfs-rs: add pmxcfs-logger crate Kefu Chai
2026-02-13  9:33 ` [PATCH pve-cluster 05/14 v2] pmxcfs-rs: add pmxcfs-rrd crate Kefu Chai
2026-02-13  9:33 ` [PATCH pve-cluster 06/14 v2] pmxcfs-rs: add pmxcfs-memdb crate Kefu Chai
2026-02-13  9:33 ` [PATCH pve-cluster 07/14 v2] pmxcfs-rs: add pmxcfs-status and pmxcfs-test-utils crates Kefu Chai
2026-02-13  9:33 ` [PATCH pve-cluster 08/14 v2] pmxcfs-rs: add pmxcfs-services crate Kefu Chai
2026-02-13  9:33 ` [PATCH pve-cluster 09/14 v2] pmxcfs-rs: add pmxcfs-ipc crate Kefu Chai
2026-02-13  9:33 ` [PATCH pve-cluster 10/14 v2] pmxcfs-rs: add pmxcfs-dfsm crate Kefu Chai
2026-02-13  9:33 ` [PATCH pve-cluster 11/14 v2] pmxcfs-rs: vendor patched rust-corosync for CPG compatibility Kefu Chai
2026-02-13  9:33 ` [PATCH pve-cluster 12/14 v2] pmxcfs-rs: add pmxcfs main daemon binary Kefu Chai
2026-02-13  9:33 ` [PATCH pve-cluster 14/14 v2] pmxcfs-rs: add project documentation Kefu Chai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260213094119.2379288-1-k.chai@proxmox.com \
    --to=k.chai@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal