firebase-ios-sdk icon indicating copy to clipboard operation
firebase-ios-sdk copied to clipboard

Fix: whereField creates a memory leak

Open milaGGL opened this issue 1 year ago • 3 comments

fix: https://github.com/firebase/firebase-ios-sdk/issues/12613 revert the thread safe memoizer introduced in this pr: https://github.com/firebase/firebase-ios-sdk/pull/11781

@cherylEnkidu : This PR intends to fix the data race and memory leak issue.

When using memorized field, it leads to data race. However, the solution for fixing data race issue introduces memory leak.

So this PR construct a flatten filters for composite filter during initialization.

The reason for not providing GetFlattenFilter() in base filter class is creating flatten filter in field filter constructor will cause infinity loop.

Since GetFlattenFilter() is widely used in query calls, init flatten filters vector in composite filter during construction won't hurt efficiency a lot comparing to construct flatten filters vector upon request.

milaGGL avatar May 15 '24 19:05 milaGGL

Coverage Report 1

Affected Products

  • FirebaseFirestore-iOS-FirebaseFirestoreInternal.framework

    Overall coverage changed from 88.21% (eca84fd) to 88.19% (9b34ba4) by -0.02%.

    FilenameBase (eca84fd)Merge (9b34ba4)Diff
    composite_filter.cc90.10%89.25%-0.85%
    field_filter.cc95.00%94.78%-0.22%
    filter.cc70.00%62.50%-7.50%
    grpc_stream.cc99.01%98.02%-0.99%
    leveldb_key.cc98.63%98.43%-0.20%
    query.cc98.43%98.33%-0.11%
    query_core.cc95.80%95.81%+0.01%
    target.cc96.23%96.24%+0.01%
    task.cc94.78%96.52%+1.74%

Test Logs

google-oss-bot avatar May 15 '24 19:05 google-oss-bot

Hi @ehsannas , could you please review this fix?

cherylEnkidu avatar May 27 '24 00:05 cherylEnkidu

The reason for not providing GetFlattenFilter() in base filter class is creating flatten filter in field filter constructor will cause infinity loop.

why? maybe you shouldn't call GetFlattenedFilters() in the constructor, but should still have GetFlattenedFilters() defined for field filters [which just returns *this].

@ehsannas I put back GetFlattenedFilters() in the Filter class and return a shared pointer to vector.

cherylEnkidu avatar Jul 03 '24 02:07 cherylEnkidu