feat: switch SQLite to WAL mode and disable Btrfs CoW for data directory
Some checks failed
Blockchain Synchronization Verification / sync-verification (push) Failing after 2s
CLI Tests / test-cli (push) Successful in 4s
Integration Tests / test-service-integration (push) Failing after 12s
P2P Network Verification / p2p-verification (push) Successful in 3s
Python Tests / test-python (push) Successful in 11s
Security Scanning / security-scan (push) Successful in 1m11s
Multi-Node Blockchain Health Monitoring / health-check (push) Has been cancelled
Some checks failed
Blockchain Synchronization Verification / sync-verification (push) Failing after 2s
CLI Tests / test-cli (push) Successful in 4s
Integration Tests / test-service-integration (push) Failing after 12s
P2P Network Verification / p2p-verification (push) Successful in 3s
Python Tests / test-python (push) Successful in 11s
Security Scanning / security-scan (push) Successful in 1m11s
Multi-Node Blockchain Health Monitoring / health-check (push) Has been cancelled
- Change SQLite journal mode from DELETE to WAL for better concurrency - Add chattr +C to /var/lib/aitbc in setup.sh to disable Btrfs Copy-on-Write - Add fallback logging when chattr is unavailable or fails - Prevent SQLite corruption on Btrfs filesystems by ensuring overwrite-in-place behavior
This commit is contained in:
69
.windsurf/skills/ssh-access-patterns.md
Normal file
69
.windsurf/skills/ssh-access-patterns.md
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
# SSH Access Patterns for AITBC Nodes
|
||||||
|
|
||||||
|
## Purpose
|
||||||
|
Document SSH access patterns for all AITBC nodes in the infrastructure.
|
||||||
|
|
||||||
|
## Node Access Patterns
|
||||||
|
|
||||||
|
### aitbc (localhost)
|
||||||
|
Direct access - no SSH required.
|
||||||
|
```bash
|
||||||
|
# Run commands directly on localhost
|
||||||
|
echo "command"
|
||||||
|
systemctl restart service-name
|
||||||
|
```
|
||||||
|
|
||||||
|
### aitbc1
|
||||||
|
Direct SSH access.
|
||||||
|
```bash
|
||||||
|
ssh aitbc1
|
||||||
|
# Or execute single command
|
||||||
|
ssh aitbc1 "command"
|
||||||
|
```
|
||||||
|
|
||||||
|
### gitea-runner (also hosts aitbc2)
|
||||||
|
Direct SSH access. aitbc2 blockchain node runs on the same host.
|
||||||
|
```bash
|
||||||
|
ssh gitea-runner
|
||||||
|
# Or execute single command
|
||||||
|
ssh gitea-runner "command"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Common Operations
|
||||||
|
|
||||||
|
### Check service status on aitbc1
|
||||||
|
```bash
|
||||||
|
ssh aitbc1 "systemctl status aitbc-blockchain-node --no-pager"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Restart service on gitea-runner (aitbc2)
|
||||||
|
```bash
|
||||||
|
ssh gitea-runner "systemctl restart aitbc-blockchain-node"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Copy file to aitbc1
|
||||||
|
```bash
|
||||||
|
scp /path/to/file aitbc1:/path/to/destination
|
||||||
|
```
|
||||||
|
|
||||||
|
### Execute script on gitea-runner
|
||||||
|
```bash
|
||||||
|
ssh gitea-runner "bash /path/to/script.sh"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Multi-Node Operations
|
||||||
|
|
||||||
|
### Run command on all remote nodes
|
||||||
|
```bash
|
||||||
|
for node in aitbc1 gitea-runner; do
|
||||||
|
ssh "$node" "systemctl status aitbc-blockchain-node --no-pager"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
### Check block heights across all nodes
|
||||||
|
```bash
|
||||||
|
for node in aitbc1 gitea-runner; do
|
||||||
|
echo "=== $node ==="
|
||||||
|
ssh "$node" "curl -s http://localhost:8006/rpc/bestBlock | jq '.height'"
|
||||||
|
done
|
||||||
|
```
|
||||||
@@ -24,7 +24,7 @@ _engine = create_engine(f"sqlite:///{settings.db_path}", echo=False)
|
|||||||
@event.listens_for(_engine, "connect")
|
@event.listens_for(_engine, "connect")
|
||||||
def set_sqlite_pragma(dbapi_connection, connection_record):
|
def set_sqlite_pragma(dbapi_connection, connection_record):
|
||||||
cursor = dbapi_connection.cursor()
|
cursor = dbapi_connection.cursor()
|
||||||
cursor.execute("PRAGMA journal_mode=DELETE")
|
cursor.execute("PRAGMA journal_mode=WAL")
|
||||||
cursor.execute("PRAGMA synchronous=NORMAL")
|
cursor.execute("PRAGMA synchronous=NORMAL")
|
||||||
cursor.execute("PRAGMA cache_size=-64000")
|
cursor.execute("PRAGMA cache_size=-64000")
|
||||||
cursor.execute("PRAGMA temp_store=MEMORY")
|
cursor.execute("PRAGMA temp_store=MEMORY")
|
||||||
|
|||||||
@@ -114,6 +114,13 @@ setup_runtime_directories() {
|
|||||||
chown root:root /var/log/aitbc
|
chown root:root /var/log/aitbc
|
||||||
chown root:root /etc/aitbc
|
chown root:root /etc/aitbc
|
||||||
|
|
||||||
|
# Disable Btrfs CoW on data directory to prevent SQLite corruption
|
||||||
|
# SQLite expects overwrite-in-place behavior, which conflicts with CoW
|
||||||
|
if command -v chattr >/dev/null 2>&1; then
|
||||||
|
chattr +C /var/lib/aitbc 2>/dev/null || log "Could not disable CoW (not Btrfs or no permissions)"
|
||||||
|
log "Disabled Btrfs CoW on /var/lib/aitbc to prevent SQLite corruption"
|
||||||
|
fi
|
||||||
|
|
||||||
# Create README files
|
# Create README files
|
||||||
echo "# AITBC Runtime Data Directory" > /var/lib/aitbc/README.md
|
echo "# AITBC Runtime Data Directory" > /var/lib/aitbc/README.md
|
||||||
echo "# Keystore for blockchain keys (SECURE)" > /var/lib/aitbc/keystore/README.md
|
echo "# Keystore for blockchain keys (SECURE)" > /var/lib/aitbc/keystore/README.md
|
||||||
|
|||||||
Reference in New Issue
Block a user