Apicurio-studio: 协作时保存 Api 更改问题

创建于 2019-11-20  ·  13评论  ·  资料来源: Apicurio/apicurio-studio

两个开发者同时使用 apicurio studio 给非 Api 的创建者的开发者带来了保存问题。
api 的“非所有者”没有收到关于他的数据更改尚未存储在数据库中的消息。 刷新缓存后,所有更改都会丢失,并且会出现他作品的旧版本。
api 所有者没有这些问题。 他的更改将被存储。
作为非 api 所有者,我可以复制 api 并继续正常工作。 但是后来同事有记忆问题

@陷阱
@bodograumann

最有用的评论

嘿埃里克,

谢谢你的提示。 我们通过将 share-for-everyone 也设置到 -ws pods 来“修复”我们的问题。 我没有将其视为https://hub.docker.com/r/apicurio/apicurio-studio-ws上的一个选项

如果你愿意,我会清理 k8s-configs 并向你发送一个拉取请求。 我想我可以在下周初完成这项工作。

所有13条评论

这不好。 您使用的是什么版本的 Apicurio? 这是在云版本中发生还是在本地运行? 我最近发现并修复了这样的问题(但仅在使用SHARE_FOR_EVERYONE功能时),但是如果您使用的是最新版本或未使用该功能,那么这可能是一个新错误。

我们在 kubernetes 中运行了最新版本 0.243.final 并激活了 SHARE_FOR_EVERYONE。

感谢您这么快回复我们@EricWittmann。
奇怪的是,这些更改会显示在活动日志中,即使它们在重新加载后不是持久的。
希望@t-rap 可以尽快查看数据库。

嘿,

回复晚了非常抱歉:

我们正在使用您通过 docker hub 提供的 docker 镜像在 kubernetes 上运行 apicurio-studio。
所以
Apicurio-studio-ui、-ws、-api、-db(图片:percona:5.7)

当我们的开发人员使用它时,apicurio-studio-api 上的调试消息如下:

2019-11-20 15:12:05,053 DEBUG [io.apicurio.hub.core.storage.jdbc.JdbcStorage] (default task-66) Selecting the most recent api_content row of type 'document' for: 12 2019-11-20 15:12:05,056 DEBUG [io.apicurio.hub.core.storage.jdbc.JdbcStorage] (default task-66) Inserting an Editing Session UUID row: REDACTED 2019-11-20 15:12:05,070 DEBUG [io.apicurio.hub.api.rest.impl.DesignsResource] (default task-66) Created Session ID: REDACTED 2019-11-20 15:12:05,070 DEBUG [io.apicurio.hub.api.rest.impl.DesignsResource] (default task-66) Secret: REDACTED 2019-11-20 15:12:14,973 DEBUG [io.apicurio.hub.api.rest.impl.DesignsResource] (default task-66) Retrieving contributors list for design with ID: 12 2019-11-20 15:12:14,973 DEBUG [io.apicurio.hub.core.storage.jdbc.JdbcStorage] (default task-66) Selecting all contributors for API Design: 12 2019-11-20 15:12:14,973 DEBUG [io.apicurio.studio.shared.config.Configuration] (default task-65) Config Property: APICURIO_SHARE_FOR_EVERYONE/apicurio.share.for.everyone = true 2019-11-20 15:12:14,973 DEBUG [io.apicurio.hub.core.storage.jdbc.JdbcStorage] (default task-65) Selecting activity for API Design: 12 from 0 to 10 2019-11-20 15:12:14,983 DEBUG [io.apicurio.hub.core.storage.jdbc.JdbcStorage] (default task-64) Selecting mock activity for API Design: 12 from 0 to 20 2019-11-20 15:12:14,997 DEBUG [io.apicurio.hub.api.rest.impl.DesignsResource] (default task-67) Getting an API design with ID 12 2019-11-20 15:12:14,997 DEBUG [io.apicurio.hub.core.storage.jdbc.JdbcStorage] (default task-67) Selecting a single API Design: 12 2019-11-20 15:12:17,810 DEBUG [io.apicurio.hub.api.rest.impl.DesignsResource] (default task-67) Getting an API design with ID 12 2019-11-20 15:12:17,810 DEBUG [io.apicurio.hub.core.storage.jdbc.JdbcStorage] (default task-67) Selecting a single API Design: 12 2019-11-20 15:12:17,860 DEBUG [io.apicurio.hub.api.rest.impl.DesignsResource] (default task-67) Editing an API Design with ID 12 2019-11-20 15:12:17,860 DEBUG [io.apicurio.hub.api.rest.impl.DesignsResource] (default task-67) USER: REDACTED 2019-11-20 15:12:17,860 DEBUG [io.apicurio.hub.core.storage.jdbc.JdbcStorage] (default task-67) Selecting the most recent api_content row of type 'document' for: 12 2019-11-20 15:12:17,862 DEBUG [io.apicurio.hub.core.storage.jdbc.JdbcStorage] (default task-67) Inserting an Editing Session UUID row: REDACTED 2019-11-20 15:12:17,875 DEBUG [io.apicurio.hub.api.rest.impl.DesignsResource] (default task-67) Created Session ID: REDACTED 2019-11-20 15:12:17,875 DEBUG [io.apicurio.hub.api.rest.impl.DesignsResource] (default task-67) Secret: REDACTED

对于 apicurio-studio-ws 给出:

2019-11-20 15:14:31,640 DEBUG [io.apicurio.hub.core.editing.ops.processors.CommandProcessor] (default task-3) user: REDACTED 2019-11-20 15:14:31,640 DEBUG [io.apicurio.hub.core.storage.jdbc.JdbcStorage] (default task-3) Inserting a 'command' content row for: 12 2019-11-20 15:14:31,659 DEBUG [io.apicurio.hub.core.editing.ops.processors.CommandProcessor] (default task-3) ACK sent back to client. 2019-11-20 15:14:31,659 DEBUG [io.apicurio.hub.core.editing.ops.processors.CommandProcessor] (default task-3) Command propagated to 'other' clients. 2019-11-20 15:14:33,145 DEBUG [io.apicurio.hub.core.editing.ops.processors.OperationProcessorDispatcher] (default task-3) Received a "ping" message/operation from a client for API Design: 12 2019-11-20 15:14:44,989 DEBUG [io.apicurio.hub.core.editing.ops.processors.OperationProcessorDispatcher] (default task-3) Received a "ping" message/operation from a client for API Design: 15 2019-11-20 15:14:46,691 DEBUG [io.apicurio.hub.editing.EditApiDesignEndpoint] (default task-3) Closing a WebSocket due to: 2019-11-20 15:14:46,692 DEBUG [io.apicurio.hub.editing.EditApiDesignEndpoint] (default task-3) designId: 12

所以这绝对是我最近修复的错误 - 有可能我在最近的版本之后修复了它。 让我检查一下,然后在这里回复您。

好的,我已经确认我对这个问题的修复是在最新版本之后完成的。 所以你有两个选择来解决这个问题:

1)等待下一个版本
2) 从 master 构建最新版本并运行它

选项 (2) 可能比您想象的更易于访问,但显然仍然不适合您。 我可能会在本周末再发布一次。 添加了几个实验性功能,我需要在触发发布之前禁用(或至少在 UI 中标记为这样)。

我现在正在启动一个新版本 - 将包含此问题的修复程序。 标记为已关闭,因此它包含在发行说明中。 :)

嗨,埃里克,

问题似乎仍然存在,但现在抛出异常。 我不确定这是否是我们的错。 你有什么提示我可以更深入地研究它吗?

