keycloak
公開メンバ関数 | 非公開メンバ関数 | 非公開変数類 | 静的非公開変数類 | 全メンバ一覧
org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider クラス
org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider の継承関係図
Inheritance graph
org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider 連携図
Collaboration graph

公開メンバ関数

 LiquibaseDBLockProvider (LiquibaseDBLockProviderFactory factory, KeycloakSession session)
 
void waitForLock ()
 
void releaseLock ()
 
boolean hasLock ()
 
boolean supportsForcedUnlock ()
 
void destroyLockInfo ()
 
void close ()
 

非公開メンバ関数

void lazyInit ()
 
void restart ()
 
void safeRollbackConnection ()
 
void safeCloseConnection ()
 

非公開変数類

int DEFAULT_MAX_ATTEMPTS = 3
 
final LiquibaseDBLockProviderFactory factory
 
final KeycloakSession session
 
CustomLockService lockService
 
Connection dbConnection
 
boolean initialized = false
 
int maxAttempts = DEFAULT_MAX_ATTEMPTS
 

静的非公開変数類

static final Logger logger = Logger.getLogger(LiquibaseDBLockProvider.class)
 

詳解

著者
Marek Posolda

構築子と解体子

◆ LiquibaseDBLockProvider()

org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.LiquibaseDBLockProvider ( LiquibaseDBLockProviderFactory  factory,
KeycloakSession  session 
)
inline
54  {
55  this.factory = factory;
56  this.session = session;
57  }
final KeycloakSession session
Definition: LiquibaseDBLockProvider.java:46
final LiquibaseDBLockProviderFactory factory
Definition: LiquibaseDBLockProvider.java:45

関数詳解

◆ close()

void org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.close ( )
inline

org.keycloak.provider.Providerを実装しています。

160  {
161  KeycloakModelUtils.suspendJtaTransaction(session.getKeycloakSessionFactory(), () -> {
163  });
164  }
KeycloakSessionFactory getKeycloakSessionFactory()
void safeCloseConnection()
Definition: LiquibaseDBLockProvider.java:176
final KeycloakSession session
Definition: LiquibaseDBLockProvider.java:46

◆ destroyLockInfo()

void org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.destroyLockInfo ( )
inline

org.keycloak.models.dblock.DBLockProviderを実装しています。

144  {
145  KeycloakModelUtils.suspendJtaTransaction(session.getKeycloakSessionFactory(), () -> {
146  lazyInit();
147 
148  try {
149  this.lockService.destroy();
150  dbConnection.commit();
151  logger.debug("Destroyed lock table");
152  } catch (DatabaseException | SQLException de) {
153  logger.error("Failed to destroy lock table");
155  }
156  });
157  }
KeycloakSessionFactory getKeycloakSessionFactory()
void safeRollbackConnection()
Definition: LiquibaseDBLockProvider.java:166
final KeycloakSession session
Definition: LiquibaseDBLockProvider.java:46
Connection dbConnection
Definition: LiquibaseDBLockProvider.java:49
static final Logger logger
Definition: LiquibaseDBLockProvider.java:39
void lazyInit()
Definition: LiquibaseDBLockProvider.java:60
CustomLockService lockService
Definition: LiquibaseDBLockProvider.java:48

◆ hasLock()

boolean org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.hasLock ( )
inline

org.keycloak.models.dblock.DBLockProviderを実装しています。

133  {
134  return factory.hasLock();
135  }
AtomicBoolean hasLock
Definition: LiquibaseDBLockProviderFactory.java:39
final LiquibaseDBLockProviderFactory factory
Definition: LiquibaseDBLockProvider.java:45

◆ lazyInit()

void org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.lazyInit ( )
inlineprivate
60  {
61  if (!initialized) {
62  LiquibaseConnectionProvider liquibaseProvider = session.getProvider(LiquibaseConnectionProvider.class);
63  JpaConnectionProviderFactory jpaProviderFactory = (JpaConnectionProviderFactory) session.getKeycloakSessionFactory().getProviderFactory(JpaConnectionProvider.class);
64 
65  this.dbConnection = jpaProviderFactory.getConnection();
66  String defaultSchema = jpaProviderFactory.getSchema();
67 
68  try {
69  Liquibase liquibase = liquibaseProvider.getLiquibase(dbConnection, defaultSchema);
70 
71  this.lockService = new CustomLockService();
72  lockService.setChangeLogLockWaitTime(factory.getLockWaitTimeoutMillis());
73  lockService.setDatabase(liquibase.getDatabase());
74  initialized = true;
75  } catch (LiquibaseException exception) {
78  throw new IllegalStateException(exception);
79  }
80  }
81  }
KeycloakSessionFactory getKeycloakSessionFactory()
void safeCloseConnection()
Definition: LiquibaseDBLockProvider.java:176
void safeRollbackConnection()
Definition: LiquibaseDBLockProvider.java:166
< T extends Provider > T getProvider(Class< T > clazz)
final KeycloakSession session
Definition: LiquibaseDBLockProvider.java:46
< T extends Provider > ProviderFactory< T > getProviderFactory(Class< T > clazz)
boolean initialized
Definition: LiquibaseDBLockProvider.java:50
Connection dbConnection
Definition: LiquibaseDBLockProvider.java:49
long getLockWaitTimeoutMillis()
Definition: LiquibaseDBLockProviderFactory.java:41
CustomLockService lockService
Definition: LiquibaseDBLockProvider.java:48
final LiquibaseDBLockProviderFactory factory
Definition: LiquibaseDBLockProvider.java:45

