当前位置: 首页>>代码示例>>Java>>正文


Java MetaData.builder方法代码示例

本文整理汇总了Java中org.elasticsearch.cluster.metadata.MetaData.builder方法的典型用法代码示例。如果您正苦于以下问题:Java MetaData.builder方法的具体用法?Java MetaData.builder怎么用?Java MetaData.builder使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在org.elasticsearch.cluster.metadata.MetaData的用法示例。


在下文中一共展示了MetaData.builder方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Java代码示例。

示例1: loadFullState

import org.elasticsearch.cluster.metadata.MetaData; //导入方法依赖的package包/类
/**
 * Loads the full state, which includes both the global state and all the indices
 * meta state.
 */
MetaData loadFullState() throws Exception {
    MetaData globalMetaData = loadGlobalState();
    MetaData.Builder metaDataBuilder;
    if (globalMetaData != null) {
        metaDataBuilder = MetaData.builder(globalMetaData);
    } else {
        metaDataBuilder = MetaData.builder();
    }
    for (String indexFolderName : nodeEnv.availableIndexFolders()) {
        IndexMetaData indexMetaData = IndexMetaData.FORMAT.loadLatestState(logger, namedXContentRegistry,
            nodeEnv.resolveIndexFolder(indexFolderName));
        if (indexMetaData != null) {
            metaDataBuilder.put(indexMetaData, false);
        } else {
            logger.debug("[{}] failed to find metadata for existing index location", indexFolderName);
        }
    }
    return metaDataBuilder.build();
}
 
开发者ID:justor,项目名称:elasticsearch_my,代码行数:24,代码来源:MetaStateService.java

示例2: createInitialClusterState

import org.elasticsearch.cluster.metadata.MetaData; //导入方法依赖的package包/类
private ClusterState createInitialClusterState() {
    MetaData.Builder metaBuilder = MetaData.builder();
    metaBuilder.put(IndexMetaData.builder("idx").settings(settings(Version.CURRENT)).numberOfShards(1).numberOfReplicas(0));
    MetaData metaData = metaBuilder.build();
    RoutingTable.Builder routingTableBuilder = RoutingTable.builder();
    routingTableBuilder.addAsNew(metaData.index("idx"));

    RoutingTable routingTable = routingTableBuilder.build();
    ClusterState clusterState = ClusterState.builder(ClusterName.CLUSTER_NAME_SETTING.getDefault(Settings.EMPTY))
        .metaData(metaData).routingTable(routingTable).build();
    clusterState = ClusterState.builder(clusterState).nodes(DiscoveryNodes.builder().add(newNode("node1")).add(newNode("node2")))
        .build();
    RoutingTable prevRoutingTable = routingTable;
    routingTable = strategy.reroute(clusterState, "reroute", false).routingTable();
    clusterState = ClusterState.builder(clusterState).routingTable(routingTable).build();

    assertEquals(prevRoutingTable.index("idx").shards().size(), 1);
    assertEquals(prevRoutingTable.index("idx").shard(0).shards().get(0).state(), UNASSIGNED);

    assertEquals(routingTable.index("idx").shards().size(), 1);
    assertEquals(routingTable.index("idx").shard(0).shards().get(0).state(), INITIALIZING);
    return clusterState;
}
 
开发者ID:justor,项目名称:elasticsearch_my,代码行数:24,代码来源:MaxRetryAllocationDeciderTests.java

示例3: addIndex

import org.elasticsearch.cluster.metadata.MetaData; //导入方法依赖的package包/类
private ClusterState addIndex(ClusterState clusterState, AllocationService service, int indexOrdinal, int numberOfShards,
                              int numberOfReplicas) {
    MetaData.Builder metaDataBuilder = MetaData.builder(clusterState.getMetaData());
    RoutingTable.Builder routingTableBuilder = RoutingTable.builder(clusterState.routingTable());

    IndexMetaData.Builder index = IndexMetaData.builder("test" + indexOrdinal).settings(settings(Version.CURRENT)).numberOfShards(numberOfShards).numberOfReplicas(
            numberOfReplicas);
    IndexMetaData imd = index.build();
    metaDataBuilder = metaDataBuilder.put(imd, true);
    routingTableBuilder.addAsNew(imd);

    MetaData metaData = metaDataBuilder.build();
    clusterState = ClusterState.builder(clusterState).metaData(metaData).routingTable(routingTableBuilder.build()).build();
    clusterState = service.reroute(clusterState, "reroute");

    logger.info("restart all the primary shards, replicas will start initializing");
    RoutingNodes routingNodes = clusterState.getRoutingNodes();
    clusterState = service.applyStartedShards(clusterState, routingNodes.shardsWithState(INITIALIZING));

    logger.info("start the replica shards");
    routingNodes = clusterState.getRoutingNodes();
    clusterState = service.applyStartedShards(clusterState, routingNodes.shardsWithState(INITIALIZING));

    logger.info("complete rebalancing");
    return applyStartedShardsUntilNoChange(clusterState, service);
}
 
