mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
Migrate from using uint32 to uint64 for identifiers #1347
Closed
opened 2025-12-29 16:31:38 +01:00 by adam
·
9 comments
No Branch/Tag Specified
main
update-changelog-comments-docs
feature-removal-issue-type
20911-dropdown
20239-plugin-menu-classes-mutable-state
21097-graphql-id-lookups
feature
fix_module_substitution
20923-dcim-templates
20044-elevation-stuck-lightmode
feature-ip-prefix-link
v4.5-beta1-release
20068-import-moduletype-attrs
20766-fix-german-translation-code-literals
20378-del-script
7604-filter-modifiers-v3
circuit-swap
12318-case-insensitive-uniqueness
20637-improve-device-q-filter
20660-script-load
19724-graphql
20614-update-ruff
14884-script
02496-max-page
19720-macaddress-interface-generic-relation
19408-circuit-terminations-export-templates
20203-openapi-check
fix-19669-api-image-download
7604-filter-modifiers
19275-fixes-interface-bulk-edit
fix-17794-get_field_value_return_list
11507-show-aggregate-and-rir-on-api
9583-add_column_specific_search_field_to_tables
v4.5.0
v4.4.10
v4.4.9
v4.5.0-beta1
v4.4.8
v4.4.7
v4.4.6
v4.4.5
v4.4.4
v4.4.3
v4.4.2
v4.4.1
v4.4.0
v4.3.7
v4.4.0-beta1
v4.3.6
v4.3.5
v4.3.4
v4.3.3
v4.3.2
v4.3.1
v4.3.0
v4.2.9
v4.3.0-beta2
v4.2.8
v4.3.0-beta1
v4.2.7
v4.2.6
v4.2.5
v4.2.4
v4.2.3
v4.2.2
v4.2.1
v4.2.0
v4.1.11
v4.1.10
v4.1.9
v4.1.8
v4.2-beta1
v4.1.7
v4.1.6
v4.1.5
v4.1.4
v4.1.3
v4.1.2
v4.1.1
v4.1.0
v4.0.11
v4.0.10
v4.0.9
v4.1-beta1
v4.0.8
v4.0.7
v4.0.6
v4.0.5
v4.0.3
v4.0.2
v4.0.1
v4.0.0
v3.7.8
v3.7.7
v4.0-beta2
v3.7.6
v3.7.5
v4.0-beta1
v3.7.4
v3.7.3
v3.7.2
v3.7.1
v3.7.0
v3.6.9
v3.6.8
v3.6.7
v3.7-beta1
v3.6.6
v3.6.5
v3.6.4
v3.6.3
v3.6.2
v3.6.1
v3.6.0
v3.5.9
v3.6-beta2
v3.5.8
v3.6-beta1
v3.5.7
v3.5.6
v3.5.5
v3.5.4
v3.5.3
v3.5.2
v3.5.1
v3.5.0
v3.4.10
v3.4.9
v3.5-beta2
v3.4.8
v3.5-beta1
v3.4.7
v3.4.6
v3.4.5
v3.4.4
v3.4.3
v3.4.2
v3.4.1
v3.4.0
v3.3.10
v3.3.9
v3.4-beta1
v3.3.8
v3.3.7
v3.3.6
v3.3.5
v3.3.4
v3.3.3
v3.3.2
v3.3.1
v3.3.0
v3.2.9
v3.2.8
v3.3-beta2
v3.2.7
v3.3-beta1
v3.2.6
v3.2.5
v3.2.4
v3.2.3
v3.2.2
v3.2.1
v3.2.0
v3.1.11
v3.1.10
v3.2-beta2
v3.1.9
v3.2-beta1
v3.1.8
v3.1.7
v3.1.6
v3.1.5
v3.1.4
v3.1.3
v3.1.2
v3.1.1
v3.1.0
v3.0.12
v3.0.11
v3.0.10
v3.1-beta1
v3.0.9
v3.0.8
v3.0.7
v3.0.6
v3.0.5
v3.0.4
v3.0.3
v3.0.2
v3.0.1
v3.0.0
v2.11.12
v3.0-beta2
v2.11.11
v2.11.10
v3.0-beta1
v2.11.9
v2.11.8
v2.11.7
v2.11.6
v2.11.5
v2.11.4
v2.11.3
v2.11.2
v2.11.1
v2.11.0
v2.10.10
v2.10.9
v2.11-beta1
v2.10.8
v2.10.7
v2.10.6
v2.10.5
v2.10.4
v2.10.3
v2.10.2
v2.10.1
v2.10.0
v2.9.11
v2.10-beta2
v2.9.10
v2.10-beta1
v2.9.9
v2.9.8
v2.9.7
v2.9.6
v2.9.5
v2.9.4
v2.9.3
v2.9.2
v2.9.1
v2.9.0
v2.9-beta2
v2.8.9
v2.9-beta1
v2.8.8
v2.8.7
v2.8.6
v2.8.5
v2.8.4
v2.8.3
v2.8.2
v2.8.1
v2.8.0
v2.7.12
v2.7.11
v2.7.10
v2.7.9
v2.7.8
v2.7.7
v2.7.6
v2.7.5
v2.7.4
v2.7.3
v2.7.2
v2.7.1
v2.7.0
v2.6.12
v2.6.11
v2.6.10
v2.6.9
v2.7-beta1
Solcon-2020-01-06
v2.6.8
v2.6.7
v2.6.6
v2.6.5
v2.6.4
v2.6.3
v2.6.2
v2.6.1
v2.6.0
v2.5.13
v2.5.12
v2.6-beta1
v2.5.11
v2.5.10
v2.5.9
v2.5.8
v2.5.7
v2.5.6
v2.5.5
v2.5.4
v2.5.3
v2.5.2
v2.5.1
v2.5.0
v2.4.9
v2.5-beta2
v2.4.8
v2.5-beta1
v2.4.7
v2.4.6
v2.4.5
v2.4.4
v2.4.3
v2.4.2
v2.4.1
v2.4.0
v2.3.7
v2.4-beta1
v2.3.6
v2.3.5
v2.3.4
v2.3.3
v2.3.2
v2.3.1
v2.3.0
v2.2.10
v2.3-beta2
v2.2.9
v2.3-beta1
v2.2.8
v2.2.7
v2.2.6
v2.2.5
v2.2.4
v2.2.3
v2.2.2
v2.2.1
v2.2.0
v2.1.6
v2.2-beta2
v2.1.5
v2.2-beta1
v2.1.4
v2.1.3
v2.1.2
v2.1.1
v2.1.0
v2.0.10
v2.1-beta1
v2.0.9
v2.0.8
v2.0.7
v2.0.6
v2.0.5
v2.0.4
v2.0.3
v2.0.2
v2.0.1
v2.0.0
v2.0-beta3
v1.9.6
v1.9.5
v2.0-beta2
v1.9.4-r1
v1.9.3
v2.0-beta1
v1.9.2
v1.9.1
v1.9.0-r1
v1.8.4
v1.8.3
v1.8.2
v1.8.1
v1.8.0
v1.7.3
v1.7.2-r1
v1.7.1
v1.7.0
v1.6.3
v1.6.2-r1
v1.6.1-r1
1.6.1
v1.6.0
v1.5.2
v1.5.1
v1.5.0
v1.4.2
v1.4.1
v1.4.0
v1.3.2
v1.3.1
v1.3.0
v1.2.2
v1.2.1
v1.2.0
v1.1.0
v1.0.7-r1
v1.0.7
v1.0.6
v1.0.5
v1.0.4
v1.0.3-r1
v1.0.3
1.0.0
Labels
Clear labels
beta
breaking change
complexity: high
complexity: low
complexity: medium
needs milestone
netbox
pending closure
plugin candidate
pull-request
severity: high
severity: low
severity: medium
status: accepted
status: backlog
status: blocked
status: duplicate
status: needs owner
status: needs triage
status: revisions needed
status: under review
topic: GraphQL
topic: Internationalization
topic: OpenAPI
topic: UI/UX
topic: cabling
topic: event rules
topic: htmx navigation
topic: industrialization
topic: migrations
topic: plugins
topic: scripts
topic: templating
topic: testing
type: bug
type: deprecation
type: documentation
type: feature
type: housekeeping
type: translation
Mirrored from GitHub Pull Request
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/netbox#1347
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @bdlamprecht on GitHub (Oct 23, 2017).
Issue type
[X] Feature request
Description
According to the conversation in the NetworkToCode (Slack Channel) on October 19th, NetBox currently uses
uint32for all of itsidvalues. This provides up to a maximum of4,294,967,295unique numbers.While this quantity appears quite large at first glance, I can foresee this becoming a limiting factor when there are multiple devices with unique interfaces and the possibility of each interface consuming several IP addresses (ipv6).
Also, each new
ip-addressuses anidthat never gets reused (even when thatip-addressis deleted) and when scaled out against several VRFs multiplied by each device in theDCIM, that only further exposes this limitation.By transitioning now to use
uint64, this future headache (if not addressed now) will allow for18,446,744,073,709,551,615uniqueidnumbers which allows for a much larger quantity of values that should not be exhausted any time soon (not going to say "never").@darkstar commented on GitHub (Oct 24, 2017):
I think this is not as urgent as you make it seem.
If you create 10 new objects every second, for 24/7, you will hit the limit somewhere around 2030.
If we assume that each object in the database takes up about 250 bytes (just a rough guess), you will hit the limit around the time your database exceeds 1TB in size.
I guess we can safely assume that both of these scenarios are still a while off, even for use-cases with lots and lots of tenants and devices :)
@RyanBreaker commented on GitHub (Oct 24, 2017):
@darkstar /r/theydidthemath
@bdlamprecht commented on GitHub (Oct 24, 2017):
Yes, you are correct, it is not as "urgent" as in I need it by tomorrow.
That being said, although I sense the implied sarcasm, but in my circumstances, my customer currently has over 10,000 networking devices which I will eventually need to import. Each of those devices has several VRFs and in each of those VRFs is at least 25
ip-addresses(ipv4 & ipv6). Similar math came be done forinterfaces.When you account for the changing environment of this customer and that an
idis never re-used once it has been "created" (even upon deletion), this makes your comment less than helpful.So claiming that if I only added 10 objects every second I would be good until 2030 is a little naive.
I appreciate you doing the math, but your comment came of as somewhat arrogant.
@RyanBreaker commented on GitHub (Oct 24, 2017):
We're just having some fun discussion, no arrogance intended, apologies if it came off as such as tones don't always come through text the best.
By that sort of use case I can understand the request for this and would agree on a "why not" basis in the first place, no harm in it anyway. I'll look into how this can be changed, and pinging @jeremystretch on if he knows right away of how to do so or if he has any additional input.
@darkstar commented on GitHub (Oct 24, 2017):
Sorry if I missed your sense of humo(u)r. There was no sarcasm intended, I just wanted to show that most people don't realize how big a number 4.3 billion is (...and, continuing with the maths, even in your case you could import a couple hundred of those customers into NetBox, or have that one customer change his whole infrastructure/IP range a couple of hundred times ;) ).
But I see your point, and I agree with Ryan on the "why not" basis. It's just an ID field anyway...
@RyanBreaker commented on GitHub (Oct 24, 2017):
Looking at this actually, the
idtypes that the application sets up in the database are of Postgres typeINTEGER, a 4-byte signed type, but it also uses a custom sequencer which appears to reuse unused IDs instead of auto-incrementing.All of this appears to go into the inner-workings of the Postgresql driver the application uses with how it sets up the tables in the first place.
@lampwins commented on GitHub (Oct 24, 2017):
Just to chime in; not to throw any fuel on the fire here...
2^32 is a really big number. Also keep in mind the ID's are per table. Meaning you roughly get 2^32 of each kind of object in NetBox, not 2^32 objects in total.
Just a trivial example to show that I really think this is a non issue (for now): taking an example line card from a Nexus 9K which supports 208,000 IPv4 entries, times 10,000 devices, equals 2.08e9 which is less than half of 2^32.
At that scale I question if it is even worth keeping track of information in this manor. If you do manage to get all that data in netbox at some point, I would really like to know how it performs. I have been wanting to so some stress testing in a variety of scenarios for a while but I simple don't have data at that scale.
@jeremystretch commented on GitHub (Oct 25, 2017):
My primary concern with the 32-bit primary key size relates to inventory items. Many devices can have dozens or hundreds of individual components. I have a Juniper EX9200, for instance, with 220 discrete inventory items (most of which are optics).
This is a concern because the most efficient way to update a device's inventory data is to wipe out all of its existing items and create a new object for each detected item. (Yes, there are more intelligent approaches, but they involve somewhat rather complex logic regarding parent relationships and would result in much longer run times.) So, if you're updating inventory data for 5,000 devices, with an average of say 50 items per device, each run increments the PK value by around 250,000. This will exhaust the 32-bit PK space after around 17,000 runs.
Granted, these are fairly large numbers, and 17 thousand runs allows for 46 years of daily inventory runs, but it's still a bit too tangible a number for comfort. Whether it makes sense to expand the field size for all objects or just InventoryItems I don't know.
@jeremystretch commented on GitHub (Jan 19, 2021):
Casually commenting three years later...
Looks like
DEFAULT_AUTO_FIELDis coming in Django 3.2, which should help with this.