Please read this, thinking that there may be such a possibility.
I fork each version of Bitcoin to make Fujicoin. I am currently testing Fujicoin made from v22.0rc2.
https://github.com/fujicoin/fujicoin

I often create large transactions with more than 350 inputs, but in v22.0, I fail to transfer money due to lack of fee about once every few times and get into a "not in memory pool" state.
This phenomenon sometimes occurred in previous versions. It rarely occurred in v0.21.x, but it seems that the frequency increased in v22.0.

Specific explanation
--------------------

The following image is the dialog at the time of remittance.
![fujicoin5](https://user-images.githubusercontent.com/7656623/128798045-08037fc5-d4ea-4dd2-9a5d-813cbd33c14a.png)

The following images show the remittance result and its details.
![fujicoin6](https://user-images.githubusercontent.com/7656623/128798270-287f9586-4a31-449d-9e69-853a6a5c3b4b.png)

![fujicoin7](https://user-images.githubusercontent.com/7656623/128798285-dc45a05e-0d71-488a-8e03-a46d30de7bdc.png)

I made a program with python and calculated fee from raw Tx. In my calculation the fee was 2.57729334.
Therefore, it is correct to be out of memoly pool due to insufficient remittance fee.
In this case, the pre-remittance fee calculation is incorrect.

As you can see from the figure, this phenomenon can be reproduced many times if the wallet state is the same.
Unfortunately, I don't have any more parsing ability, so I can't identify what kind of transaction causes a calculation error.

Fortunately, I've never experienced this with regular size transactions. Transactions that could not be remitted can be canceled, so there is no actual harm. 

I think it's pretty difficult to identify this problem, but I think it's very good if it improves.

}
            coin.effective_value = coin.txout.nValue - coin_selection_params.m_effective_feerate.GetFee(coin.m_input_bytes);
            if (coin_selection_params.m_subtract_fee_outputs) {
                value_to_select -= coin.txout.nValue;
            } else {
                value_to_select -= coin.effective_value;
            }
            setPresetCoins.insert(coin);
        } else {
            return false; 
        }
    }
    
    for (std::vector<COutput>::iterator it = vCoins.begin(); it != vCoins.end() && coin_control.HasSelected();)
    {
        if (setPresetCoins.count(it->GetInputCoin()))
            it = vCoins.erase(it);
        else
            ++it;
    }
    unsigned int limit_ancestor_count = 0;
    unsigned int limit_descendant_count = 0;
    chain().getPackageLimits(limit_ancestor_count, limit_descendant_count);
    const size_t max_ancestors = (size_t)std::max<int64_t>(1, limit_ancestor_count);
    const size_t max_descendants = (size_t)std::max<int64_t>(1, limit_descendant_count);
    const bool fRejectLongChains = gArgs.GetBoolArg("-walletrejectlongchains", DEFAULT_WALLET_REJECT_LONG_CHAINS);
    
    
    if (coin_control.m_avoid_partial_spends && vCoins.size() > OUTPUT_GROUP_MAX_ENTRIES) {