开发者ID:justor,项目名称:elasticsearch_my,代码行数:27,代码来源:AddIncrementallyTests.java

示例4: createInitialClusterState

import org.elasticsearch.cluster.metadata.MetaData; //导入方法依赖的package包/类
private ClusterState createInitialClusterState(AllocationService service) {
    MetaData.Builder metaBuilder = MetaData.builder();
    metaBuilder.put(IndexMetaData.builder("idx").settings(settings(Version.CURRENT)).numberOfShards(1).numberOfReplicas(0));
    MetaData metaData = metaBuilder.build();
    RoutingTable.Builder routingTableBuilder = RoutingTable.builder();
    routingTableBuilder.addAsNew(metaData.index("idx"));

    RoutingTable routingTable = routingTableBuilder.build();
    ClusterState clusterState = ClusterState.builder(org.elasticsearch.cluster.ClusterName.CLUSTER_NAME_SETTING
        .getDefault(Settings.EMPTY))
        .metaData(metaData).routingTable(routingTable).build();
    clusterState = ClusterState.builder(clusterState).nodes(DiscoveryNodes.builder().add(newNode("node1")).add(newNode("node2")))
        .build();
    RoutingTable prevRoutingTable = routingTable;
    routingTable = service.reroute(clusterState, "reroute").routingTable();
    clusterState = ClusterState.builder(clusterState).routingTable(routingTable).build();

    assertEquals(prevRoutingTable.index("idx").shards().size(), 1);
    assertEquals(prevRoutingTable.index("idx").shard(0).shards().get(0).state(), UNASSIGNED);

    assertEquals(routingTable.index("idx").shards().size(), 1);
    assertEquals(routingTable.index("idx").shard(0).shards().get(0).state(), INITIALIZING);
    return clusterState;
}
 
开发者ID:justor,项目名称:elasticsearch_my,代码行数:25,代码来源:ClusterRerouteTests.java

示例5: loadFullState

import org.elasticsearch.cluster.metadata.MetaData; //导入方法依赖的package包/类
/**
 * Loads the full state, which includes both the global state and all the indices
 * meta state.
 */
MetaData loadFullState() throws Exception {
    MetaData globalMetaData = loadGlobalState();
    MetaData.Builder metaDataBuilder;
    if (globalMetaData != null) {
        metaDataBuilder = MetaData.builder(globalMetaData);
    } else {
        metaDataBuilder = MetaData.builder();
    }

    final Set<String> indices = nodeEnv.findAllIndices();
    for (String index : indices) {
        IndexMetaData indexMetaData = loadIndexState(index);
        if (indexMetaData == null) {
            logger.debug("[{}] failed to find metadata for existing index location", index);
        } else {
            metaDataBuilder.put(indexMetaData, false);
        }
    }
    return metaDataBuilder.build();
}
 
开发者ID:baidu,项目名称:Elasticsearch,代码行数:25,代码来源:MetaStateService.java

示例6: setUp

