[Fixed] AH Bug with multiple people buying 1 item

To setup this experience, I had to enlist the help of a friend Fuukigi and received the error below.

Use case: Multiple people should be able to buy an item from the auction house at multiple price points without refreshing the list. For the second, etc, person on the list, the UI should correctly communicate the updated price in a pop up before the purchase is made.

Test cases: At least 3 accounts are required. 1 account to list the auctions with multiple price break points. 2 or more accounts to purchase the items from the AH without refreshing the listing by search and selecting an item then buying in order.

First, there were 3 listings for simple wood.

5x 1g1s
5x 75g1s
4182x 99g1s

We performed the following highly choreographed operation (Fuu has 2 PTR accounts, I have 1).

Fuu’s 2nd account listed the 1g1s x 5 and 75g1s x5 (so Fuu’s main account and my main account can buy them – you can’t buy your own auctions).

We both searched simple wood and saw all 3 auctions.

Fuu bought 5 simple wood. This transaction went through successfully and she received 5 simple wood.

I did not refresh my screen and still had the 1g1s, 75g1s, and 99g1s auctions up in the list.

I proceeded to try to buy 5 simple wood (knowing the 1g1s simple wood were already purchased). I took screenshots but can’t post them here so I will go through the errors textually.

When I attempted to purchase, I got a new pop up that stated “Price updated to the cheapest available.” It listed the item as Simple Wood x5, the total price as 5g 5s (obviously, this wasn’t updated). I was presented with two prompts, BUY NOW or CANCEL.

Wanting to see how I could break the AH, I pressed BUY NOW.

I received the following error “Internal Auction Error”. In addition, both the BUY NOW and CANCEL were greyed out.

I did not purchase anything and when I closed the AH UI I got the error below.

Ideal resolution:
Ideally, the resolution to this is to allow the user to specify both the quantity and maximum price and the AH takes that information and buys up to my maximum quantity or maximum price.

Ex:
Current AH:
5 simple wood 1g 1s
5 simple wood 75g 1s

User X buys 2 simple wood at a maximum price of 10g. User X receives 2 simple wood and pays 2g 1s.

Current AH:
3 simple wood 1g 1s
5 simple wood 75g 1s

Displayed AH to User Y:
5 simple wood 1g 1s
5 simple wood 75g 1s
User Y attempts to buy 5 simple wood at a maximum price of 10g.
3 simple wood are purchased for a total price of 3g 3s. An informational message appears that states “Simple Wood x2 was not purchased because the item exceeded your maximum unit price. Please refresh the AH to see current pricing.”

This should allow the highest concurrency of the AH.

Lua error:

Message: …lizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:240: Division by zero
Time: Thu Oct 17 03:20:49 2019
Count: 1
Stack: …lizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:240: Division by zero
…lizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:240: in function CalculateScrollExtentsAtScale' ...lizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:236: in functionCalculateScrollExtents’
…lizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:222: in function SetCanvasSize' ...lizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:421: in functionOnCanvasSizeChanged’
…lizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:407: in function SetMapID' ...ace\AddOns\Blizzard_MapCanvas\Blizzard_MapCanvas.lua:33: in functionSetMapID’
…rface\AddOns\Blizzard_WorldMap\Blizzard_WorldMap.lua:235: in function <…rface\AddOns\Blizzard_WorldMap\Blizzard_WorldMap.lua:233>
[C]: in function Show' Interface\FrameXML\UIParent.lua:2667: in functionSetUIPanel’
Interface\FrameXML\UIParent.lua:2498: in function ShowUIPanel' Interface\FrameXML\UIParent.lua:2380: in function <Interface\FrameXML\UIParent.lua:2376> [C]: in functionSetAttribute’
Interface\FrameXML\UIParent.lua:3233: in function ShowUIPanel' Interface\FrameXML\QuestLogOwnerMixin.lua:103: in functionSetDisplayState’
Interface\FrameXML\QuestLogOwnerMixin.lua:51: in function HandleUserActionToggleQuestLog' ...rface\AddOns\Blizzard_WorldMap\Blizzard_WorldMap.lua:420: in functionToggleQuestLog’
[string “TOGGLEQUESTLOG”]:1: in function <[string “TOGGLEQUESTLOG”]:1>

