博客
关于我
elasticsearch 源码简单分析之【tmp目录】
阅读量:331 次
发布时间:2019-03-04

本文共 7477 字,大约阅读时间需要 24 分钟。

环境

服务器:centos6

elasticsearch: 6.0.0
工具:CRT
操作系统:win7

疑惑

[yutao@master01 elasticsearch-6.0.0]$ bin/elasticsearch-plugin install file:///home/yutao/download/x-pack-6.0.0.zip -> Downloading file:///home/yutao/download/x-pack-6.0.0.zipException in thread "main" java.nio.file.AccessDeniedException: /tmp/2089611009639660923.zip        at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)        at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)        at java.nio.file.Files.newByteChannel(Files.java:361)        at java.nio.file.Files.createFile(Files.java:632)        at java.nio.file.TempFileHelper.create(TempFileHelper.java:138)        at java.nio.file.TempFileHelper.createTempFile(TempFileHelper.java:161)        at java.nio.file.Files.createTempFile(Files.java:852)        at org.elasticsearch.plugins.InstallPluginCommand.downloadZip(InstallPluginCommand.java:322)        at org.elasticsearch.plugins.InstallPluginCommand.download(InstallPluginCommand.java:245)        at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:213)        at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:204)        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:69)        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:134)        at org.elasticsearch.cli.MultiCommand.execute(MultiCommand.java:69)        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:134)        at org.elasticsearch.cli.Command.main(Command.java:90)        at org.elasticsearch.plugins.PluginCli.main(PluginCli.java:47)

这个错误,在上一篇博客中也提到过,就是因为我使用yutao用户安装时,没有目录tmp的权限。而我想这个目录它为什么要用到?我能不能通过配置文件来进行配置?

查看源码

带着这样的疑惑,我开始查看源码:

// 从这句看出,其调用的是org.elasticsearch.plugins包下的PluginCli类的main方法org.elasticsearch.plugins.PluginCli.main(PluginCli.java:47)// 和上面同理 org.elasticsearch.plugins.InstallPluginCommand.download(InstallPluginCommand.java:245)

InstallPluginCommand类路径elasticsearch-6.0.0.zip\elasticsearch-6.0.0\lib\plugin-cli-6.0.0.jar\org\elasticsearch\plugins\InstallPluginCommand.class

protected void execute(final Terminal terminal, final OptionSet options, final Environment env) throws Exception {        final String pluginId = (String)this.arguments.value(options);        final boolean isBatch = options.has((OptionSpec)this.batchOption) || System.console() == null;        this.execute(terminal, pluginId, isBatch, env);    }    void execute(final Terminal terminal, final String pluginId, final boolean isBatch, final Environment env) throws Exception {        if (pluginId == null) {            throw new UserException(64, "plugin id is required");        }        final Path pluginZip = this.download(terminal, pluginId, env.tmpFile());        final Path extractedZip = this.unzip(pluginZip, env.pluginsFile());        this.install(terminal, isBatch, extractedZip, env);    }

再看到其中的download方法,其有个参数env.tmpFile();而这个方法是这个Environment类中的。

路径:elasticsearch-6.0.0.jar\org\elasticsearch\env\Environment.class