import org.elasticsearch.cluster.metadata.MetaData; //导入方法依赖的package包/类
@Setup
public void setUp() throws Exception {
    final String[] params = indicesShardsReplicasNodes.split("\\|");

    int numIndices = toInt(params[0]);
    int numShards = toInt(params[1]);
    int numReplicas = toInt(params[2]);
    int numNodes = toInt(params[3]);

    strategy = Allocators.createAllocationService(Settings.builder()
            .put("cluster.routing.allocation.awareness.attributes", "tag")
            .build());

    MetaData.Builder mb = MetaData.builder();
    for (int i = 1; i <= numIndices; i++) {
        mb.put(IndexMetaData.builder("test_" + i)
                .settings(Settings.builder().put("index.version.created", Version.CURRENT))
                .numberOfShards(numShards)
                .numberOfReplicas(numReplicas)
        );
    }
    MetaData metaData = mb.build();
    RoutingTable.Builder rb = RoutingTable.builder();
    for (int i = 1; i <= numIndices; i++) {
        rb.addAsNew(metaData.index("test_" + i));
    }
    RoutingTable routingTable = rb.build();
    DiscoveryNodes.Builder nb = DiscoveryNodes.builder();
    for (int i = 1; i <= numNodes; i++) {
        nb.add(Allocators.newNode("node" + i, Collections.singletonMap("tag", "tag_" + (i % numTags))));
    }
    initialClusterState = ClusterState.builder(ClusterName.CLUSTER_NAME_SETTING.getDefault(Settings.EMPTY))
        .metaData(metaData).routingTable(routingTable).nodes
            (nb).build();
}
 
开发者ID:justor,项目名称:elasticsearch_my,代码行数:36,代码来源:AllocationBenchmark.java

示例7: upgradeMetaData

import org.elasticsearch.cluster.metadata.MetaData; //导入方法依赖的package包/类
/**
 * Elasticsearch 2.0 removed several deprecated features and as well as support for Lucene 3.x. This method calls
 * {@link MetaDataIndexUpgradeService} to makes sure that indices are compatible with the current version. The
 * MetaDataIndexUpgradeService might also update obsolete settings if needed.
 * Allows upgrading global custom meta data via {@link MetaDataUpgrader#customMetaDataUpgraders}
 *
 * @return input <code>metaData</code> if no upgrade is needed or an upgraded metaData
 */
static MetaData upgradeMetaData(MetaData metaData,
                                MetaDataIndexUpgradeService metaDataIndexUpgradeService,
                                MetaDataUpgrader metaDataUpgrader) throws Exception {
    // upgrade index meta data
    boolean changed = false;
    final MetaData.Builder upgradedMetaData = MetaData.builder(metaData);
    for (IndexMetaData indexMetaData : metaData) {
        IndexMetaData newMetaData = metaDataIndexUpgradeService.upgradeIndexMetaData(indexMetaData,
            Version.CURRENT.minimumIndexCompatibilityVersion());
        changed |= indexMetaData != newMetaData;
        upgradedMetaData.put(newMetaData, false);
    }
    // collect current customs
    Map<String, MetaData.Custom> existingCustoms = new HashMap<>();
    for (ObjectObjectCursor<String, MetaData.Custom> customCursor : metaData.customs()) {
        existingCustoms.put(customCursor.key, customCursor.value);
    }
    // upgrade global custom meta data
    Map<String, MetaData.Custom> upgradedCustoms = metaDataUpgrader.customMetaDataUpgraders.apply(existingCustoms);
    if (upgradedCustoms.equals(existingCustoms) == false) {
        existingCustoms.keySet().forEach(upgradedMetaData::removeCustom);
        for (Map.Entry<String, MetaData.Custom> upgradedCustomEntry : upgradedCustoms.entrySet()) {
            upgradedMetaData.putCustom(upgradedCustomEntry.getKey(), upgradedCustomEntry.getValue());
        }
        changed = true;
    }
    return changed ? upgradedMetaData.build() : metaData;
}
 
开发者ID:justor,项目名称:elasticsearch_my,代码行数:37,代码来源:GatewayMetaState.java

示例8: applyChanges

import org.elasticsearch.cluster.metadata.MetaData; //导入方法依赖的package包/类
/**
 * Updates the current {@link MetaData} based on the changes of this RoutingChangesObserver. Specifically
 * we update {@link IndexMetaData#getInSyncAllocationIds()} and {@link IndexMetaData#primaryTerm(int)} based on
 * the changes made during this allocation.
 *
 * @param oldMetaData {@link MetaData} object from before the routing nodes was changed.
 * @param newRoutingTable {@link RoutingTable} object after routing changes were applied.
 * @return adapted {@link MetaData}, potentially the original one if no change was needed.
 */
