I mean, mutex should be taken for the entire transaction of course.

Best Regards,
Igor


On Thu, Jan 14, 2021 at 7:49 PM Igor Sapego <isap...@gridgain.com> wrote:

> That's true. We need to implement async reading from client socket to
> handle cases like this one properly. Currently as a workaround I can
> only suggest guarding the whole client with mutex or create separate
> clients for threads that do transactional operations.
>
> I filed a ticket for the issue [1]. Thanks for reporting.
>
> [1] - https://issues.apache.org/jira/browse/IGNITE-13997
>
> Best Regards,
> Igor
>
>
> On Thu, Jan 14, 2021 at 7:32 PM jjimeno <jjim...@omp.com> wrote:
>
>> Hello all,
>>
>> We're developing a multithread application using one C++ Thin Client to
>> connect to a cluster with a single Server Node.  The C++ Thin Client
>> version
>> is "master" from January 21.
>>
>> We have implemented a "lock-and-update" system based on the "GetAndPut"
>> function and PESSIMISTIC+READ_COMMITTED transactions. The idea is to lock
>> a
>> set of cache entries, update them and commit them atomically.
>>
>> In our tests we have detected a deadlock when following piece of code is
>> executed for more than one thread on our application:
>>
>> ...
>>
>> ClientTransactions transactions = client.ClientTransactions();
>> ClientTransaction tx = transactions.TxStart(PESSIMISTIC, READ_COMMITTED);
>>
>> // This call should atomically get the current value for "key" and put
>> "value" instead, locking the "key" cache entry at the same time
>> auto oldValue = cache.GetAndPut(key, value);
>>
>> // Only the thread able of locking "key" should reach this code. Others
>> have
>> to wait for tx.Commit() to complete
>> cache.Put (key, newValue);
>>
>> // After this call, other thread waiting in GetAndPut for "key" to be
>> released should be able of continuing
>> tx.Commit ();
>>
>> ...
>>
>> The thread reaching "cache.Put (key, newValue);" call, gets blocked in
>> there, concretely in the lockGuard object created at the beginning of
>> DataChannel::InternalSyncMessage function (data_channel.cpp:108).  After
>> debugging, we realized that this lockGuard is owned by a different thread,
>> which is currently waiting on socket while executing GetAndPut function.
>> According to this, my guess is that data routing for C++ Thin Clients is
>> not
>> multithread friendly.
>>
>> I did a test creating a C++ Thin Client for each different thread and the
>> problem disappeared, but this is something I would like to avoid since
>> threads are created and destroyed on the fly.
>>
>> So, my questions is: do I have to create a C++ thin client for each
>> different thread or there is any workaround?
>>
>> Thanks in advance!
>>
>>
>>
>> --
>> Sent from: http://apache-ignite-users.70518.x6.nabble.com/
>>
>

Reply via email to