public Environment(final Settings settings, final Path configPath) {       // 重点就是这句        this.tmpFile = PathUtils.get(System.getProperty("java.io.tmpdir"), new String[0]);        if (Environment.PATH_HOME_SETTING.exists(settings)) {            final Path homeFile = PathUtils.get((String)Environment.PATH_HOME_SETTING.get(settings), new String[0]).normalize();            if (configPath != null) {                this.configFile = configPath.normalize();            }            else {                this.configFile = homeFile.resolve("config");            }            this.pluginsFile = homeFile.resolve("plugins");            final List
dataPaths = (List
)Environment.PATH_DATA_SETTING.get(settings); final ClusterName clusterName = (ClusterName)ClusterName.CLUSTER_NAME_SETTING.get(settings); if (!dataPaths.isEmpty()) { this.dataFiles = new Path[dataPaths.size()]; this.dataWithClusterFiles = new Path[dataPaths.size()]; for (int i = 0; i < dataPaths.size(); ++i) { this.dataFiles[i] = PathUtils.get((String)dataPaths.get(i), new String[0]); this.dataWithClusterFiles[i] = this.dataFiles[i].resolve(clusterName.value()); } } else { this.dataFiles = new Path[] { homeFile.resolve("data") }; this.dataWithClusterFiles = new Path[] { homeFile.resolve("data").resolve(clusterName.value()) }; } if (Environment.PATH_SHARED_DATA_SETTING.exists(settings)) { this.sharedDataFile = PathUtils.get((String)Environment.PATH_SHARED_DATA_SETTING.get(settings), new String[0]).normalize(); } else { this.sharedDataFile = null; } final List
repoPaths = (List
)Environment.PATH_REPO_SETTING.get(settings); if (!repoPaths.isEmpty()) { this.repoFiles = new Path[repoPaths.size()]; for (int j = 0; j < repoPaths.size(); ++j) { this.repoFiles[j] = PathUtils.get((String)repoPaths.get(j), new String[0]); } } else { this.repoFiles = new Path[0]; } if (Environment.PATH_LOGS_SETTING.exists(settings)) { this.logsFile = PathUtils.get((String)Environment.PATH_LOGS_SETTING.get(settings), new String[0]).normalize(); } else { this.logsFile = homeFile.resolve("logs"); } if (Environment.PIDFILE_SETTING.exists(settings)) { this.pidFile = PathUtils.get((String)Environment.PIDFILE_SETTING.get(settings), new String[0]).normalize(); } else { this.pidFile = null; } this.binFile = homeFile.resolve("bin"); this.libFile = homeFile.resolve("lib"); this.modulesFile = homeFile.resolve("modules"); final Settings.Builder finalSettings = Settings.builder().put(settings); finalSettings.put(new Object[] { Environment.PATH_HOME_SETTING.getKey(), homeFile }); if (Environment.PATH_DATA_SETTING.exists(settings)) { finalSettings.putArray(Environment.PATH_DATA_SETTING.getKey(), (List)dataPaths); } finalSettings.put(new Object[] { Environment.PATH_LOGS_SETTING.getKey(), this.logsFile }); this.settings = finalSettings.build(); return; } throw new IllegalStateException(Environment.PATH_HOME_SETTING.getKey() + " is not configured"); }

我们重点看看这句:

this.tmpFile = PathUtils.get(System.getProperty("java.io.tmpdir"), new String[0]);

很明显,通过jdk提供的方法,获取到了,当前操作系统的临时文件tmp

看到这里也就说明,不能通过配置文件的方式来修改,毕竟源码写死啦!

不过我又对上面代码中的第二个参数new String[0],产生了兴趣,虽然弄到了凌晨1点,但是还是坚持多看了几眼。

为什么要传一个字符串数组呢?还是一个大小为0的!

从源码角度来看,这个参数是选参,可传可不传;

PathUtils类的源码:

public static Path get(final String first, final String... more) {        return PathUtils.DEFAULT.getPath(first, more);    }

而其中getPath又是jdk里的方法:

// 类 FileSystem public abstract Path getPath(String first, String... more);

在往下就是java底层如何去获取文件的路径啦!我就不分析啦!

那它需要这目录干什么呢?

从源码中看出,其下载的x-pack.jar,视乎会临时存放在这个目录,进行压缩成zip文件。

转载地址:http://xdfh.baihongyu.com/

你可能感兴趣的文章
mysql 快照读 幻读_innodb当前读 与 快照读 and rr级别是否真正避免了幻读
查看>>
MySQL 快速创建千万级测试数据
查看>>
mysql 快速自增假数据, 新增假数据,mysql自增假数据
查看>>
MySql 手动执行主从备份
查看>>
Mysql 批量修改四种方式效率对比(一)
查看>>
Mysql 报错 Field 'id' doesn't have a default value
查看>>
MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
查看>>
Mysql 拼接多个字段作为查询条件查询方法
查看>>
mysql 排序id_mysql如何按特定id排序
查看>>
Mysql 提示:Communication link failure
查看>>
mysql 插入是否成功_PDO mysql:如何知道插入是否成功
查看>>
Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
查看>>
mysql 数据库中 count(*),count(1),count(列名)区别和效率问题
查看>>
mysql 数据库备份及ibdata1的瘦身
查看>>
MySQL 数据库备份种类以及常用备份工具汇总
查看>>
mysql 数据库存储引擎怎么选择?快来看看性能测试吧
查看>>
MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作
查看>>
MySQL 数据库的高可用性分析
查看>>
MySQL 数据库设计总结
查看>>
Mysql 数据库重置ID排序
查看>>