public MetaData applyChanges(MetaData oldMetaData, RoutingTable newRoutingTable) {
    Map<Index, List<Map.Entry<ShardId, Updates>>> changesGroupedByIndex =
        shardChanges.entrySet().stream().collect(Collectors.groupingBy(e -> e.getKey().getIndex()));

    MetaData.Builder metaDataBuilder = null;
    for (Map.Entry<Index, List<Map.Entry<ShardId, Updates>>> indexChanges : changesGroupedByIndex.entrySet()) {
        Index index = indexChanges.getKey();
        final IndexMetaData oldIndexMetaData = oldMetaData.getIndexSafe(index);
        IndexMetaData.Builder indexMetaDataBuilder = null;
        for (Map.Entry<ShardId, Updates> shardEntry : indexChanges.getValue()) {
            ShardId shardId = shardEntry.getKey();
            Updates updates = shardEntry.getValue();
            indexMetaDataBuilder = updateInSyncAllocations(newRoutingTable, oldIndexMetaData, indexMetaDataBuilder, shardId, updates);
            indexMetaDataBuilder = updatePrimaryTerm(oldIndexMetaData, indexMetaDataBuilder, shardId, updates);
        }

        if (indexMetaDataBuilder != null) {
            if (metaDataBuilder == null) {
                metaDataBuilder = MetaData.builder(oldMetaData);
            }
            metaDataBuilder.put(indexMetaDataBuilder);
        }
    }

    if (metaDataBuilder != null) {
        return metaDataBuilder.build();
    } else {
        return oldMetaData;
    }
}
 
开发者ID:justor,项目名称:elasticsearch_my,代码行数:40,代码来源:IndexMetaDataUpdater.java

示例9: testHandleNodeJoin_incompatibleClusterState

import org.elasticsearch.cluster.metadata.MetaData; //导入方法依赖的package包/类
public void testHandleNodeJoin_incompatibleClusterState() throws UnknownHostException {
    Settings nodeSettings = Settings.builder()
        .put("discovery.type", "zen") // <-- To override the local setting if set externally
        .build();
    String masterOnlyNode = internalCluster().startMasterOnlyNode(nodeSettings);
    String node1 = internalCluster().startNode(nodeSettings);
    ZenDiscovery zenDiscovery = (ZenDiscovery) internalCluster().getInstance(Discovery.class, masterOnlyNode);
    ClusterService clusterService = internalCluster().getInstance(ClusterService.class, node1);
    final ClusterState state = clusterService.state();
    MetaData.Builder mdBuilder = MetaData.builder(state.metaData());
    mdBuilder.putCustom(CustomMetaData.TYPE, new CustomMetaData("data"));
    ClusterState stateWithCustomMetaData = ClusterState.builder(state).metaData(mdBuilder).build();

    final AtomicReference<IllegalStateException> holder = new AtomicReference<>();
    DiscoveryNode node = state.nodes().getLocalNode();
    zenDiscovery.handleJoinRequest(node, stateWithCustomMetaData, new MembershipAction.JoinCallback() {
        @Override
        public void onSuccess() {
        }

        @Override
        public void onFailure(Exception e) {
            holder.set((IllegalStateException) e);
        }
    });

    assertThat(holder.get(), notNullValue());
    assertThat(holder.get().getMessage(), equalTo("failure when sending a validation request to node"));
}
 
开发者ID:justor,项目名称:elasticsearch_my,代码行数:30,代码来源:ZenDiscoveryIT.java

示例10: randomMeta

import org.elasticsearch.cluster.metadata.MetaData; //导入方法依赖的package包/类
private MetaData randomMeta() throws IOException {
    int numIndices = randomIntBetween(1, 10);
    MetaData.Builder mdBuilder = MetaData.builder();
    mdBuilder.generateClusterUuidIfNeeded();
    for (int i = 0; i < numIndices; i++) {
        mdBuilder.put(indexBuilder(randomAsciiOfLength(10) + "idx-"+i));
    }
    int numDelIndices = randomIntBetween(0, 5);
    final IndexGraveyard.Builder graveyard = IndexGraveyard.builder();
    for (int i = 0; i < numDelIndices; i++) {
        graveyard.addTombstone(new Index(randomAsciiOfLength(10) + "del-idx-" + i, UUIDs.randomBase64UUID()));
    }
    mdBuilder.indexGraveyard(graveyard.build());
    return mdBuilder.build();
}
 
