[
https://issues.apache.org/jira/browse/AMQ-7067?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16643377#comment-16643377
]
Jamie goodyear commented on AMQ-7067:
-------------------------------------
The following test case can be inserted into the AMQ7067Test file:
[https://gist.github.com/jgoodyear/f3c716aec99c066894047ed996cdcdc9]
Its a non-completing test, it just allows us to setup the scenario, load up a
lot of db page files, than let compaction occur.
In my IDEA environment i can watch the data folder populate:
{code:java}
icbts-2:activemq-unit-tests icbts$ ls target/data/kahadb/
db-1.log db-115.log db-131.log db-148.log db-164.log
db-180.log db-197.log db-212.log db-229.log db-245.log
db-261.log db-278.log db-4.log db-56.log db-72.log
db-89.log
db-10.log db-116.log db-132.log db-149.log db-165.log
db-181.log db-198.log db-213.log db-23.log db-246.log
db-262.log db-279.log db-40.log db-57.log db-73.log
db-9.log
db-100.log db-117.log db-133.log db-15.log db-166.log
db-182.log db-199.log db-214.log db-230.log db-247.log
db-263.log db-28.log db-41.log db-58.log db-74.log
db-90.log
db-101.log db-118.log db-134.log db-150.log db-167.log
db-183.log db-2.log db-215.log db-231.log db-248.log
db-264.log db-280.log db-42.log db-59.log db-75.log
db-91.log
db-102.log db-119.log db-135.log db-151.log db-168.log
db-184.log db-20.log db-216.log db-232.log db-249.log
db-265.log db-281.log db-43.log db-6.log db-76.log
db-92.log
db-103.log db-12.log db-136.log db-152.log db-169.log
db-185.log db-200.log db-217.log db-233.log db-25.log
db-266.log db-282.log db-44.log db-60.log db-77.log
db-93.log
db-104.log db-120.log db-137.log db-153.log db-17.log
db-186.log db-201.log db-218.log db-234.log db-250.log
db-267.log db-29.log db-45.log db-61.log db-78.log
db-94.log
db-105.log db-121.log db-138.log db-154.log db-170.log
db-187.log db-202.log db-219.log db-235.log db-251.log
db-268.log db-3.log db-46.log db-62.log db-79.log
db-95.log
db-106.log db-122.log db-139.log db-155.log db-171.log
db-188.log db-203.log db-22.log db-236.log db-252.log
db-269.log db-30.log db-47.log db-63.log db-8.log
db-96.log
db-107.log db-123.log db-14.log db-156.log db-172.log
db-189.log db-204.log db-220.log db-237.log db-253.log
db-27.log db-31.log db-48.log db-64.log db-80.log
db-97.log
db-108.log db-124.log db-140.log db-157.log db-173.log
db-19.log db-205.log db-221.log db-238.log db-254.log
db-270.log db-32.log db-49.log db-65.log db-81.log
db-98.log
db-109.log db-125.log db-141.log db-158.log db-174.log
db-190.log db-206.log db-222.log db-239.log db-255.log
db-271.log db-33.log db-5.log db-66.log db-82.log
db-99.log
db-11.log db-126.log db-142.log db-159.log db-175.log
db-191.log db-207.log db-223.log db-24.log db-256.log
db-272.log db-34.log db-50.log db-67.log db-83.log
db.data
db-110.log db-127.log db-143.log db-16.log db-176.log
db-192.log db-208.log db-224.log db-240.log db-257.log
db-273.log db-35.log db-51.log db-68.log db-84.log
db.redo
db-111.log db-128.log db-144.log db-160.log db-177.log
db-193.log db-209.log db-225.log db-241.log db-258.log
db-274.log db-36.log db-52.log db-69.log db-85.log
lock
db-112.log db-129.log db-145.log db-161.log db-178.log
db-194.log db-21.log db-226.log db-242.log db-259.log
db-275.log db-37.log db-53.log db-7.log db-86.log
db-113.log db-13.log db-146.log db-162.log db-179.log
db-195.log db-210.log db-227.log db-243.log db-26.log
db-276.log db-38.log db-54.log db-70.log db-87.log
db-114.log db-130.log db-147.log db-163.log db-18.log
db-196.log db-211.log db-228.log db-244.log db-260.log
db-277.log db-39.log db-55.log db-71.log db-88.log
{code}
Than reduce to the below after GC:
{code:java}
icbts-2:activemq-unit-tests icbts$ ls target/data/kahadb/
db-318.log db.data db.redo lock
{code}
> KahaDB Recovery can experience a dangling transaction when prepare and commit
> occur on different data files.
> ------------------------------------------------------------------------------------------------------------
>
> Key: AMQ-7067
> URL: https://issues.apache.org/jira/browse/AMQ-7067
> Project: ActiveMQ
> Issue Type: Bug
> Components: KahaDB, XA
> Affects Versions: 5.15.6
> Reporter: Jamie goodyear
> Assignee: Gary Tully
> Priority: Critical
> Fix For: 5.16.0, 5.15.7
>
> Attachments: amq7067test.patch
>
>
> KahaDB Recovery can experience a dangling transaction when prepare and commit
> occur on different data files.
> Scenario:
> A XA Transaction is started, message is prepared and sent into Broker.
> We then send into broker enough messages to file page file (100 message with
> 512 * 1024 characters in message payload). This forces a new data file to be
> created.
> Commit the XA transaction. Commit will land on the new data file.
> Restart the Broker.
> Upon restart a KahaDB recovery is executed.
> The prepare in PageFile 1 is not matched to Commit on PageFile 2, as such, it
> will appear in recovered message state.
> Looking deeper into this scenario, it appears that the commit message is
> GC'd, hence the prepare & commit can not be matched.
> The MessageDatabase only checks the following for GC:
> {color:#808080}// Don't GC files referenced by in-progress
> tx{color}{color:#cc7832}if {color}(inProgressTxRange[{color:#6897bb}0{color}]
> != {color:#cc7832}null{color}) {
> {color:#cc7832}for {color}({color:#cc7832}int
> {color}pendingTx=inProgressTxRange[{color:#6897bb}0{color}].getDataFileId(){color:#cc7832};
> {color}pendingTx <=
> inProgressTxRange[{color:#6897bb}1{color}].getDataFileId(){color:#cc7832};
> {color}pendingTx++) {
> gcCandidateSet.remove(pendingTx){color:#cc7832};{color} }
> }
> We need to become aware of where the prepare & commits occur in pagefiles
> with respect to GCing files.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)