◆ releaseLock()

void org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.releaseLock ( )
inline

org.keycloak.models.dblock.DBLockProviderを実装しています。

122  {
123  KeycloakModelUtils.suspendJtaTransaction(session.getKeycloakSessionFactory(), () -> {
124  lazyInit();
125 
127  lockService.reset();
128  factory.setHasLock(false);
129  });
130  }
KeycloakSessionFactory getKeycloakSessionFactory()
void setHasLock(boolean hasLock)
Definition: LiquibaseDBLockProviderFactory.java:81
final KeycloakSession session
Definition: LiquibaseDBLockProvider.java:46
void releaseLock()
Definition: CustomLockService.java:180
void lazyInit()
Definition: LiquibaseDBLockProvider.java:60
CustomLockService lockService
Definition: LiquibaseDBLockProvider.java:48
final LiquibaseDBLockProviderFactory factory
Definition: LiquibaseDBLockProvider.java:45

◆ restart()

void org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.restart ( )
inlineprivate
84  {
86  this.dbConnection = null;
87  this.lockService = null;
88  initialized = false;
89  lazyInit();
90  }
void safeCloseConnection()
Definition: LiquibaseDBLockProvider.java:176
boolean initialized
Definition: LiquibaseDBLockProvider.java:50
Connection dbConnection
Definition: LiquibaseDBLockProvider.java:49
void lazyInit()
Definition: LiquibaseDBLockProvider.java:60
CustomLockService lockService
Definition: LiquibaseDBLockProvider.java:48

◆ safeCloseConnection()

void org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.safeCloseConnection ( )
inlineprivate
176  {
177  // Close to prevent in-mem databases from closing
178  if (dbConnection != null) {
179  try {
180  dbConnection.close();
181  } catch (SQLException e) {
182  logger.warn("Failed to close connection", e);
183  }
184  }
185  }
Connection dbConnection
Definition: LiquibaseDBLockProvider.java:49
static final Logger logger
Definition: LiquibaseDBLockProvider.java:39

◆ safeRollbackConnection()

void org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.safeRollbackConnection ( )
inlineprivate
166  {
167  if (dbConnection != null) {
168  try {
169  this.dbConnection.rollback();
170  } catch (SQLException se) {
171  logger.warn("Failed to rollback connection after error", se);
172  }
173  }
174  }
Connection dbConnection
Definition: LiquibaseDBLockProvider.java:49
static final Logger logger
Definition: LiquibaseDBLockProvider.java:39

◆ supportsForcedUnlock()

boolean org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.supportsForcedUnlock ( )
inline

org.keycloak.models.dblock.DBLockProviderを実装しています。

138  {
139  // Implementation based on "SELECT FOR UPDATE" can't force unlock as it's locked by other transaction
140  return false;
141  }

◆ waitForLock()

void org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.waitForLock ( )
inline

org.keycloak.models.dblock.DBLockProviderを実装しています。

94  {
95  KeycloakModelUtils.suspendJtaTransaction(session.getKeycloakSessionFactory(), () -> {
96 
97  lazyInit();
98 
99  while (maxAttempts > 0) {
100  try {
102  factory.setHasLock(true);
104  return;
105  } catch (LockRetryException le) {
106  // Indicates we should try to acquire lock again in different transaction
108  restart();
109  maxAttempts--;
110  } catch (RuntimeException re) {
113  throw re;
114  }
115  }
116  });
117 
118  }
void restart()
Definition: LiquibaseDBLockProvider.java:84
int maxAttempts
Definition: LiquibaseDBLockProvider.java:52
int DEFAULT_MAX_ATTEMPTS
Definition: LiquibaseDBLockProvider.java:42
KeycloakSessionFactory getKeycloakSessionFactory()
void safeCloseConnection()
Definition: LiquibaseDBLockProvider.java:176
void waitForLock()
Definition: CustomLockService.java:116
void safeRollbackConnection()
Definition: LiquibaseDBLockProvider.java:166
void setHasLock(boolean hasLock)
Definition: LiquibaseDBLockProviderFactory.java:81
final KeycloakSession session
Definition: LiquibaseDBLockProvider.java:46
void lazyInit()
Definition: LiquibaseDBLockProvider.java:60
CustomLockService lockService
Definition: LiquibaseDBLockProvider.java:48
final LiquibaseDBLockProviderFactory factory
Definition: LiquibaseDBLockProvider.java:45

メンバ詳解

◆ dbConnection

Connection org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.dbConnection
private

◆ DEFAULT_MAX_ATTEMPTS

int org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.DEFAULT_MAX_ATTEMPTS = 3
private

◆ factory

final LiquibaseDBLockProviderFactory org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.factory
private

◆ initialized

boolean org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.initialized = false
private

◆ lockService

CustomLockService org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.lockService
private

◆ logger

final Logger org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.logger = Logger.getLogger(LiquibaseDBLockProvider.class)
staticprivate

◆ maxAttempts

int org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.maxAttempts = DEFAULT_MAX_ATTEMPTS
private

◆ session

final KeycloakSession org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.session
private

このクラス詳解は次のファイルから抽出されました: