Unable to edit a page within Confluence caused by "No implementation of method: :root-editor" Synchrony message
Platform Notice: Data Center - This article applies to Atlassian products on the Data Center platform.
Note that this knowledge base article was created for the Data Center version of the product. Data Center knowledge base articles for non-Data Center-specific features may also work for Server versions of the product, however they have not been tested. Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.
*Except Fisheye and Crucible
Summary
When attempting to edit a page, Confluence displays the following message which prevents the page from being edited:
"This page is taking longer to load than usual. Give it a few moments, then try refreshing. Still having issues? Contact your Confluence admin."
Diagnosis
If a HAR file is recorded while trying to edit the page, a request like the following will return an HTTP 500 error:
https://mycompany.com/synchrony-proxy/v1/data/Synchrony-b109fcb5-968a-3c6b-861f-c6b23f73947e/confluence-37226019?state-at=@head&state-format=type-tagged&rewrite-request=true&cached=true
While the atlassian-confluence.log file will show no corresponding error message, the Synchrony logs will. Here, we see an example of this:
2020-11-12 09:40:53,201 DEBUG [2086:StdOutHandler [/opt/atlassian/confluence/jre/bin/java]] {"synchrony":{"message":"synchrony.http.entity-api [warn] Error in get-entity","entity":"/Synchrony-b109fcb5-968a-3c6b-861f-c6b23f73947e/confluence-37226019","id":"TPfHnNg7ksUI3BPrLoddUA","ns":"synchrony.http.entity-api","throwable":"java.lang.IllegalArgumentException: No implementation of method: :root-editor of protocol: #'synchrony.operation.materialize-impl/RootEditor found for class: nil\n\tat clojure.core$_cache_protocol_fn.invokeStatic(core_deftype.clj:583)\n\tat synchrony.operation.materialize_impl$fn__26917$G__26912__26922.invoke(materialize_impl.cljc:10)\n\tat synchrony.operation.materialize_impl.VecEditor.vec_subeditor(materialize_impl.cljc:326)\n\tat synchrony.operation.materialize_impl$edit_vec_step.invokeStatic(materialize_impl.cljc:245)\n\tat synchrony.operation.materialize_impl$edit_vec$fn__27146.invoke(materialize_impl.cljc:305)\n\tat clojure.lang.PersistentVector.reduce(PersistentVector.java:341)\n\tat clojure.core$reduce.invokeStatic(core.clj:6703)\n\tat synchrony.operation.materialize_impl$edit_vec.invokeStatic(materialize_impl.cljc:304)\n\tat synchrony.operation.materialize_impl$materialize.invokeStatic(materialize_impl.cljc:319)\n\tat synchrony.operation.materialize$fn__31035.invokeStatic(materialize.cljc:14)\n\tat clojure.lang.MultiFn.invoke(MultiFn.java:233)\n\tat synchrony.data$regenerate_snapshots_BANG_$fn__38911.invoke(data.clj:296)\n\tat synchrony.data.(take?)(data.clj:333)\n\tat synchrony.data$repair_snapshots_BANG_$fn__39087.invoke(data.clj:332)\n\tat synchrony.data.(take?)(data.clj:342)\n\tat synchrony.data$get_snapshots_BANG_$fn__39143.invoke(data.clj:339)\n\tat synchrony.data.(take?)(data.clj:584)\n\tat synchrony.data$get_snapshots_and_tree_given_part_BANG_$fn__40456.invoke(data.clj:577)\n\tat synchrony.data.(take?)(data.clj:626)\n\tat synchrony.data$get_entity_at_master_head_BANG_$fn__40613.invoke(data.clj:621)\n\tat synchrony.data.(take?)(data.clj:635)\n\tat synchrony.data$get_entity_at_master_head_updating_cache_BANG_$fn__40671.invoke(data.clj:634)\n\tat synchrony.data.(take?)(data.clj:664)\n\tat synchrony.data$get_entity_at_master_head_caching_BANG_$fn__40735.invoke(data.clj:644)\n\tat synchrony.http.entity-api.(take?)(entity_api.clj:281)\n\tat synchrony.http.entity_api$get_state$fn__48044.invoke(entity_api.clj:269)\n\tat synchrony.http.entity-api.(take?)(entity_api.clj:332)\n\tat synchrony.http.entity_api$get_entity$fn__48173.invoke(entity_api.clj:328)\n\tat synchrony.http.entity-api.(take?)(entity_api.clj:589)\n\tat synchrony.http.entity_api$get_entity_handler$fn__48858.invoke(entity_api.clj:565)\n\tat clojure.lang.AFn.run(AFn.java:22)\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n\tat java.lang.Thread.run(Thread.java:748)\n","level":"warn"}}
Of particular interest is the message:
java.lang.IllegalArgumentException: No implementation of method: :root-editor of protocol: #'synchrony.operation.materialize-impl/RootEditor found for class: nil
This particular message indicates a failure centering around the materialization of the page's content from Synchrony, most likely a data corruption within the backend Synchrony tables. Typically, this kind of error affects individual pages.
Cause
As of the creation of this article, the cause of the problem is unknown.
Solution
To fix this kind of problem, we'll need to recreate the page's content as a new page:
- First, if you don't already have the free Atlassian developed Source Editor plugin, download and install this plugin.
- Next, create a new page in the same space as the page that can't be edited and save it.
- Then, while viewing the page that can't be edited, select ... -> View Storage Format and copy the content from the resulting pop up box to the clipboard.
- Now, edit the new page that you just created.
- In edit mode, click <> to invoke the Source Editor plugin.
- Finally, paste the content from the clipboard into the resulting pop up box and save both this and the page.