Skip to content

bug Wrong Packet goes null_bitmask from table map event #439

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
sean-k1 opened this issue Aug 24, 2023 · 0 comments · Fixed by #440
Closed

bug Wrong Packet goes null_bitmask from table map event #439

sean-k1 opened this issue Aug 24, 2023 · 0 comments · Fixed by #440

Comments

@sean-k1
Copy link
Collaborator

sean-k1 commented Aug 24, 2023

Problem

timing of event creation and the timing of now the table structure are different,
ex) drop table but replication did not reach that point


        if self.table_id in table_map:
            self.column_schemas = table_map[self.table_id].column_schemas
        else:
            self.column_schemas = self._ctl_connection._get_table_information(self.schema, self.table)

        ordinal_pos_loc = 0

        if len(self.column_schemas) != 0:
            # Read columns meta data
            column_types = bytearray(self.packet.read(self.column_count)) # read packet point 

        self.null_bitmask = self.packet.read((self.column_count + 7) / 8) #error packet goes

self.column_schemas doesn't yield any results, the code will exit the if statement.
However, since there is more column information in the remaining packets
If we don't read the packet here, an incorrect byte packet for null_bit_mask could be passed through.

@sean-k1 sean-k1 changed the title bug read column Info from table map event bug Wrong Packet goes null_bitmask from table map event Aug 25, 2023
julien-duponchelle pushed a commit that referenced this issue Aug 26, 2023
fix: #439  

Here is how the scenario Goes:

1. There is a time difference between the event and the actual state of the database.
2. The actual database is dropped.
3. The python-replication-mysql application receives a table map event.
4. Since there is no cached result for the table_id, it tries to retrieve the database's column schema.
5. There are no column schema results from the database.
6. Packets containing information about the table map event's columns are still present.
7. The application exits the if statement, and the packets remain untouched.
8. Incorrect packets are inserted into the null_bitmask.

```
        if self.table_id in table_map:
            self.column_schemas = table_map[self.table_id].column_schemas
        else:
            self.column_schemas = self._ctl_connection._get_table_information(self.schema, self.table)

        ordinal_pos_loc = 0

        if len(self.column_schemas) != 0:
            # Read columns meta data
            column_types = bytearray(self.packet.read(self.column_count))
            
        self.null_bitmask = self.packet.read((self.column_count + 7) / 8) #error packet goes here!
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant