View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable;
19  
20  import org.apache.shardingsphere.distsql.handler.engine.update.DistSQLUpdateExecutor;
21  import org.apache.shardingsphere.distsql.handler.required.DistSQLExecutorClusterModeRequired;
22  import org.apache.shardingsphere.distsql.statement.ral.updatable.UnlockClusterStatement;
23  import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
24  import org.apache.shardingsphere.infra.lock.GlobalLockNames;
25  import org.apache.shardingsphere.infra.lock.LockContext;
26  import org.apache.shardingsphere.infra.state.cluster.ClusterState;
27  import org.apache.shardingsphere.mode.lock.GlobalLockDefinition;
28  import org.apache.shardingsphere.mode.manager.ContextManager;
29  import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.cluster.event.ClusterStatusChangedEvent;
30  
31  /**
32   * Unlock cluster executor.
33   */
34  @DistSQLExecutorClusterModeRequired
35  public final class UnlockClusterExecutor implements DistSQLUpdateExecutor<UnlockClusterStatement> {
36      
37      @Override
38      @SuppressWarnings({"unchecked", "rawtypes"})
39      public void executeUpdate(final UnlockClusterStatement sqlStatement, final ContextManager contextManager) {
40          checkState(contextManager);
41          LockContext lockContext = contextManager.getInstanceContext().getLockContext();
42          GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.CLUSTER_LOCK.getLockName());
43          if (lockContext.tryLock(lockDefinition, 3000L)) {
44              try {
45                  checkState(contextManager);
46                  contextManager.getInstanceContext().getEventBusContext().post(new ClusterStatusChangedEvent(ClusterState.OK));
47                  // TODO unlock snapshot info if locked
48              } finally {
49                  lockContext.unlock(lockDefinition);
50              }
51          }
52      }
53      
54      private void checkState(final ContextManager contextManager) {
55          ShardingSpherePreconditions.checkState(ClusterState.OK != contextManager.getClusterStateContext().getCurrentState(), () -> new IllegalStateException("Cluster is not locked"));
56      }
57      
58      @Override
59      public Class<UnlockClusterStatement> getType() {
60          return UnlockClusterStatement.class;
61      }
62  }