9-28-2014

Discussion in 'Changelog' started by robregen, Sep 28, 2014.

  1. robregen

    robregen Administrator Staff Member

    Messages:
    8,384
    Plane of Sky is open.

    Code:
    PP deblob Conversion has been merged so please test it well.

    == 09/21/2014 ==
    Akkadius: Player Profile Blob to Database Conversion
    - Summary: HUGE difference in database speeds reads/writes and 1:10 datasize difference
    - The new character storage engine unlike the character_ table before, is able to properly index data and make use of
    proper MySQL/MariaDB caching optimizations and performance has increased phenominally
    PERFORMANCE AND STATISTICS FIGURES (Varies on hardware):
    - EZ Server Character data size of 2.6GB `character_` table alone now takes up approx 600MB
    - Character Data Loads take approx .03 seconds BEFORE MySQL/MariaDB cache
    - Character Data Loads take approx .001-.0035 seconds AFTER MySQL/MariaDB cache
    - Character Data Saves take approx .0001 - .003 for any particular save operation
    - Database Auto Conversion: When the 'character_' table exists, World boot-up will queue an auto-conversion prompt and convert all of your characters, BACKUP
    YOUR DATABASE BEFORE CONVERTING, here is an EASY backup script: http://wiki.eqemulator.org/p?MySQL_DB_Backup_Script
    - On auto conversion, the following tables are created automatically:
    - Table: `character_skills` - Stores Character Skills
    - Table: `character_languages` - Stores Character Language
    - Table: `character_bind` - Stores Character Bind point and Home Bind point designated by is_home bool field
    - Table: `character_alternate_abilities` - Stores all Character AA
    - Table: `character_currency` - Stores all Platinum/Gold/Silver/Copper and character related currencies
    - Table: `character_data` - Stores basic character data (Fields from `character_` table migrated to this table)
    - Table: `character_spells` - Stores character spells
    - Table: `character_memmed_spells` - Stores character memorized spells
    - Table: `character_disciplines` - Stores character disciplines
    - Table: `character_material` - Stores character armor dye textures
    - Table: `character_tribute` - Stores character tributes
    - Table: `character_bandolier` - Stores character bandoliers
    - Table: `character_inspect_messages` - Stores character inspection messages (Moved from `character_` table)
    - Table: `character_leadership_abilities` - Stores character Leadership AAs
    - Loads: Majority of Player profile loads now occur at Client::Handle_Connect_OP_ZoneEntry
    LoadCharacterFactionValues(uint32 character_id, faction_map & val_list);
    LoadCharacterSpellBook(uint32 character_id, PlayerProfile_Struct* pp);
    LoadCharacterMemmedSpells(uint32 character_id, PlayerProfile_Struct* pp);
    LoadCharacterLanguages(uint32 character_id, PlayerProfile_Struct* pp);
    LoadCharacterDisciplines(uint32 character_id, PlayerProfile_Struct* pp);
    LoadCharacterSkills(uint32 character_id, PlayerProfile_Struct* pp);
    LoadCharacterData(uint32 character_id, PlayerProfile_Struct* pp, ExtendedProfile_Struct* m_epp);
    LoadCharacterCurrency(uint32 character_id, PlayerProfile_Struct* pp);
    LoadCharacterBindPoint(uint32 character_id, PlayerProfile_Struct* pp);
    LoadCharacterMaterialColor(uint32 character_id, PlayerProfile_Struct* pp);
    LoadCharacterBandolier(uint32 character_id, PlayerProfile_Struct* pp);
    LoadCharacterTribute(uint32 character_id, PlayerProfile_Struct* pp);
    LoadCharacterPotions(uint32 character_id, PlayerProfile_Struct* pp);
    LoadCharacterLeadershipAA(uint32 character_id, PlayerProfile_Struct* pp);
    - Saves: Occur all over the code now instead of calling full saves
    SaveCharacterBindPoint(uint32 character_id, uint32 zone_id, uint32 instance_id, float x, float y, float z, float heading, uint8 is_home);
    SaveCharacterCurrency(uint32 character_id, PlayerProfile_Struct* pp);
    SaveCharacterData(uint32 character_id, uint32 account_id, PlayerProfile_Struct* pp, ExtendedProfile_Struct* m_epp);
    SaveCharacterAA(uint32 character_id, uint32 aa_id, uint32 current_level);
    SaveCharacterSpell(uint32 character_id, uint32 spell_id, uint32 slot_id);
    SaveCharacterMemorizedSpell(uint32 character_id, uint32 spell_id, uint32 slot_id);
    SaveCharacterMaterialColor(uint32 character_id, uint32 slot_id, uint32 color);
    SaveCharacterSkill(uint32 character_id, uint32 skill_id, uint32 value);
    SaveCharacterLanguage(uint32 character_id, uint32 lang_id, uint32 value);
    SaveCharacterDisc(uint32 character_id, uint32 slot_id, uint32 disc_id);
    SaveCharacterTribute(uint32 character_id, PlayerProfile_Struct* pp);
    SaveCharacterBandolier(uint32 character_id, uint8 bandolier_id, uint8 bandolier_slot, uint32 item_id, uint32 icon, const char* bandolier_name);
    SaveCharacterPotionBelt(uint32 character_id, uint8 potion_id, uint32 item_id, uint32 icon);
    SaveCharacterLeadershipAA(uint32 character_id, PlayerProfile_Struct* pp);
    - Deletes:
    DeleteCharacterSpell(uint32 character_id, uint32 spell_id, uint32 slot_id);
    DeleteCharacterMemorizedSpell(uint32 character_id, uint32 spell_id, uint32 slot_id);
    DeleteCharacterDisc(uint32 character_id, uint32 slot_id);
    DeleteCharacterBandolier(uint32 character_id, uint32 band_id);
    DeleteCharacterLeadershipAAs(uint32 character_id);
    - Now occur all over the code and only trigger when necessary
    - Two FULL saves when looting a corpse, this has been reduced to just currency saves on initial loot and trimmed to one save since AddToMoneyPP did it already
    - Every time a player moves coin with any situation (Splits/Trades/Merchant/Skills/Bank Coin Exchange/Coin Moves), a full save is made, this is now just a currency save
    - Every time a player skilled up at a skill vendor, a full blob save hit was made, this is not just a currency hit
    - Every time an AA was purchased, a full save was made
    - Every time a spell was scribed/swapped, disc was trained
    - When a client exists a zone, when a client enters a zone
    - NOTE: These amount of excessive saves have caused scalability issues that cause the `character_` table to hang which causes process hangs that affect the whole server
    because of the slowness of the `character_` table and the blob not allowing any indexing to occur
    - All functions that once depended on the `character_` table are now rewritten to appropriately read from the `character_data` table
    - Database query errors that occur during conversion or from and load/save/delete character functions are now leveraged via ThrowDBError and logs now go to
    Server_Folder_Root/eqemu_query_error_log.txt (You cannot log errors natively through MySQL)
    - DBASYNC IS NOW COMPLETELY REMOVED - This was mainly for Character data async loads/saves and merchantlist loads
    - Side implementations:
    Perl Exports:
    - quest::crosszonesetentityvariablebynpctypeid(npctype_id, id, m_var) - Sets entity variables world wide with specified npctype_id
    - quest::crosszonesignalnpcbynpctypeid(npctype_id, data) - Signals all NPC entities world wide with specified npctype_id
    - $client->GetTaskActivityDoneCount(TaskID, ActivityID) - Gets task activity done count by task id and activity id for client entity