开发者ID:justor,项目名称:elasticsearch_my,代码行数:16,代码来源:MetaDataStateFormatTests.java

示例11: randomMetaData

import org.elasticsearch.cluster.metadata.MetaData; //导入方法依赖的package包/类
private static MetaData randomMetaData(TestCustomMetaData... customMetaDatas) {
    MetaData.Builder builder = MetaData.builder();
    for (TestCustomMetaData customMetaData : customMetaDatas) {
        builder.putCustom(customMetaData.getWriteableName(), customMetaData);
    }
    for (int i = 0; i < randomIntBetween(1, 5); i++) {
        builder.put(
            IndexMetaData.builder(randomAsciiOfLength(10))
                .settings(settings(Version.CURRENT))
                .numberOfReplicas(randomIntBetween(0, 3))
                .numberOfShards(randomIntBetween(1, 5))
        );
    }
    return builder.build();
}
 
开发者ID:justor,项目名称:elasticsearch_my,代码行数:16,代码来源:GatewayMetaStateTests.java

示例12: initCluster

import org.elasticsearch.cluster.metadata.MetaData; //导入方法依赖的package包/类
private ClusterState initCluster(AllocationService strategy) {
    MetaData.Builder metaDataBuilder = MetaData.builder();
    RoutingTable.Builder routingTableBuilder = RoutingTable.builder();

    for (int i = 0; i < numberOfIndices; i++) {
        IndexMetaData.Builder index = IndexMetaData.builder("test" + i).settings(settings(Version.CURRENT)).numberOfShards(numberOfShards).numberOfReplicas(numberOfReplicas);
        metaDataBuilder = metaDataBuilder.put(index);
    }

    MetaData metaData = metaDataBuilder.build();

    for (ObjectCursor<IndexMetaData> cursor : metaData.indices().values()) {
        routingTableBuilder.addAsNew(cursor.value);
    }

    RoutingTable initialRoutingTable = routingTableBuilder.build();


    logger.info("start " + numberOfNodes + " nodes");
    DiscoveryNodes.Builder nodes = DiscoveryNodes.builder();
    for (int i = 0; i < numberOfNodes; i++) {
        nodes.add(newNode("node" + i));
    }
    ClusterState clusterState = ClusterState.builder(org.elasticsearch.cluster.ClusterName.CLUSTER_NAME_SETTING.getDefault(Settings.EMPTY)).nodes(nodes).metaData(metaData).routingTable(initialRoutingTable).build();
    clusterState = strategy.reroute(clusterState, "reroute");

    logger.info("restart all the primary shards, replicas will start initializing");
    RoutingNodes routingNodes = clusterState.getRoutingNodes();
    clusterState = strategy.applyStartedShards(clusterState, routingNodes.shardsWithState(INITIALIZING));

    logger.info("start the replica shards");
    routingNodes = clusterState.getRoutingNodes();
    clusterState = strategy.applyStartedShards(clusterState, routingNodes.shardsWithState(INITIALIZING));

    logger.info("complete rebalancing");
    return applyStartedShardsUntilNoChange(clusterState, strategy);
}
 
开发者ID:justor,项目名称:elasticsearch_my,代码行数:38,代码来源:BalanceConfigurationTests.java

示例13: initCluster

