WoWInterface

WoWInterface (https://www.wowinterface.com/forums/index.php)
-   WoD Beta archived threads (https://www.wowinterface.com/forums/forumdisplay.php?f=151)
-   -   Major issue with saved variables (https://www.wowinterface.com/forums/showthread.php?t=49523)

Cybeloras 07-23-14 12:55 PM

Major issue with saved variables
 
Just discovered this after a user was reporting that some of his TellMeWhen icons were disappearing every single login/reload (http://wow.curseforge.com/addons/tel...a-few-bugs/#c3)

Something has gone wrong with the serializer for SavedVariables that is causing numbers that are totally able to be represented as integers to get turned into floats WITH ERROR.

See this shot of section of the SavedVariables that the profile is based on: http://i.imgur.com/Ts7WqCp.png

Icons 28 and 29 are the ones that get lost every single reload. There are also duplicates in there - one is the icon data that used to be there (which persisted from previous reload with a key of 28.00000000000001) and the other is the data that was corrupted to have a key of 28.00000000000001.

I will do some more testing, but so far this appears to only happen whenever an array-style table has gaps in it (as this one does at 23 and 24) which forces the values after the gap to get written with explicit keys (as it always has).

PS: If you're here from the report I submitted in-game, thanks for checking this out! Shameless plea: please also bring back the cost and powerType returns from GetSpellInfo() =)

Cybeloras 07-23-14 12:59 PM

Quick follow up: This is happening with MANY numbers, and not just table keys:

Source:
Lua Code:
  1. TMW.db.global.TEST = {[28] = "test string", [29] = 28}

Result:
Lua Code:
  1. ["TEST"] = {
  2.     [28.00000000000001] = "test string",
  3.     [29.00000000000001] = 28.00000000000001,
  4. },


Another test:
Lua Code:
  1. TMW.db.global.TEST = {}
  2. for i = 1, 200 do TMW.db.global.TEST[i] = i end

Lua Code:
  1. ["TEST"] = {
  2.     1, -- [1]
  3.     2, -- [2]
  4.     3, -- [3]
  5.     4, -- [4]
  6.     5, -- [5]
  7.     6, -- [6]
  8.     7, -- [7]
  9.     8, -- [8]
  10.     9, -- [9]
  11.     10, -- [10]
  12.     11, -- [11]
  13.     12, -- [12]
  14.     13, -- [13]
  15.     14, -- [14]
  16.     15, -- [15]
  17.     16, -- [16]
  18.     17, -- [17]
  19.     18, -- [18]
  20.     19, -- [19]
  21.     20, -- [20]
  22.     21, -- [21]
  23.     22, -- [22]
  24.     23.00000000000001, -- [23]
  25.     24.00000000000001, -- [24]
  26.     25, -- [25]
  27.     26, -- [26]
  28.     27, -- [27]
  29.     28.00000000000001, -- [28]
  30.     29.00000000000001, -- [29]
  31.     30, -- [30]
  32.     31, -- [31]
  33.     32, -- [32]
  34.     33.00000000000001, -- [33]
  35.     34.00000000000001, -- [34]
  36.     35, -- [35]
  37.     36, -- [36]
  38.     37, -- [37]
  39.     38.00000000000001, -- [38]
  40.     39.00000000000001, -- [39]
  41.     40, -- [40]
  42.     41.00000000000001, -- [41]
  43.     42, -- [42]
  44.     43, -- [43]
  45.     44.00000000000001, -- [44]
  46.     45, -- [45]
  47.     46.00000000000002, -- [46]
  48.     47, -- [47]
  49.     48.00000000000002, -- [48]
  50.     49, -- [49]
  51.     50, -- [50]
  52.     51.00000000000002, -- [51]
  53.     52, -- [52]
  54.     53.00000000000002, -- [53]
  55.     54, -- [54]
  56.     55, -- [55]
  57.     56.00000000000002, -- [56]
  58.     57, -- [57]
  59.     58.00000000000002, -- [58]
  60.     59, -- [59]
  61.     60, -- [60]
  62.     61.00000000000002, -- [61]
  63.     62, -- [62]
  64.     63.00000000000002, -- [63]
  65.     64, -- [64]
  66.     65, -- [65]
  67.     66.00000000000002, -- [66]
  68.     67, -- [67]
  69.     68.00000000000002, -- [68]
  70.     69, -- [69]
  71.     70, -- [70]
  72.     71.00000000000002, -- [71]
  73.     72, -- [72]
  74.     73.00000000000002, -- [73]
  75.     74, -- [74]
  76.     75, -- [75]
  77.     76.00000000000002, -- [76]
  78.     77, -- [77]
  79.     78.00000000000002, -- [78]
  80.     79, -- [79]
  81.     80, -- [80]
  82.     81, -- [81]
  83.     82.00000000000002, -- [82]
  84.     83.00000000000002, -- [83]
  85.     84, -- [84]
  86.     85, -- [85]
  87.     86, -- [86]
  88.     87.00000000000002, -- [87]
  89.     88.00000000000002, -- [88]
  90.     89, -- [89]
  91.     90, -- [90]
  92.     91, -- [91]
  93.     92.00000000000002, -- [92]
  94.     93, -- [93]
  95.     94, -- [94]
  96.     95, -- [95]
  97.     96.00000000000002, -- [96]
  98.     97.00000000000002, -- [97]

The rest of the 200 numbers serialized properly, but this issue isn't limited by any max - I tested up to 20,000 and 9982 was serializing wrong.

semlar 07-23-14 01:17 PM

You might try storing the integer as a string if you need to store them out of order.

Cybeloras 07-23-14 02:15 PM

The problem isn't ordering - its that numbers are straight up getting serialized wrong, and its happening no matter where the numbers are - keys and values alike are getting screwed up. Numbers that should be represented just fine as integers when stored as a double are somehow getting floating point error introduced into them. This is not like this on live servers at all.

Shirik 07-23-14 07:20 PM

This cannot be as simple as a floating-point error, because these are IEEE 754 doubles. Every 32-bit integer (actually, every 53-bit integer) can be stored perfectly in a double-precision floating point value, which is how Lua represents numbers.

There's clearly something more insidious going on in the serialization code.

Nimhfree 07-24-14 09:16 AM

By the way, this is only a problem with writing the saved variables out to file. In memory, the values all display correctly.

Cybeloras 08-04-14 08:03 PM

Seems to be fixed in build 18663. Thanks, Blizz!


All times are GMT -6. The time now is 11:04 PM.

vBulletin © 2024, Jelsoft Enterprises Ltd
© 2004 - 2022 MMOUI