dgraph-io/badger · error

Valuethreshold greater than max batch size of . Either…

Error message

Valuethreshold %d greater than max batch size of %d. Either reduce opt.ValueThreshold or increase opt.BaseTableSize.

What it means

Transaction writes are batched to at most opt.maxBatchSize bytes, which is derived from MemTableSize (15%). If ValueThreshold exceeds maxBatchSize, every large value would exceed the batch budget and transactions could never push data, so Open() fails fast.

Solutions

  1. Reduce opt.ValueThreshold below opt.maxBatchSize
  2. Increase opt.MemTableSize so that 15% of it exceeds ValueThreshold
  3. Follow the error's advice: reduce ValueThreshold or increase BaseTableSize

Example fix

// before
opt.MemTableSize = 8 << 20 // 8MB, maxBatchSize ~1.2MB
opt.ValueThreshold = 4 << 20 // 4MB > batch size -> error
// after
opt.MemTableSize = 64 << 20
opt.ValueThreshold = 4 << 20 // now under maxBatchSize (~9.6MB)
Defensive patterns

Strategy: validation

Validate before calling

maxBatch := (15 * opt.MemTableSize) / 100
if opt.ValueThreshold > maxBatch {
    return fmt.Errorf("lower ValueThreshold (<%d) or raise MemTableSize", maxBatch)
}

Prevention

When it happens

Trigger: Calling badger.Open with opt.ValueThreshold greater than (15*MemTableSize)/100, e.g. a large ValueThreshold (like 1MB) combined with a small MemTableSize.

Common situations: Raising ValueThreshold without checking MemTableSize; shrinking BaseTableSize/MemTableSize for tests while keeping production ValueThreshold.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


AI-assisted analysis of dgraph-io/badger@2a001d466f (2026-09-05). Data as JSON: /api/errors/da61246cd2bbcc58. Report an issue: GitHub.

Appendix: source

Thrown at db.go:172

	opt.maxBatchSize = (15 * opt.MemTableSize) / 100
	opt.maxBatchCount = opt.maxBatchSize / int64(skl.MaxNodeSize)

	// This is the maximum value, vlogThreshold can have if dynamic thresholding is enabled.
	opt.maxValueThreshold = math.Min(maxValueThreshold, float64(opt.maxBatchSize))
	if opt.VLogPercentile < 0.0 || opt.VLogPercentile > 1.0 {
		return errors.New("vlogPercentile must be within range of 0.0-1.0")
	}

	// We are limiting opt.ValueThreshold to maxValueThreshold for now.
	if opt.ValueThreshold > maxValueThreshold {
		return fmt.Errorf("Invalid ValueThreshold, must be less or equal to %d",
			maxValueThreshold)
	}

	// If ValueThreshold is greater than opt.maxBatchSize, we won't be able to push any data using
	// the transaction APIs. Transaction batches entries into batches of size opt.maxBatchSize.
	if opt.ValueThreshold > opt.maxBatchSize {
		return fmt.Errorf("Valuethreshold %d greater than max batch size of %d. Either "+
			"reduce opt.ValueThreshold or increase opt.BaseTableSize.",
			opt.ValueThreshold, opt.maxBatchSize)
	}
	// ValueLogFileSize should be strictly LESS than 2<<30 otherwise we will
	// overflow the uint32 when we mmap it in OpenMemtable.
	if !(opt.ValueLogFileSize < 2<<30 && opt.ValueLogFileSize >= 1<<20) {
		return ErrValueLogSize
	}

	if opt.ReadOnly {
		// Do not perform compaction in read only mode.
		opt.CompactL0OnClose = false
	}

	needCache := (opt.Compression != options.None) || (len(opt.EncryptionKey) > 0)
	if needCache && opt.BlockCacheSize == 0 {
		panic("BlockCacheSize should be set since compression/encryption are enabled")
	}

View on GitHub (pinned to 2a001d466f)