Hello Everybody,
I just want to raise awareness regarding a couple of recent changes to the content system.
These details are important for plugin developers that use the content system. If you are
working on a server or agent plugin that interacts with the content system I would highly
recommend to read this email carefully. Most likely the changes I will detail in this
email do not impact existing plugins but I highly recommend a review of existing code to
make sure it works as intended and as expected.
The content system stores data in a myriad of tables. The PackageVersion table is the most
important because it links package metadata with actual content. Internal RHQ server
queries use the version field of this table to uniquely identify a package. The content
system can store multiple packages with the same name, but they are uniquely identified by
the version. So [ROOT.war version=1.1] is stored only once in the database irrespective if
the actual war content is different. Just to give an example, ROOT.war is deployed by
default on both JBoss AS4 and JBoss AS5 and discovered by both plugins as [ROOT.war
version=0]. The first server that gets inventoried wins the battle to store its ROOT.war
content on the RHQ server. When a second application server is inventoried, the RHQ server
considers that [ROOT.war version=0] is already stored and does not act on the agent
request to store content. These details combined with some agent discovery issues resulted
in a set of problems for deploying and retrieving content deployed.
The solution that I proposed and implemented preserves existing server code for the
content system. The updates were done to the CLI, UI, three agent plugins (Tomcat, JBoss
AS4, JBoss AS5), and four server plugins (remote repository syncing) to populate the
version field with something that uniquely identifies that actual content. So, the version
field is populated with the SHA256 of the content. After this changes the package
[ROOT.war version=[sha256=abcd1234] ] is correctly identified based on its content and not
on some arbitrary version. The old version concept was then made optional (in the UI and
CLI) and stored in display version field, which was in the design but not used. After
these changes a package version data will look like this: [ROOT.war
version=[sha256=abcde123] display version=1.1].
Just to recap, your plugin will most likely work the same even after this set of changes.
I highly encourage anybody to review their code that interacts with the content system to
make sure it does not have the same version problems. Another recommendation would be to
update existing code to use SHA256 for version and move the existing version concept to
the display version field.
Please feel free to contact me if you have any questions or concerns.
Thank you,
Stefan Negrea
Software Engineer
Show replies by date