4040 PGWS_DIMENSIONS_APPNAME))
4141static volatile sig_atomic_t shutdown_requested = false;
4242
43- int saved_profile_dimensions ;//TODO should be initialized with the same value as GUC?
43+ int saved_profile_dimensions ;
4444int saved_history_dimensions ;
4545
4646static void handle_sigterm (SIGNAL_ARGS );
@@ -72,12 +72,15 @@ pgws_register_wait_collector(void)
7272static void
7373alloc_history (History * observations ,int count )
7474{
75- observations -> items = (HistoryItem * )palloc0 (sizeof (HistoryItem )* count );
75+ int serialized_size ;
76+
77+ saved_history_dimensions = pgws_history_dimensions ;
78+ serialized_size = get_serialized_size (saved_history_dimensions , true);
79+
80+ observations -> serialized_items = (char * )palloc0 (serialized_size * count );
7681observations -> index = 0 ;
7782observations -> count = count ;
7883observations -> wraparound = false;
79-
80- saved_history_dimensions = pgws_history_dimensions ;
8184}
8285
8386/*
@@ -86,13 +89,17 @@ alloc_history(History *observations, int count)
8689static void
8790realloc_history (History * observations ,int count )
8891{
89- HistoryItem * newitems ;
92+ char * newitems ;
9093int copyCount ,
9194i ,
9295j ;
96+ int serialized_size ;
97+
98+ //saved_history_dimensions = pgws_history_dimensions; // TODO вроде как
99+ serialized_size = get_serialized_size (saved_history_dimensions , true);
93100
94101/* Allocate new array for history */
95- newitems = (HistoryItem * )palloc0 (sizeof ( HistoryItem ) * count );
102+ newitems = (char * )palloc0 (serialized_size * count );
96103
97104/* Copy entries from old array to the new */
98105if (observations -> wraparound )
@@ -111,19 +118,19 @@ realloc_history(History *observations, int count)
111118{
112119if (j >=observations -> count )
113120j = 0 ;
114- memcpy (& newitems [i ],& observations -> items [j ],sizeof (HistoryItem ));
121+ memcpy ((newitems + i * serialized_size ),
122+ (observations -> serialized_items + j * serialized_size ),
123+ serialized_size );
115124i ++ ;
116125j ++ ;
117126}
118127
119128/* Switch to new history array */
120- pfree (observations -> items );
121- observations -> items = newitems ;
129+ pfree (observations -> serialized_items );
130+ observations -> serialized_items = newitems ;
122131observations -> index = copyCount ;
123132observations -> count = count ;
124133observations -> wraparound = false;
125-
126- saved_history_dimensions = pgws_history_dimensions ;
127134}
128135
129136static void
@@ -140,18 +147,19 @@ handle_sigterm(SIGNAL_ARGS)
140147/*
141148 * Get next item of history with rotation.
142149 */
143- static HistoryItem *
150+ static char *
144151get_next_observation (History * observations )
145152{
146- HistoryItem * result ;
153+ char * result ;
154+ int serialized_size = get_serialized_size (saved_history_dimensions , true);
147155
148156/* Check for wraparound */
149157if (observations -> index >=observations -> count )
150158{
151159observations -> index = 0 ;
152160observations -> wraparound = true;
153161}
154- result = & observations -> items [observations -> index ];
162+ result = & observations -> serialized_items [observations -> index * serialized_size ];
155163observations -> index ++ ;
156164return result ;
157165}
@@ -413,8 +421,8 @@ serialize_item(SamplingDimensions dimensions, int dimensions_mask,
413421}
414422
415423/* copy all the fields without ts/count */
416- * serialized_key = palloc0 (* serialized_size + 1 );
417- strcpy (* serialized_key ,dummy_array );
424+ * serialized_key = palloc0 (* serialized_size );
425+ memcpy (* serialized_key ,dummy_array , * serialized_size );
418426
419427if (is_history )
420428{
@@ -430,8 +438,8 @@ serialize_item(SamplingDimensions dimensions, int dimensions_mask,
430438}
431439
432440/* copy everything */
433- * serialized_item = palloc0 (* serialized_size + 1 );
434- strcpy (* serialized_item ,dummy_array );
441+ * serialized_item = palloc0 (* serialized_size );
442+ memcpy (* serialized_item ,dummy_array , * serialized_size );
435443}
436444
437445void
@@ -570,17 +578,17 @@ probe_waits(History *observations, HTAB *profile_hash,
570578LWLockAcquire (ProcArrayLock ,LW_SHARED );
571579for (i = 0 ;i < ProcGlobal -> allProcCount ;i ++ )
572580{
573- HistoryItem item_history ,
574- * observation ;
575- ProfileItem item_profile ;
581+ // HistoryItem item_history,
582+ // *observation;
583+ // ProfileItem item_profile;
576584PGPROC * proc = & ProcGlobal -> allProcs [i ];
577585int pid ;
578586uint32 wait_event_info ;
579587SamplingDimensions common_dimensions ,
580588history_dimensions ,
581589profile_dimensions ;
582- int dimensions_mask_common = pgws_history_dimensions |
583- pgws_profile_dimensions ;
590+ int dimensions_mask_common = saved_history_dimensions |
591+ saved_profile_dimensions ;
584592
585593/* Check if we need to sample this process */
586594if (!pgws_should_sample_proc (proc ,& pid ,& wait_event_info ))
@@ -598,21 +606,27 @@ probe_waits(History *observations, HTAB *profile_hash,
598606
599607copy_dimensions (& history_dimensions ,
600608& common_dimensions ,
601- pgws_history_dimensions );
609+ saved_history_dimensions );
602610copy_dimensions (& profile_dimensions ,
603611& common_dimensions ,
604- pgws_profile_dimensions );
612+ saved_profile_dimensions );
605613
606- item_history .ts = ts ;
607- item_history .dimensions = history_dimensions ;
614+ // item_history.ts = ts;
615+ // item_history.dimensions = history_dimensions;
608616
609617/* Write to the history if needed */
610618if (write_history )
611619{
612- //TODO вот тут что-то сделать нужно??? потому что мы не запаковываем
613- //историю
620+ char * serialized_key ,
621+ * serialized_item ,
622+ * observation ;
623+ int serialized_size = 0 ;
624+
614625observation = get_next_observation (observations );
615- * observation = item_history ;
626+ serialize_item (history_dimensions ,saved_history_dimensions ,
627+ & serialized_item ,& serialized_key ,& serialized_size ,
628+ ts , (uint64 )0 , true);
629+ memcpy (observation ,serialized_item ,serialized_size );
616630}
617631
618632/* Write to the profile if needed */
@@ -626,9 +640,9 @@ probe_waits(History *observations, HTAB *profile_hash,
626640* stored_item ;
627641
628642if (!profile_pid )
629- item_profile . dimensions .pid = 0 ;
643+ profile_dimensions .pid = 0 ;
630644
631- serialize_item (item_profile . dimensions ,saved_profile_dimensions ,
645+ serialize_item (profile_dimensions ,saved_profile_dimensions ,
632646& serialized_item ,& serialized_key ,& serialized_size ,
633647 (TimestampTz )0 ,count , false);
634648
@@ -659,8 +673,9 @@ probe_waits(History *observations, HTAB *profile_hash,
659673 * Send waits history to shared memory queue.
660674 */
661675static void
662- send_history (History * observations ,shm_mq_handle * mqh )
676+ send_history (History * observations ,shm_mq_handle * mqh )//TODO TODO TODO
663677{
678+ int serialized_size = get_serialized_size (saved_history_dimensions , true);
664679Size count ,
665680i ;
666681shm_mq_result mq_result ;
@@ -679,11 +694,20 @@ send_history(History *observations, shm_mq_handle *mqh)
679694"receiver of message queue has been detached" )));
680695return ;
681696}
697+ /* Send saved_dimensions next */
698+ mq_result = shm_mq_send_compat (mqh ,sizeof (saved_history_dimensions ),& saved_history_dimensions , false, true);
699+ if (mq_result == SHM_MQ_DETACHED )
700+ {
701+ ereport (WARNING ,
702+ (errmsg ("pg_wait_sampling collector: "
703+ "receiver of message queue has been detached" )));
704+ return ;
705+ }
682706for (i = 0 ;i < count ;i ++ )
683707{
684708mq_result = shm_mq_send_compat (mqh ,
685- sizeof ( HistoryItem ) ,
686- & observations -> items [ i ] ,
709+ serialized_size ,
710+ ( observations -> serialized_items + i * serialized_size ) ,
687711 false,
688712 true);
689713if (mq_result == SHM_MQ_DETACHED )
@@ -703,7 +727,8 @@ static void
703727send_profile (HTAB * profile_hash ,shm_mq_handle * mqh )
704728{
705729HASH_SEQ_STATUS scan_status ;
706- ProfileItem * item ;
730+ char * serialized_item ;
731+ int serialized_size = get_serialized_size (saved_profile_dimensions , true);
707732Size count = hash_get_num_entries (profile_hash );
708733shm_mq_result mq_result ;
709734
@@ -716,10 +741,19 @@ send_profile(HTAB *profile_hash, shm_mq_handle *mqh)
716741"receiver of message queue has been detached" )));
717742return ;
718743}
744+ /* Send saved_dimensions next */
745+ mq_result = shm_mq_send_compat (mqh ,sizeof (saved_profile_dimensions ),& saved_profile_dimensions , false, true);
746+ if (mq_result == SHM_MQ_DETACHED )
747+ {
748+ ereport (WARNING ,
749+ (errmsg ("pg_wait_sampling collector: "
750+ "receiver of message queue has been detached" )));
751+ return ;
752+ }
719753hash_seq_init (& scan_status ,profile_hash );
720- while ((item = (ProfileItem * )hash_seq_search (& scan_status ))!= NULL )
754+ while ((serialized_item = (char * )hash_seq_search (& scan_status ))!= NULL )
721755{
722- mq_result = shm_mq_send_compat (mqh ,sizeof ( ProfileItem ), item , false,
756+ mq_result = shm_mq_send_compat (mqh ,serialized_size , serialized_item , false,
723757 true);
724758if (mq_result == SHM_MQ_DETACHED )
725759{