@@ -31,19 +31,17 @@ public Optional<SimpleLock> lock(LockConfiguration lockConfiguration) {
31
31
try {
32
32
connection .setAutoCommit (false );
33
33
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()" );
36
36
37
37
selectPS .setString (1 , lockConfiguration .getName ());
38
- selectPS .setObject (2 , lockConfiguration .getLockAtMostFor ());
39
38
40
- var haveLeader = false ;
41
39
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
+ }
47
45
}
48
46
49
47
var upsertPS = connection .prepareStatement ("" +
@@ -65,31 +63,50 @@ public Optional<SimpleLock> lock(LockConfiguration lockConfiguration) {
65
63
connection .setAutoCommit (autoCommit );
66
64
}
67
65
} 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 );
69
67
70
68
return Optional .empty ();
71
69
}
72
70
}
73
71
74
72
private record YdbJDBCLock (String name , DataSource dataSource ) implements SimpleLock {
73
+ private static final int ATTEMPT_RELEASE_LOCK = 10 ;
74
+
75
75
@ Override
76
76
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 {
77
93
try (var connection = dataSource .getConnection ()) {
78
94
var autoCommit = connection .getAutoCommit ();
79
95
80
96
try {
81
97
connection .setAutoCommit (true );
82
98
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 );
85
102
ps .execute ();
86
103
} finally {
87
104
connection .setAutoCommit (autoCommit );
88
105
}
89
106
} 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 );
91
108
92
- throw new RuntimeException ( e ) ;
109
+ throw e ;
93
110
}
94
111
}
95
112
}
0 commit comments