```2019-11-22 10:16:14,057 错误 [io.apicurio.hub.core.storage.jdbc.JdbcStorage](默认任务-1)获取最新内容文档时出错:java.lang.IllegalStateException:需要一个元素,但没有发现
在 org.jdbi.v3.core.result.ResultIterable.one(ResultIterable.java:135)
在 io.apicurio.hub.core.storage.jdbc.JdbcStorage.lambda$getLatestContentDocument$23(JdbcStorage.java:655)
在 org.jdbi.v3.core.Jdbi.withHandle(Jdbi.java:341)
在 io.apicurio.hub.core.storage.jdbc.JdbcStorage.getLatestContentDocument(JdbcStorage.java:648)
在 io.apicurio.hub.core.storage.jdbc.JdbcStorage$Proxy$_$$_WeldClientProxy.getLatestContentDocument(来源不明)
在 io.apicurio.hub.core.storage.RollupExecutor.rollupCommands(RollupExecutor.java:56)
在 io.apicurio.hub.core.storage.RollupExecutor.rollupCommands(RollupExecutor.java:108)
在 io.apicurio.hub.core.storage.RollupExecutor$Proxy$_$$_WeldClientProxy.rollupCommands(来源不明)
在 io.apicurio.hub.core.editing.EditingSession.close(EditingSession.java:131)
在 io.apicurio.hub.core.editing.EditingSessionManager.closeEditingSession(EditingSessionManager.java:116)
在 io.apicurio.hub.core.editing.EditingSessionManager$Proxy$_$$_WeldClientProxy.closeEditingSession(来源不明)
在 io.apicurio.hub.editing.EditApiDesignEndpoint.onCloseSession(EditApiDesignEndpoint.java:215)
在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在 java.lang.reflect.Method.invoke(Method.java:498)
在 io.undertow.websockets.jsr.annotated.BoundMethod.invoke(BoundMethod.java:87)
在 io.undertow.websockets.jsr.annotated.AnnotatedEndpoint$4.run(AnnotatedEndpoint.java:201)
在 io.undertow.websockets.jsr.ServerWebSocketContainer$1.call(ServerWebSocketContainer.java:169)
在 io.undertow.websockets.jsr.ServerWebSocketContainer$1.call(ServerWebSocketContainer.java:166)
在 io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
在 org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
在 org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
在 org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
在 org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
在 org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
在 io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:603)
在 io.undertow.websockets.jsr.ServerWebSocketContainer$6.run(ServerWebSocketContainer.java:589)
在 io.undertow.websockets.jsr.OrderedExecutor$ExecutorTask.run(OrderedExecutor.java:67)
在 org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
在 org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
在 org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
在 org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)
在 java.lang.Thread.run(Thread.java:748)

2019-11-22 10:16:14,057 错误 [io.apicurio.hub.core.editing.EditingSession](默认任务-1)检测到关闭编辑会话时出错。:io.apicurio.hub.core.exceptions.NotFoundException
在 io.apicurio.hub.core.storage.jdbc.JdbcStorage.getLatestContentDocument(JdbcStorage.java:659)
在 io.apicurio.hub.core.storage.jdbc.JdbcStorage$Proxy$_$$_WeldClientProxy.getLatestContentDocument(来源不明)
在 io.apicurio.hub.core.storage.RollupExecutor.rollupCommands(RollupExecutor.java:56)
在 io.apicurio.hub.core.storage.RollupExecutor.rollupCommands(RollupExecutor.java:108)
在 io.apicurio.hub.core.storage.RollupExecutor$Proxy$_$$_WeldClientProxy.rollupCommands(来源不明)
在 io.apicurio.hub.core.editing.EditingSession.close(EditingSession.java:131)
在 io.apicurio.hub.core.editing.EditingSessionManager.closeEditingSession(EditingSessionManager.java:116)
在 io.apicurio.hub.core.editing.EditingSessionManager$Proxy$_$$_WeldClientProxy.closeEditingSession(来源不明)
在 io.apicurio.hub.editing.EditApiDesignEndpoint.onCloseSession(EditApiDesignEndpoint.java:215)
在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在 java.lang.reflect.Method.invoke(Method.java:498)
在 io.undertow.websockets.jsr.annotated.BoundMethod.invoke(BoundMethod.java:87)
在 io.undertow.websockets.jsr.annotated.AnnotatedEndpoint$4.run(AnnotatedEndpoint.java:201)
在 io.undertow.websockets.jsr.ServerWebSocketContainer$1.call(ServerWebSocketContainer.java:169)
在 io.undertow.websockets.jsr.ServerWebSocketContainer$1.call(ServerWebSocketContainer.java:166)
在 io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
在 org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
在 org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
在 org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
在 org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
在 org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
在 io.undertow.websockets.jsr.ServerWebSocketContainer.invokeEndpointMethod(ServerWebSocketContainer.java:603)
在 io.undertow.websockets.jsr.ServerWebSocketContainer$6.run(ServerWebSocketContainer.java:589)
在 io.undertow.websockets.jsr.OrderedExecutor$ExecutorTask.run(OrderedExecutor.java:67)
在 org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
在 org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
在 org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
在 org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)
在 java.lang.Thread.run(Thread.java:748)```