Locals: self = {
0 =
MarkCanvasDirty = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:384
GetMinZoomViewRect = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:547
GetNormalizedHorizontalScroll = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:703
SetPanTarget = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:580
DenormalizeVerticalSize = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:728
IsAtMaxZoom = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:647
AccumulateMouseDeltas = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:248
ScalingMode = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:293
GetMap = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:659
IsZoomingIn = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:639
ZoomOut = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:601
ShouldZoomInstantly = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:539
SetScalingMode = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:289
targetScale = 0
GetNormalizedCursorPosition = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:753
TryPanOrZoomOnClick = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:87
shouldPanOnClick = false
SetZoomTarget = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:585
normalizedPanXLerpAmount = 0.150000
NormalizeUIPosition = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:748
OnMouseUp = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:105
MarkAreaTriggersDirty = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:376
CalculateViewRect = defined @Interface\AddOns\Blizzard_MapCanvas\MapCanvas_ScrollContainerMixin.lua:551
ResetZoo

7 Likes

This bug would be highly problematic on full pop servers where there are often multiple people trying to buy common commodities.

3 Likes

Hello Zarrek and thank you for your report! We are actively looking into the issue and were curious if you are still able to get this to happen?

5 Likes

You should hire him.

2 Likes

Sorry! I missed the reply. I will coordinate with Fuu and see if we can check soon. Hopefully by the end of the weekend.

I haven’t tested this yet. I have to coordinate with Fuu and I had personal issues that preoccupied my time throughout the weekend. I will try to make sure you have this by Monday.

UPDATE:

I was able to test this today with Fuu (I really should just get 3 PTR accounts, is that possible?) and I took screenshots of what happened.

https://cdn.discordapp.com/attachments/632846905449119764/643272272760668170/unknown.png

https://cdn.discordapp.com/attachments/632846905449119764/643272318004494336/unknown.png

So what it did was say I was getting 5 for 50g, I said sure, but really bought 5 for 500g as shown in the receipt.

On the plus side there were no UI errors.

I don’t have any addons on the PTR tracking what I’ve spent. Let me repeat the test.

In my retest, I got internal auction error. I assume this is because I went slower and tried to document everything

https://cdn.discordapp.com/attachments/632846905449119764/643274457431146538/unknown.png

https://cdn.discordapp.com/attachments/632846905449119764/643275195863400489/unknown.png

https://cdn.discordapp.com/attachments/632846905449119764/643275347638485023/unknown.png

https://cdn.discordapp.com/attachments/632846905449119764/643275412172046366/unknown.png

After I got this internal auction error there was no UI error but I could not interact with the AH anymore. I attempted to logout and could not logout so I did alt F4. On my return I got the following error:

https://cdn.discordapp.com/attachments/632846905449119764/643276480226394112/unknown.png

To get around this and continue testing, I copied myself again. When I finally found myself, we continued our party.

https://cdn.discordapp.com/attachments/632846905449119764/643277235561824262/unknown.png

There’s definitely a race condition to this as well. When I didn’t stop to try and screenshot the pop up this happened:

https://cdn.discordapp.com/attachments/632846905449119764/643277635656351744/unknown.png

https://cdn.discordapp.com/attachments/632846905449119764/643277823553044500/unknown.png

So I was definitely charged 500g while the pop up only said 50g.

Finally, captured with screenshots!

https://cdn.discordapp.com/attachments/632846905449119764/643279070725144595/unknown.png

https://cdn.discordapp.com/attachments/632846905449119764/643279334869696522/unknown.png

https://cdn.discordapp.com/attachments/632846905449119764/643279382483566603/unknown.png

To recap: Fuu purchased 5 for 10g I attempted to purchase, without refreshing, 5 for 10g and the pop up told me 50g but I was actually charged 500g.

In addition, the one time I was unsuccessful, it forced me to alt F4 to exit the game and my character was still in the game until it timed out.

Please add to your acceptance criteria that the price reflected in the popup should be the price that you are charged.

Finally, I’d consider this a game breaking bug because people will end up getting stuck on the character screen with a character already exists if enough people try to buy the same thing.

3 Likes

I tested with Zarrek and he posted the summary of our results. Thanks for looking into this and taking it so seriously. =)

4 Likes

Thank you Zarrek and Fuukigi!!! We have implemented a fix for the issue thanks to the detailed information you provided us.

3 Likes

Can i just say how awesome it is to see someone doing actual Q&A on the PTR instead of just previewing the content to play it before its ready or to determine the most exploitable path? Even if something so backend as this should have been tested internally.

2 Likes

Please let me know when we can retest.

Honestly, Devs of a game aren’t the best people to test things as generally they do things “as they should be done” rather then “how can I break this”.

I’ve studied a few years at Uni on some computer programming courses. I found it a lot easier to find things to try and break when I wasn’t part of the project that designed it.

Specifically, this is a optimistic concurrency issue and a race condition, which makes this even harder to test. Plus, while I love the AH and I am so excited for this revamp, I imagine most people don’t think much of the AH system at all.

It took me a while to even think about this use case while I was imagining a swarm of people trying to buy item X because event Y requires it.

If I was to be totally honest, I thought it would work much like GW2 AH, where it would “try” and buy all the items for the price that you said you wanted to buy it for but if someone bought the same items at the same time, it would buy as many as it could and give you the gold you are owed back :stuck_out_tongue:

In all honesty, that’s how I’d prefer it functioned. I posted that in the feedback thread.

I have another scenario I’m looking to test when this is fixed.

Just curious as to if anyone knows if the AH changes, with regards to multiple people trying to buy the same item(s) at the same time, has been implemented yet?

I tested this with Fuu today. This is fixed. (We had to buy out whoever put 200 up at 1030g each because I wanted to make sure our results weren’t tainted.)

We established the following testing scenarios:

5 @ 1g
5 @ 10g
5 @ 100g
5 @ 1000g

First we tried the classic scenario:
I opened the simple wood AH.
Fuu bought 5x1g.
I attempted to buy 5x1g.
Result: “This item is no longer available.”

This invalidated the second test I wanted to do (a double bounce) and more reflects how the AH works currently today.

Next, we setup the AH in the following manner:
5 @ 100g
5 @ 1000g

I had Fuu buy 1 @ 100g.
I attempted to buy 6. 5 @ 100g and 1 @ 1000g.
The AH returned “This item is no longer available” (which is great because it makes sure you don’t get overcharged by not paying attention).

While I wish the AH provided higher concurrency, these fixes definitely did resolve the issue.

Thank you for your diligent work on this.

1 Like