MarketSync

Synchronizes auction data across your guild to build a shared, offline-accessible pricing network with instant chat price checks.

File Details

MarketSync Beta v0.5.3

  • B
  • Feb 25, 2026
  • 54.35 KB
  • 38
  • 2.5.5+1
  • Classic + 1

File Name

MarketSync.0.5.3-beta.zip

Supported Versions

  • 2.5.5
  • 1.15.8

[0.5.3] - 2026-02-25

Improved

  • Improved: Hybrid Metadata Retention Policy. Introduced a two-tier automated pruning system that prevents unbounded RAM growth from ItemMetadata accumulation over long-term usage. Tier 1 caps per-item days attribution sub-tables to the 7 most recent scan days, removing old day-by-day "who synced it" entries that no feature relies on. Tier 2 removes the entire metadata entry for items whose lastTime is older than 30 days — if nobody has scanned or synced an item in a month, the attribution data is stale and meaningless. On a mature dataset (~30k items with months of daily scans), this reduces ItemMetadata RAM usage by approximately 75-80%. The pruning runs lazily at Stage 2.5 (60 seconds after login), slotted between passive sync startup and search index building, with zero impact on gameplay performance. Auctionator's price database is never touched — only MarketSync's own attribution metadata is pruned.

[0.5.2] - 2026-02-22

Fixed

  • Fixed: A stale CachedScanStats cache caused the Swarm to report an incorrect item count after receiving a sync. The cached count was written once per session by CountRecentItems() and never invalidated when incoming BRES data inserted new items into the Auctionator database. Any ADV broadcast that fired mid-transfer would silently advertise the pre-sync count. The cache is now eagerly invalidated on the very first BRES chunk of each sync session, and again when CommitGuildSync() finalizes the merge — guaranteeing the next ADV always re-counts from the live database.
  • Fixed: A race condition between the 8-second idle timeout and the END packet that could cause a fully successful sync to be misidentified as "partial." If the idle timer fired before END arrived, it reset RxCount to 0. When END then checked rxCount >= itemsSent, it saw 0 and skipped the PersonalScanTime stamp — leaving the client eligible for a redundant re-PULL on the next ADV cycle. Introduced a sessionRxTotal counter that survives the timeout reset, so the END handler always has the true received count for completeness validation.
  • Fixed: The Chat Price Check anti-flood system (? [Item Link]) was completely non-functional, causing every client on the network to reply simultaneously. Three bugs were identified and resolved: (1) Self-reply — clients replied to their own queries because the self-sender filter only applied to addon protocol messages, not chat events. Self-queries are now properly ignored. (2) No addon-channel coordination — the old system relied on detecting another client's visible chat reply to cancel a pending response, but chat messages have delivery latency and both random timers would fire before either reply was delivered. A new two-phase CLAIM protocol has been introduced: when a client's random timer fires, it broadcasts CLAIM;itemID on the addon prefix (near-instant, zero chat throttle) but holds its chat reply for a 300ms grace period. If a competing CLAIM arrives during that window, a deterministic alphabetical-name tiebreaker guarantees exactly one winner — even when two clients fire within milliseconds of each other. (3) Wider lottery window — the random delay has been widened from 0.5–2.0s to 0.5–3.0s to further reduce the chance of timer collisions.
  • Fixed: The BroadcastRecentData() ticker never cancelled itself after the coroutine finished, causing an orphaned timer that fired indefinitely. It now self-cancels once the broadcast completes.

Improved

  • Improved: UpdateLocalDBByKey() — the sync hot path — now caches the realm database reference once per call instead of resolving GetRealmDB() 6 times per item. During a 2,000-item sync this eliminates ~12,000 redundant GetNormalizedRealmName() lookups.
  • Improved: The passive advertisement ticker no longer performs a redundant IsInInstance() check. This condition is already handled by CanSync() inside SendAdvertisement(), which also covers combat, raids, dungeons, PvP, and arena — a strict superset.
  • Improved: The CLAIM handler now evicts stale claimContestants entries for items no longer in play, preventing the table from growing indefinitely over long sessions with frequent ? queries.