> On Mon, 29 Oct 2018 at 05:56, Haribabu Kommi <kommi.harib...@gmail.com> wrote: > >> This problem couldn't be reproduced on the master branch, so I've tried to >> investigate it. It comes from nodeModifyTable.c:1267, when we've got >> HeapTupleInvisible as a result, and this value in turn comes from >> table_lock_tuple. Everything points to the new way of handling >> HeapTupleUpdated >> result from heap_update, when table_lock_tuple call was introduced. Since I >> don't see anything similar in the master branch, can anyone clarify why is >> this >> lock necessary here? > > > In the master branch code also, there is a tuple lock that is happening in > EvalPlanQual() function, but pluggable-storage code, the lock is kept outside > and also function call rearrangements, to make it easier for the table access > methods to provide their own MVCC implementation.
Yes, now I see it, thanks. Also I can confirm that the attached patch solves this issue. FYI, alongside with reviewing the code changes I've ran few performance tests (that's why I hit this issue with pgbench in the first place). In case of high concurrecy so far I see small performance degradation in comparison with the master branch (about 2-5% of average latency, depending on the level of concurrency), but can't really say why exactly (perf just shows barely noticeable overhead there and there, maybe what I see is actually a cumulative impact).