예제 #1
0
  private void accept() {
    SocketChannel channel = null;
    try {
      channel = serverChannel.accept();
      channel.configureBlocking(false);
      FrontendConnection c = factory.make(channel);
      c.setAccepted(true);
      c.setId(ID_GENERATOR.getId());
      NIOProcessor processor = (NIOProcessor) MycatServer.getInstance().nextProcessor();
      c.setProcessor(processor);

      NIOReactor reactor = reactorPool.getNextReactor();
      reactor.postRegister(c);

    } catch (Exception e) {
      LOGGER.warn(getName(), e);
      closeChannel(channel);
    }
  }
예제 #2
0
 public static void execute(MySQLFrontConnection c) {
   final ReentrantLock lock = MycatServer.getInstance().getConfig().getLock();
   lock.lock();
   try {
     if (ReloadUtil.rollback()) {
       StringBuilder s = new StringBuilder();
       s.append(c).append("Rollback config success by manager");
       LOGGER.warn(s.toString());
       OkPacket ok = new OkPacket();
       ok.packetId = 1;
       ok.affectedRows = 1;
       ok.serverStatus = 2;
       ok.message = "Rollback config success".getBytes();
       ok.write(c);
     } else {
       c.writeErrMessage(ErrorCode.ER_YES, "Rollback config failure");
     }
   } finally {
     lock.unlock();
   }
 }
예제 #3
0
 public static void execute(ManagerConnection c) {
   ByteBuffer buffer = c.allocate();
   buffer = header.write(buffer, c, true);
   for (FieldPacket field : fields) {
     buffer = field.write(buffer, c, true);
   }
   buffer = eof.write(buffer, c, true);
   byte packetId = eof.packetId;
   String charset = c.getCharset();
   for (NIOProcessor p : MycatServer.getInstance().getProcessors()) {
     for (BackendConnection bc : p.getBackends().values()) {
       if (bc != null) {
         RowDataPacket row = getRow(bc, charset);
         row.packetId = ++packetId;
         buffer = row.write(buffer, c, true);
       }
     }
   }
   EOFPacket lastEof = new EOFPacket();
   lastEof.packetId = ++packetId;
   buffer = lastEof.write(buffer, c, true);
   c.write(buffer);
 }
예제 #4
0
 public static void response(MySQLFrontConnection c, byte[] data) {
   HeartbeatPacket hp = new HeartbeatPacket();
   hp.read(data);
   if (MycatServer.getInstance().isOnline()) {
     OkPacket ok = new OkPacket();
     ok.packetId = 1;
     ok.affectedRows = hp.id;
     ok.serverStatus = 2;
     ok.write(c);
     if (HEARTBEAT.isInfoEnabled()) {
       HEARTBEAT.info(responseMessage("OK", c, hp.id));
     }
   } else {
     ErrorPacket error = new ErrorPacket();
     error.packetId = 1;
     error.errno = ErrorCode.ER_SERVER_SHUTDOWN;
     error.message = String.valueOf(hp.id).getBytes();
     error.write(c);
     if (HEARTBEAT.isInfoEnabled()) {
       HEARTBEAT.info(responseMessage("ERROR", c, hp.id));
     }
   }
 }
예제 #5
0
  public static boolean processERChildTable(
      final SchemaConfig schema, final String origSQL, final ServerConnection sc)
      throws SQLNonTransientException {
    String tableName = StringUtil.getTableName(origSQL).toUpperCase();
    final TableConfig tc = schema.getTables().get(tableName);

    if (null != tc && tc.isChildTable()) {
      final RouteResultset rrs = new RouteResultset(origSQL, ServerParse.INSERT);
      String joinKey = tc.getJoinKey();
      MySqlInsertStatement insertStmt =
          (MySqlInsertStatement) (new MySqlStatementParser(origSQL)).parseInsert();
      int joinKeyIndex = getJoinKeyIndex(insertStmt.getColumns(), joinKey);

      if (joinKeyIndex == -1) {
        String inf = "joinKey not provided :" + tc.getJoinKey() + "," + insertStmt;
        LOGGER.warn(inf);
        throw new SQLNonTransientException(inf);
      }
      if (isMultiInsert(insertStmt)) {
        String msg = "ChildTable multi insert not provided";
        LOGGER.warn(msg);
        throw new SQLNonTransientException(msg);
      }

      String joinKeyVal = insertStmt.getValues().getValues().get(joinKeyIndex).toString();

      String sql = insertStmt.toString();

      // try to route by ER parent partion key
      RouteResultset theRrs = RouterUtil.routeByERParentKey(sql, rrs, tc, joinKeyVal);

      if (theRrs != null) {
        rrs.setFinishedRoute(true);
        sc.getSession2().execute(rrs, ServerParse.INSERT);
        return true;
      }

      // route by sql query root parent's datanode
      final String findRootTBSql = tc.getLocateRTableKeySql().toLowerCase() + joinKeyVal;
      if (LOGGER.isDebugEnabled()) {
        LOGGER.debug("find root parent's node sql " + findRootTBSql);
      }

      ListenableFuture<String> listenableFuture =
          MycatServer.getInstance()
              .getListeningExecutorService()
              .submit(
                  new Callable<String>() {
                    @Override
                    public String call() throws Exception {
                      FetchStoreNodeOfChildTableHandler fetchHandler =
                          new FetchStoreNodeOfChildTableHandler();
                      return fetchHandler.execute(
                          schema.getName(), findRootTBSql, tc.getRootParent().getDataNodes());
                    }
                  });

      Futures.addCallback(
          listenableFuture,
          new FutureCallback<String>() {
            @Override
            public void onSuccess(String result) {
              if (Strings.isNullOrEmpty(result)) {
                StringBuilder s = new StringBuilder();
                LOGGER.warn(
                    s.append(sc.getSession2()).append(origSQL).toString()
                        + " err:"
                        + "can't find (root) parent sharding node for sql:"
                        + origSQL);
                sc.writeErrMessage(
                    ErrorCode.ER_PARSE_ERROR,
                    "can't find (root) parent sharding node for sql:" + origSQL);
                return;
              }

              if (LOGGER.isDebugEnabled()) {
                LOGGER.debug(
                    "found partion node for child table to insert " + result + " sql :" + origSQL);
              }

              RouteResultset executeRrs = RouterUtil.routeToSingleNode(rrs, result, origSQL);
              sc.getSession2().execute(executeRrs, ServerParse.INSERT);
            }

            @Override
            public void onFailure(Throwable t) {
              StringBuilder s = new StringBuilder();
              LOGGER.warn(
                  s.append(sc.getSession2()).append(origSQL).toString() + " err:" + t.getMessage());
              sc.writeErrMessage(ErrorCode.ER_PARSE_ERROR, t.getMessage() + " " + s.toString());
            }
          },
          MycatServer.getInstance().getListeningExecutorService());
      return true;
    }
    return false;
  }
예제 #6
0
 public static void processSQL(ServerConnection sc, SchemaConfig schema, String sql, int sqlType) {
   MycatServer.getInstance()
       .getSequnceProcessor()
       .addNewSql(new SessionSQLPair(sc.getSession2(), schema, sql, sqlType));
 }