【问题标题】:How can I safely use an Eclipse p2 profile?如何安全地使用 Eclipse p2 配置文件?
【发布时间】:2011-09-16 20:08:13
【问题描述】:

我在启动 Eclipse 时尝试更新 Eclipse 插件时遇到一些问题。我的程序在 Eclipse 启动时会在Help -> Check for Updates 处弹出对话框。但是,当用户快速进行更新时,Eclipse 会抛出一个异常,指出 p2 配置文件正在使用中。我相信这是因为其他 Eclipse 作业在启动时使用 p2 配置文件,因此我的程序无法使用 p2 配置文件来更新插件。如何安全地使用 p2 配置文件?如何单独使用 p2 配置文件?

我已经上传了在github 上重现问题所需的最少代码段。而且,我已经在an issue on the github repository 中详细描述了问题和重现问题的步骤。

【问题讨论】:

    标签: eclipse eclipse-rcp eclipse-plugin pde p2


    【解决方案1】:

    您可以从您的UpdateOperation 获得ProvisioningJob,让它属于运行配置文件更改工作的家庭。见org.eclipse.core.runtime.jobs.Job.belongsTo(Object)

    除了我有两个想法可以通过使用内部 API 来实现之外,

    1. 尝试测试锁定配置文件以查看它是否被更改。 org.eclipse.equinox.internal.p2.engine.SimpleProfileRegistry.lockProfile(Profile)
    2. 之前运行您的类似操作,但捕获 IlegalStateException,然后在 IProvisioningEventBus 上注册一个 ProvisioningListener,以便在运行 profilechange 操作完成时收到通知。

    【讨论】:

    • @Kane:明确锁定和解锁配置文件似乎很简单。但是,它需要使用内部 API,这是不鼓励的。您建议从 UpdateOperation 获取 ProvisioningJob 并确保它属于运行配置文件更改作业的系列。但是,我怎样才能找到正在运行的配置文件更改工作的家庭?
    • 我觉得你可以在 SimpleProfileRegistry.lockProfile 的方法中添加断点,看看是哪个作业在锁定配置文件。
    • 唯一实现Job.belongsToProvisioningJobLoadMetadataRepositoryJob。因此,我们不能使用职位族来强制对个人资料进行独占访问。
    • 添加断点并不容易,因为要测试我的插件,我必须创建一个新的更新站点并安装两次。我可以修改 Eclipse 插件并创建功能补丁。但是,我宁愿不要为了调试我的插件而创建功能补丁。
    • 收听IProvisioningEventBus 以在某些正在运行的作业完成时得到通知并不能保证互斥,因为另一个作业可能会在所有现有作业完成后立即开始。这会导致 TOCTTOU (en.wikipedia.org/wiki/Time-of-check-to-time-of-use) 错误。
    【解决方案2】:

    My commit 通过调用命令“org.eclipse.equinox.p2.ui.sdk.update”而不是调用以下方法打开“检查更新”对话框。

    org.eclipse.equinox.p2.ui.ProvisioningUI.openUpdateWizard(boolean, UpdateOperation, LoadMetadataRepositoryJob)

    令人惊讶的是,此更改似乎解决了访问 p2 配置文件时的竞争条件问题。有人对我的提交如何消除竞争条件有解释吗?

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 2015-09-25
      • 2019-04-15
      • 2021-01-12
      • 2010-09-13
      • 1970-01-01
      相关资源
      最近更新 更多