@Override
    public boolean update(String namespace, String compression, List<ChangeSet> changeSets) {
        if (CollectionUtils.isEmpty(changeSets)) {
            return false;
        }

        logger.info("[{}] Hbase schema update started.", namespace);
        assertInitialization(namespace);

        List<TableDescriptor> currentHtds = getCurrentSchema(namespace);
        List<SchemaChangeLog> schemaChangeLogs = schemaChangeLogService.getSchemaChangeLogs(namespace);

        if (CollectionUtils.isEmpty(currentHtds)) {
            if (CollectionUtils.isEmpty(schemaChangeLogs)) {
                logger.info("[{}] Schema change logs not found.", namespace);
                return init(namespace, compression, changeSets);
            }
            logger.warn("[{}] Schema change logs found, but no tables are present. Attempting recovery by resetting all schema change logs.", namespace);
            reset(namespace);
            return init(namespace, compression, changeSets);
        }

        if (CollectionUtils.isEmpty(schemaChangeLogs)) {
            return initFromExistingTables(namespace, compression, changeSets, currentHtds);
        }
        return updateExistingSchemas(namespace, compression, changeSets, currentHtds, schemaChangeLogs);
    }
This implementation uses the executed schema change logs to compare against the specified {@code changeSets} to
check the current schema status, regardless of how the actual schema looks like.
hbase/hbase-schema/src/main/java/com/navercorp/pinpoint/hbase/schema/service/HbaseSchemaServiceImpl.java