-
Notifications
You must be signed in to change notification settings - Fork 301
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.saveacross 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)