Skip to content

Couchbase Lite 4.0.2 crash in production after upgrade from 3.2.4 (Fleece Encoder::writeKey) #3499

@nikoladjurovicinsidemaps

Description

Summary
After upgrading Couchbase Lite Swift from 3.2.4 → 4.0.2, we see frequent production crashes in collection.save(document:). The issue did not appear in QA. We use the same syncing/concurrency mechanism as before; the only change was updating deprecated APIs (database.save(document:)collection.save(document:)). Crash is native (EXC_BAD_ACCESS) inside Fleece encoder while writing a key.

Environment

  • Couchbase Lite Swift: 4.0.2 (upgraded from 3.2.4)
  • iOS: All version
  • Database configuration: default collection

Crash Frequency
High / frequent in production (at scale). Not reproducible in QA so far.

Stack Trace (top)

Crashed: mainDatabaseQueue
0  libsystem_platform.dylib       0x930 _platform_memmove + 96
1  CouchbaseLiteSwift             0x10e888 fleece::smallVectorBase::_embiggen(unsigned long, unsigned long) + 85 (SmallVectorBase.hh:85)
2  CouchbaseLiteSwift             0x286cd0 fleece::impl::Encoder::placeItem() + 54 (SmallVectorBase.hh:54)
3  CouchbaseLiteSwift             0x2877d0 unsigned char* fleece::impl::Encoder::placeValue<true>(unsigned long) + 221 (Encoder.cc:221)
4  CouchbaseLiteSwift             0x2875f4 fleece::impl::Encoder::writeData(fleece::impl::internal::tags, fleece::slice) + 240 (Encoder.cc:240)
5  CouchbaseLiteSwift             0x289104 fleece::impl::Encoder::writeKey(fleece::slice) + 619 (Encoder.cc:619)
6  CouchbaseLiteSwift             0x28cb64 FLEncoder_WriteKey + 510
7  litecore::VectorRecord::encodeBodyAndExtra(_FLEncoder*) + 599
...
18 Collection.save(document:) + 134
19 IMAbstractDAOCouch.saveLocallySync(_:) + 210
...

Relevant Code
Saving happens here:

if let doc = serialize(object) {
    try collection.save(document: doc)
}

Concurrency / Sync
We use a syncing mechanism but still perform concurrent Couchbase reads/writes across multiple queues (same as in 3.2.4).

Payload / Document Details
Documents are JSON‑backed models and may include nested dictionaries/arrays from server responses. We serialize this models into MutableDocument

Steps to Reproduce
No deterministic repro yet (production only).

Expected
Save completes or throws an error.

Actual
Native crash in fleece::impl::Encoder::writeKey during collection.save(document:).

Related Forum Thread

https://www.couchbase.com/forums/t/couchbase-lite-4-0-2-crash-in-production-after-upgrade-from-3-2-4-fleece-encoder-writekey/41143

Questions / Requests

  • Is this a known issue in 4.0.2?
  • Are there stricter key/value validation rules that could cause this?
  • Is concurrent collection.save across threads supported?
  • Any guidance on reproducing or mitigating?

Other crashes with high frequency in product

