@@ -31,19 +31,17 @@ public Optional<SimpleLock> lock(LockConfiguration lockConfiguration) {
3131 try {
3232 connection .setAutoCommit (false );
3333
34- var selectPS = connection .prepareStatement ("SELECT lock_until, locked_by FROM shedlock " +
35- "WHERE name = ? AND lock_until > CurrentUtcTimestamp() + ? " );
34+ var selectPS = connection .prepareStatement ("SELECT locked_by, lock_until FROM shedlock " +
35+ "WHERE name = ? AND lock_until > CurrentUtcTimestamp()" );
3636
3737 selectPS .setString (1 , lockConfiguration .getName ());
38- selectPS .setObject (2 , lockConfiguration .getLockAtMostFor ());
3938
40- var haveLeader = false ;
4139 try (var rs = selectPS .executeQuery ()) {
42- haveLeader = rs .next ();
43- }
44-
45- if ( haveLeader ) {
46- return Optional . empty ();
40+ if ( rs .next ()) {
41+ LOGGER . debug ( "Instance[{}] acquire lock is failed. Leader is {}, lock_until = {}" ,
42+ LOCKED_BY , rs . getString ( 1 ), rs . getString ( 2 ));
43+ return Optional . empty ();
44+ }
4745 }
4846
4947 var upsertPS = connection .prepareStatement ("" +
@@ -65,31 +63,50 @@ public Optional<SimpleLock> lock(LockConfiguration lockConfiguration) {
6563 connection .setAutoCommit (autoCommit );
6664 }
6765 } catch (SQLException e ) {
68- LOGGER .debug (String . format ( "Instance[{%s }] acquire lock is failed" , LOCKED_BY ), e );
66+ LOGGER .debug ("Instance[{}] acquire lock is failed" , LOCKED_BY );
6967
7068 return Optional .empty ();
7169 }
7270 }
7371
7472 private record YdbJDBCLock (String name , DataSource dataSource ) implements SimpleLock {
73+ private static final int ATTEMPT_RELEASE_LOCK = 10 ;
74+
7575 @ Override
7676 public void unlock () {
77+ for (int i = 0 ; i < ATTEMPT_RELEASE_LOCK ; i ++) {
78+ try {
79+ LOGGER .debug ("Instance[{}] trying unlock.." , LOCKED_BY );
80+
81+ doUnlock ();
82+
83+ return ;
84+ } catch (SQLException e ) {
85+ if (i == ATTEMPT_RELEASE_LOCK - 1 ) {
86+ throw new RuntimeException (e );
87+ }
88+ }
89+ }
90+ }
91+
92+ private void doUnlock () throws SQLException {
7793 try (var connection = dataSource .getConnection ()) {
7894 var autoCommit = connection .getAutoCommit ();
7995
8096 try {
8197 connection .setAutoCommit (true );
8298 var ps = connection .prepareStatement (
83- "UPDATE shedlock SET lock_until = CurrentUtcTimestamp() WHERE name = ?" );
84- ps .setObject (1 , name );
99+ "UPDATE shedlock SET lock_until = CurrentUtcTimestamp() WHERE name = ? and locked_by = ?" );
100+ ps .setString (1 , name );
101+ ps .setString (2 , LOCKED_BY );
85102 ps .execute ();
86103 } finally {
87104 connection .setAutoCommit (autoCommit );
88105 }
89106 } catch (SQLException e ) {
90- LOGGER .error (String .format ("Instance[{%s}] release lock is failed" , LOCKED_BY ), e );
107+ LOGGER .debug (String .format ("Instance[{%s}] release lock is failed" , LOCKED_BY ), e );
91108
92- throw new RuntimeException ( e ) ;
109+ throw e ;
93110 }
94111 }
95112 }
0 commit comments