如果不存在错误修复,我很确定这正是我所期望的错误。 让我挖掘一些代码链接...

好的,我只是检查了一下,以免浪费您的时间,但这似乎是最终版本:

版本 | 0.2.44.决赛
-- | ——
建于 | 2019 年 11 月 21 日
版 | CLIv7
项目网址 | http://www.apicur.io/

我们测试了已经存在的旧 API,创建了新 API 并进行了测试,我们使用不同的帐户进行了尝试。

好,谢谢。 因此,堆栈跟踪发生的情况是,每当 API 的所有编辑器都完成编辑(离开/关闭编辑器)时,服务器将尝试将所有更改汇总到文档快照中。 这是由此处的汇总执行程序完成的:

https://github.com/Apicurio/apicurio-studio/blob/master/back-end/hub-core/src/main/java/io/apicurio/hub/core/storage/RollupExecutor.java

它试图这样做:

1)获取LAST文档快照
2) 获取此后所有更改(命令)的列表
3) 将所有更改/命令应用于最后一个文档快照
4) 将新快照存储回数据库

它在第 1 步失败,因为它找不到以前的快照。 这应该是不可能的,因为在首次创建 API 设计时会创建快照。 但是,这可能是因为为 -api Apicurio 组件启用了“为所有人共享”选项,但没有为 -ws Apicurio 组件启用。 因此,原始快照存在于表中,但由用户 A 创建,因此当用户 B 尝试进行汇总(并且已禁用所有人共享)时,在查找快照时会执行错误的 SQL,但未找到。 因此,由于仅在 -ws apicurio 组件中对所有人共享功能进行了错误配置,此代码可能无法正常工作:

https://github.com/Apicurio/apicurio-studio/blob/master/back-end/hub-core/src/main/java/io/apicurio/hub/core/storage/jdbc/JdbcStorage.java#L650 - L655

如果在 -api 中启用了所有人共享,但在 -ws 中未启用,则会发生这种情况。

我需要看看你的 kubernetes 设置(旁注:你有没有机会贡献它?)但我猜如果你基于 docker compose 配置,你就错过了分享给所有人-ws 组件上的配置选项。 以下是此问题的关键修复之一:

https://github.com/Apicurio/apicurio-studio/commit/7f4994bc907e1720ffd6f8ff81e844c032edbf79#diff -b1ff2c3381198f745ae9dc8add793d61

嘿埃里克,

谢谢你的提示。 我们通过将 share-for-everyone 也设置到 -ws pods 来“修复”我们的问题。 我没有将其视为https://hub.docker.com/r/apicurio/apicurio-studio-ws上的一个选项

如果你愿意,我会清理 k8s-configs 并向你发送一个拉取请求。 我想我可以在下周初完成这项工作。

伟大的! 我将更新该图像的文档以包含该选项。 不急于 k8s 配置,但非常欢迎贡献。

此页面是否有帮助?
0 / 5 - 0 等级