Crashed: mainDatabaseQueue
0  CouchbaseLiteSwift             0x2877d8 unsigned char* fleece::impl::Encoder::placeValue(unsigned long) + 222 (Encoder.cc:222)
1  CouchbaseLiteSwift             0x2875f4 fleece::impl::Encoder::writeData(fleece::impl::internal::tags, fleece::slice) + 240 (Encoder.cc:240)
2  CouchbaseLiteSwift             0x289104 fleece::impl::Encoder::writeKey(fleece::slice) + 619 (Encoder.cc:619)
3  CouchbaseLiteSwift             0x28cb64 FLEncoder_WriteKey + 510 (variant:510)
4  CouchbaseLiteSwift             0x1ccee0 litecore::VectorRecord::encodeBodyAndExtra(FLEncoder*) + 599 (Fleece.hh:599)
5  CouchbaseLiteSwift             0x1ccdf8 litecore::VectorRecord::encodeBodyAndExtra() + 416 (Fleece.hh:416)
6  CouchbaseLiteSwift             0x1ccaf0 litecore::VectorRecord::save(litecore::ExclusiveTransaction&, litecore::HybridClock&) + 227 (slice.hh:227)
7  CouchbaseLiteSwift             0x1b4f60 litecore::VectorDocument::save(unsigned int) + 657 (VectorDocument.cc:657)
8  CouchbaseLiteSwift             0x1b578c litecore::VectorDocument::saveIfRequested(C4DocPutRequest const&, C4Error*) + 502 (VectorDocument.cc:502)
9  CouchbaseLiteSwift             0x1b54cc litecore::VectorDocument::putNewRevision(C4DocPutRequest const&, C4Error*) + 396 (VectorDocument.cc:396)
10 CouchbaseLiteSwift             0x18aadc C4Document::update(fleece::slice, unsigned char) const + 200 (c4Document.cc:200)
11 CouchbaseLiteSwift             0x16b848 c4doc_update + 170 (RefCounted.hh:170)
12 CouchbaseLiteSwift             0xbedd8 -[CBLCollection saveDocument:into:withBaseDocument:asDeletion:db:error:] + 635 (CBLCollection.mm:635)
13 CouchbaseLiteSwift             0xbeaec -[CBLCollection saveDocument:withBaseDocument:concurrencyControl:asDeletion:error:] + 583 (CBLCollection.mm:583)
14 CouchbaseLiteSwift             0xbdbd8 -[CBLCollection saveDocument:concurrencyControl:error:] + 377 (CBLCollection.mm:377)
15 CouchbaseLiteSwift             0x1aca0 Collection.save(document:) + 134 (Collection.swift:134)
16 InsideMaps                     0xc150a8 IMAbstractDAOCouch.saveLocallySync( + 210 (IMAbstractDAOCouch.swift:210)
17 InsideMaps                     0xc16730 @objc IMAbstractDAOCouch.saveLocallySync(  + 4376700720 (:4376700720)
Crashed: mainDatabaseQueue

0  libsystem_kernel.dylib         0xb0cc __pthread_kill + 8
1  libsystem_pthread.dylib        0x7810 pthread_kill + 268
2  libsystem_c.dylib              0x77f64 abort + 124
3  libsystem_malloc.dylib         0x15a64 malloc_vreport + 892
4  libsystem_malloc.dylib         0x156dc malloc_report + 64
5  libsystem_malloc.dylib         0x9714 ___BUG_IN_CLIENT_OF_LIBMALLOC_POINTER_BEING_FREED_WAS_NOT_ALLOCATED + 76
6  CouchbaseLiteSwift             0x286128 fleece::impl::Encoder::reset() + 101 (SmallVectorBase.hh:101)
7  CouchbaseLiteSwift             0x28d4a8 FLEncoder_Finish + 280 (unique_ptr.h:280)
8  CouchbaseLiteSwift             0x1ccf34 litecore::VectorRecord::encodeBodyAndExtra(FLEncoder*) + 609 (Fleece.hh:609)
9  CouchbaseLiteSwift             0x1ccdf8 litecore::VectorRecord::encodeBodyAndExtra() + 416 (Fleece.hh:416)
10 CouchbaseLiteSwift             0x1ccaf0 litecore::VectorRecord::save(litecore::ExclusiveTransaction&, litecore::HybridClock&) + 227 (slice.hh:227)
11 CouchbaseLiteSwift             0x1b4f60 litecore::VectorDocument::save(unsigned int) + 657 (VectorDocument.cc:657)
12 CouchbaseLiteSwift             0x1b578c litecore::VectorDocument::saveIfRequested(C4DocPutRequest const&, C4Error*) + 502 (VectorDocument.cc:502)
13 CouchbaseLiteSwift             0x1b54cc litecore::VectorDocument::putNewRevision(C4DocPutRequest const&, C4Error*) + 396 (VectorDocument.cc:396)
14 CouchbaseLiteSwift             0x18aadc C4Document::update(fleece::slice, unsigned char) const + 200 (c4Document.cc:200)
15 CouchbaseLiteSwift             0x16b848 c4doc_update + 170 (RefCounted.hh:170)
16 CouchbaseLiteSwift             0xbedd8 -[CBLCollection saveDocument:into:withBaseDocument:asDeletion:db:error:] + 635 (CBLCollection.mm:635)
17 CouchbaseLiteSwift             0xbeaec -[CBLCollection saveDocument:withBaseDocument:concurrencyControl:asDeletion:error:] + 583 (CBLCollection.mm:583)
18 CouchbaseLiteSwift             0xbdbd8 -[CBLCollection saveDocument:concurrencyControl:error:] + 377 (CBLCollection.mm:377)
19 CouchbaseLiteSwift             0x1aca0 Collection.save(document:) + 134 (Collection.swift:134)
20 InsideMaps                     0xc150a8 IMAbstractDAOCouch.saveLocallySync(
 + 210 (IMAbstractDAOCouch.swift:210)
21 InsideMaps                     0xc16730 @objc IMAbstractDAOCouch.saveLocallySync(
 + 4345407280 (:4345407280)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions