hyperledger/fabric · error

error writing leveldb key [%#v]

Error message

error writing leveldb key [%#v]

What it means

DB.Put wraps goleveldb write failures with the key being written; the key is also logged. It means the key/value could not be persisted, whether or not the sync write option was requested. Callers include ledger ID creation and ledger status updates, so this typically breaks ledger lifecycle operations.

Source

Thrown at common/ledger/util/leveldbhelper/leveldb_helper.go:138

	// Here we simulate the desired behavior that the key is in the database.
	if value == nil {
		value = []byte{}
	}
	return value, nil
}

// Put saves the key/value
func (dbInst *DB) Put(key []byte, value []byte, sync bool) error {
	dbInst.mutex.RLock()
	defer dbInst.mutex.RUnlock()
	wo := dbInst.writeOptsNoSync
	if sync {
		wo = dbInst.writeOptsSync
	}
	err := dbInst.db.Put(key, value, wo)
	if err != nil {
		logger.Errorf("Error writing leveldb key [%#v]", key)
		return errors.Wrapf(err, "error writing leveldb key [%#v]", key)
	}
	return nil
}

// Delete deletes the given key
func (dbInst *DB) Delete(key []byte, sync bool) error {
	dbInst.mutex.RLock()
	defer dbInst.mutex.RUnlock()
	wo := dbInst.writeOptsNoSync
	if sync {
		wo = dbInst.writeOptsSync
	}
	err := dbInst.db.Delete(key, wo)
	if err != nil {
		logger.Errorf("Error deleting leveldb key [%#v]", key)
		return errors.Wrapf(err, "error deleting leveldb key [%#v]", key)
	}
	return nil

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Check free disk space on the ledger data volume.
  2. Ensure no component closes the shared DB while writers are active.
  3. Inspect the wrapped goleveldb error for corruption and restore/re-create the DB if needed.
  4. Retry the operation if the underlying error was transient (I/O scheduling, temporary resource limits).

Example fix

// before
if err := db.Put(key, value, true); err != nil { return err }
// after
if err := db.Put(key, value, true); err != nil {
  return fmt.Errorf("persisting key %#v failed, check disk space and db state: %w", key, err)
}
Defensive patterns

Strategy: try-catch

Validate before calling

if freeSpace(dbPath) < minFreeBytes {
  return errors.New("insufficient disk space for leveldb write")
}

Type guard

func isPutErr(err error) bool {
  return err != nil && strings.Contains(err.Error(), "error writing leveldb key")
}

Try / catch

if err := db.Put(key, value, true); err != nil {
  return fmt.Errorf("failed persisting %#v: %w", key, err)
}

Prevention

When it happens

Trigger: Writing after DB close; leveldb manifest or log file write failure (disk full, permissions); corruption during compaction interleaving with the write.

Common situations: Disk full on the peer's ledger volume; DB handle shared across components where one closes it early; read-only filesystem after container restart.

Related errors


AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04). Data as JSON: /api/errors/5450517f725e03e3. Report an issue: GitHub.