Thread: Patch to warn about oid/xid wraparound

Patch to warn about oid/xid wraparound

From
Bruce Momjian
Date:
Here is a patch that will warn you during VACUUM when you are within 75%
of oid/xid wraparound.

I will apply it if 7.2 has no solution to the wraparounds.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
Index: src/backend/commands/vacuum.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/commands/vacuum.c,v
retrieving revision 1.195
diff -c -r1.195 vacuum.c
*** src/backend/commands/vacuum.c    2001/05/25 15:45:32    1.195
--- src/backend/commands/vacuum.c    2001/06/12 23:25:58
***************
*** 159,166 ****
  static bool enough_space(VacPage vacpage, Size len);
  static void init_rusage(VacRUsage *ru0);
  static char *show_rusage(VacRUsage *ru0);

-
  /*
   * Primary entry point for VACUUM and ANALYZE commands.
   */
--- 159,166 ----
  static bool enough_space(VacPage vacpage, Size len);
  static void init_rusage(VacRUsage *ru0);
  static char *show_rusage(VacRUsage *ru0);
+ static void check_limits(void);

  /*
   * Primary entry point for VACUUM and ANALYZE commands.
   */
***************
*** 236,241 ****
--- 236,242 ----

      /* clean up */
      vacuum_shutdown();
+     check_limits();
  }

  /*
***************
*** 2645,2648 ****
--- 2646,2672 ----
               (int) (ru1.tv.tv_usec - ru0->tv.tv_usec) / 10000);

      return result;
+ }
+
+ /*
+  *    check if we are near OID or XID wraparound
+  */
+ static void check_limits(void)
+ {
+     Oid nextOid;
+
+     /* If we are 75% to the limit, warn the user */
+     if (GetCurrentTransactionId() >
+         ~(TransactionId)0 - (~(TransactionId)0) / 4)
+         elog(NOTICE,"You are within 75%% of the limit for transaction ids.\n"
+             "Dumping your databases, running initdb, and reloading will reset\n"
+             "the transaction id counter.");
+
+     /* If we are 75% to the limit, warn the user */
+     GetNewObjectId(&nextOid);
+     if (nextOid > ~(Oid)0 - (~(Oid)0) / 4)
+         elog(NOTICE,"You are within 75%% of the limit for object ids.\n"
+             "If you are not using object ids as primary keys, dumping your\n"
+             "databases, running initdb, and reloading will reset\n"
+             "the oid counter.");
  }

Re: Patch to warn about oid/xid wraparound

From
Lamar Owen
Date:
On Tuesday 12 June 2001 19:33, Bruce Momjian wrote:
> Here is a patch that will warn you during VACUUM when you are within 75%
> of oid/xid wraparound.

> I will apply it if 7.2 has no solution to the wraparounds.

Is this something a potential 7.1.3 release might need?  I consider this a 
bug workaround, actually.  Or even a feature patch against 7.1.x that people 
can download if they think they need it?

As PostgreSQL gets used in bigger and bigger database installations, the 
wraparound problems become more and more likely.  And it's likely to be at 
least six months before 7.2beta, if the track record stays the same as it has 
the last three releases.
--
Lamar Owen
WGCR Internet Radio
1 Peter 4:11


Re: Patch to warn about oid/xid wraparound

From
Bruce Momjian
Date:
> On Tuesday 12 June 2001 19:33, Bruce Momjian wrote:
> > Here is a patch that will warn you during VACUUM when you are within 75%
> > of oid/xid wraparound.
>
> > I will apply it if 7.2 has no solution to the wraparounds.
>
> Is this something a potential 7.1.3 release might need?  I consider this a
> bug workaround, actually.  Or even a feature patch against 7.1.x that people
> can download if they think they need it?
>
> As PostgreSQL gets used in bigger and bigger database installations, the
> wraparound problems become more and more likely.  And it's likely to be at
> least six months before 7.2beta, if the track record stays the same as it has
> the last three releases.

Here is an new patch that updates the percentage display when it is run,
rather than just displaying 75%.  I had to do the computation using
floats to prevent overflow.

Again, I will put this in 7.2 if we have no solution for rollover.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
Index: src/backend/commands/vacuum.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/commands/vacuum.c,v
retrieving revision 1.195
diff -c -r1.195 vacuum.c
*** src/backend/commands/vacuum.c    2001/05/25 15:45:32    1.195
--- src/backend/commands/vacuum.c    2001/06/13 18:46:01
***************
*** 159,166 ****
  static bool enough_space(VacPage vacpage, Size len);
  static void init_rusage(VacRUsage *ru0);
  static char *show_rusage(VacRUsage *ru0);

-
  /*
   * Primary entry point for VACUUM and ANALYZE commands.
   */
--- 159,166 ----
  static bool enough_space(VacPage vacpage, Size len);
  static void init_rusage(VacRUsage *ru0);
  static char *show_rusage(VacRUsage *ru0);
+ static void check_limits(void);

  /*
   * Primary entry point for VACUUM and ANALYZE commands.
   */
***************
*** 236,241 ****
--- 236,242 ----

      /* clean up */
      vacuum_shutdown();
+     check_limits();
  }

  /*
***************
*** 2645,2648 ****
--- 2646,2674 ----
               (int) (ru1.tv.tv_usec - ru0->tv.tv_usec) / 10000);

      return result;
+ }
+
+ /*
+  *    check if we are near OID or XID wraparound
+  */
+ static void check_limits(void)
+ {
+     Oid nextOid;
+
+     /* If we are 75% to the limit, warn the user */
+     if (GetCurrentTransactionId() >
+         ~(TransactionId)0 - (~(TransactionId)0) / 4)
+         elog(NOTICE,"You are %.0f%% from the limit for transaction ids.\n"
+             "\t Dumping your databases, running initdb, and reloading will reset\n"
+             "\t the transaction id counter.",
+             GetCurrentTransactionId() - (float)(~(TransactionId)0) * 100);
+
+     /* If we are 75% to the limit, warn the user */
+     GetNewObjectId(&nextOid);
+     if (nextOid > ~(Oid)0 - (~(Oid)0) / 4)
+         elog(NOTICE,"You are %.0f%% from the limit for object ids.\n"
+             "\t If you are not using object ids as primary keys, dumping your\n"
+             "\t databases, running initdb, and reloading will reset\n"
+             "\t the oid counter.",
+             (float)nextOid / (float)~(Oid)0 * 100);
  }

Re: Patch to warn about oid/xid wraparound

From
Peter Eisentraut
Date:
Bruce Momjian writes:

> Here is an new patch that updates the percentage display when it is run,
> rather than just displaying 75%.  I had to do the computation using
> floats to prevent overflow.

You could use ldiv().

Also, UINT_MAX (for transaction id) and OID_MAX (for Oid) might be
preferred over ~0.

Btw., there is a typo here:

>     GetCurrentTransactionId() - (float)(~(TransactionId)0) * 100);

-- 
Peter Eisentraut   peter_e@gmx.net   http://funkturm.homeip.net/~peter