import org.elasticsearch.cluster.metadata.MetaData; //导入方法依赖的package包/类
private ClusterState initCluster(AllocationService service, int numberOfNodes, int numberOfIndices, int numberOfShards,
                                 int numberOfReplicas) {
    MetaData.Builder metaDataBuilder = MetaData.builder();
    RoutingTable.Builder routingTableBuilder = RoutingTable.builder();

    for (int i = 0; i < numberOfIndices; i++) {
        IndexMetaData.Builder index = IndexMetaData.builder("test" + i).settings(settings(Version.CURRENT)).numberOfShards(numberOfShards).numberOfReplicas(
                numberOfReplicas);
        metaDataBuilder = metaDataBuilder.put(index);
    }

    MetaData metaData = metaDataBuilder.build();

    for (ObjectCursor<IndexMetaData> cursor : metaData.indices().values()) {
        routingTableBuilder.addAsNew(cursor.value);
    }

    RoutingTable initialRoutingTable = routingTableBuilder.build();

    logger.info("start {} nodes", numberOfNodes);
    DiscoveryNodes.Builder nodes = DiscoveryNodes.builder();
    for (int i = 0; i < numberOfNodes; i++) {
        nodes.add(newNode("node" + i));
    }
    ClusterState clusterState = ClusterState.builder(org.elasticsearch.cluster.ClusterName.CLUSTER_NAME_SETTING.getDefault(Settings.EMPTY)).nodes(nodes).metaData(metaData).routingTable(initialRoutingTable).build();
    clusterState = service.reroute(clusterState, "reroute");

    logger.info("restart all the primary shards, replicas will start initializing");
    RoutingNodes routingNodes = clusterState.getRoutingNodes();
    clusterState = service.applyStartedShards(clusterState, routingNodes.shardsWithState(INITIALIZING));

    logger.info("start the replica shards");
    routingNodes = clusterState.getRoutingNodes();
    clusterState = service.applyStartedShards(clusterState, routingNodes.shardsWithState(INITIALIZING));
    routingNodes = clusterState.getRoutingNodes();

    logger.info("complete rebalancing");
    return applyStartedShardsUntilNoChange(clusterState, service);
}
 
开发者ID:justor,项目名称:elasticsearch_my,代码行数:40,代码来源:AddIncrementallyTests.java

示例14: createMetaData

import org.elasticsearch.cluster.metadata.MetaData; //导入方法依赖的package包/类
private static MetaData createMetaData(final List<Index> indices) {
    final MetaData.Builder builder = MetaData.builder();
    builder.clusterUUID(INITIAL_CLUSTER_ID);
    for (Index index : indices) {
        builder.put(createIndexMetadata(index), true);
    }
    return builder.build();
}
 
开发者ID:justor,项目名称:elasticsearch_my,代码行数:9,代码来源:ClusterChangedEventTests.java

示例15: testClusterHealth

import org.elasticsearch.cluster.metadata.MetaData; //导入方法依赖的package包/类
public void testClusterHealth() throws IOException {
    RoutingTableGenerator routingTableGenerator = new RoutingTableGenerator();
    RoutingTableGenerator.ShardCounter counter = new RoutingTableGenerator.ShardCounter();
    RoutingTable.Builder routingTable = RoutingTable.builder();
    MetaData.Builder metaData = MetaData.builder();
    for (int i = randomInt(4); i >= 0; i--) {
        int numberOfShards = randomInt(3) + 1;
        int numberOfReplicas = randomInt(4);
        IndexMetaData indexMetaData = IndexMetaData
                .builder("test_" + Integer.toString(i))
                .settings(settings(Version.CURRENT))
                .numberOfShards(numberOfShards)
                .numberOfReplicas(numberOfReplicas)
                .build();
        IndexRoutingTable indexRoutingTable = routingTableGenerator.genIndexRoutingTable(indexMetaData, counter);
        metaData.put(indexMetaData, true);
        routingTable.add(indexRoutingTable);
    }
    ClusterState clusterState = ClusterState.builder(ClusterName.CLUSTER_NAME_SETTING.getDefault(Settings.EMPTY))
                                            .metaData(metaData)
                                            .routingTable(routingTable.build())
                                            .build();
    String[] concreteIndices = indexNameExpressionResolver.concreteIndexNames(
        clusterState, IndicesOptions.strictExpand(), (String[]) null
    );
    ClusterStateHealth clusterStateHealth = new ClusterStateHealth(clusterState, concreteIndices);
    logger.info("cluster status: {}, expected {}", clusterStateHealth.getStatus(), counter.status());
    clusterStateHealth = maybeSerialize(clusterStateHealth);
    assertClusterHealth(clusterStateHealth, counter);
}
 
开发者ID:justor,项目名称:elasticsearch_my,代码行数:31,代码来源:ClusterStateHealthTests.java


注:本文中的org.elasticsearch.cluster.metadata.MetaData.builder方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。