diff --git a/ocaml/xcp-rrdd/scripts/rrdd/rrdd.py b/ocaml/xcp-rrdd/scripts/rrdd/rrdd.py index a5dadf326c8..1132fa92b53 100644 --- a/ocaml/xcp-rrdd/scripts/rrdd/rrdd.py +++ b/ocaml/xcp-rrdd/scripts/rrdd/rrdd.py @@ -283,7 +283,8 @@ def wait_until_next_reading(self, neg_shift=1): self.lazy_complete_init() next_reading = self.register() wait_time = next_reading - neg_shift - if wait_time < 0: wait_time %= self.frequency_in_seconds + if wait_time < 0: + wait_time %= self.frequency_in_seconds time.sleep(wait_time) return except socket.error: @@ -310,13 +311,10 @@ def update(self): metadata_json = json.dumps(metadata, sort_keys=True).encode('utf-8') metadata_checksum = crc32(metadata_json) & 0xffffffff - self.dest.seek(0) - self.dest.write('DATASOURCES'.encode()) - self.dest.write(pack(">LLLQ", - data_checksum, - metadata_checksum, - len(self.datasources), - timestamp)) + # First write the updated data and metadata + encoded_datasource_header = 'DATASOURCES'.encode() + # DATASOURCES + 20 for 32 + 32 + 32 + 64 + self.dest.seek(len(encoded_datasource_header) + 20) for val in data_values: # This is already big endian encoded self.dest.write(val) @@ -324,6 +322,16 @@ def update(self): self.dest.write(pack(">L", len(metadata_json))) self.dest.write(metadata_json) self.dest.flush() + + # Now write the updated header + self.dest.seek(0) + self.dest.write(encoded_datasource_header) + self.dest.write(pack(">LLLQ", + data_checksum, + metadata_checksum, + len(self.datasources), + timestamp)) + self.dest.flush() self.datasources = [] time.sleep( 0.003) # wait a bit to ensure wait_until_next_reading will block