Skip to content
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

UPSTREAM: <carry>: ip allocator with reserved addresses #921

Closed
wants to merge 1 commit into from

Conversation

aojea
Copy link

@aojea aojea commented Aug 31, 2021

/kind feature
/kind bug

UPSTREAM: <carry>: ip allocator with reserved addresses

This adds a new bitmap allocator used by the Services IP allocators.

This new bitmap allocator allows to reserve certain offsets, so this
offsets can not be allocated randomly. This offsets are hardcoded
on the code and are not externally configurable.

This is required to guarantee that certain services, in this case
the Openshift DNS service that always uses the IP with offset 10,
ie.. in 192.168.0.0/24 it will use 192.168.0.10, doesn't race with
other components that create services with random allocated IPs.

Signed-off-by: Antonio Ojea <aojea@redhat.com>

@openshift-ci-robot openshift-ci-robot added the backports/unvalidated-commits Indicates that not all commits come to merged upstream PRs. label Aug 31, 2021
@openshift-ci-robot
Copy link

@aojea: the contents of this pull request could not be automatically validated.

The following commits could not be validated and must be approved by a top-level approver:

@aojea
Copy link
Author

aojea commented Aug 31, 2021

/assign @deads2k @Miciah
/cc @danwinship @sttts

Openshift DNS IP reserved, but I left it open because it may be needed for other later

@aojea aojea force-pushed the reserved_random_allocation branch from 715cc3f to 0282d20 Compare August 31, 2021 13:46
@openshift-ci-robot
Copy link

@aojea: the contents of this pull request could not be automatically validated.

The following commits could not be validated and must be approved by a top-level approver:

@aojea aojea force-pushed the reserved_random_allocation branch from 0282d20 to 564ebc6 Compare August 31, 2021 13:47
@openshift-ci-robot
Copy link

@aojea: the contents of this pull request could not be automatically validated.

The following commits could not be validated and must be approved by a top-level approver:

@aojea aojea force-pushed the reserved_random_allocation branch from 564ebc6 to 7e5bf29 Compare August 31, 2021 13:52
@openshift-ci-robot
Copy link

@aojea: the contents of this pull request could not be automatically validated.

The following commits could not be validated and must be approved by a top-level approver:

@deads2k
Copy link

deads2k commented Aug 31, 2021

/approve
/assign @Miciah

@deads2k
Copy link

deads2k commented Aug 31, 2021

/cc @candita

@openshift-ci openshift-ci bot requested a review from candita August 31, 2021 15:21
@openshift-ci
Copy link

openshift-ci bot commented Aug 31, 2021

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: aojea, deads2k

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci openshift-ci bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Aug 31, 2021
@openshift-ci-robot
Copy link

@aojea: the contents of this pull request could not be automatically validated.

The following commits could not be validated and must be approved by a top-level approver:

@openshift-ci-robot
Copy link

@aojea: the contents of this pull request could not be automatically validated.

The following commits could not be validated and must be approved by a top-level approver:

@aojea
Copy link
Author

aojea commented Sep 1, 2021

/retest
doesn't seems related the failures

}

func (rss randomScanStrategyReserved) AllocateBit(allocated *big.Int, max, count int) (int, bool) {
if count >= max {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should you account for the reserved address here, and check if count + 1 >= max? E.g. if you have assigned everything except .10, the reserved one, yet something is still trying to allocate an address with this, will it keep trying even though all addresses have been either handed out or reserved?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the number of addresses available remains the same, the only difference is that the reserved can not be allocated randomly, but still can be allocated directly and should be counted.
The for loop below skip the reserved values and exit after iterating over the whole range

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let me put it another way - when all that is left is the reserved address, I expect that this will just return 0, false without iterating over the whole range. Does it do that?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

that is indeed an optimization, but the problem is that you don't know beforehand if the missing address is the reserved or not.
Assume an allocator with size 4 and the value 1 is the reserved.
Case A:
(1,2,3) values reserved, count=3 , we bail out and don't allocate 4
Case B:
(2,3,4) values reserved, count=3, we bail out because we can't allocate 1 here that is correct

The algorithms keeps being O(n) and the code is much simpler, I think we are good this way

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added TestPostAllocateReservedFull_BitmapReserved and TestPreAllocateReservedFull_BitmapReserved test cases


// 9 is a reserved value used for OpenshiftDNS
// it can only be allocated explicitly using Allocate()
func TestAllocateReservedOffset_BitmapReserved(t *testing.T) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you create a test that tries to allocate the .10 address explicitly?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test in pkg/registry/core/service/ipallocator/patch_allocator_test.go tests that with ip addresses.
It first randomly allocate as much addresses as possible, and then allocates the .10.

@openshift-ci-robot
Copy link

@aojea: the contents of this pull request could not be automatically validated.

The following commits could not be validated and must be approved by a top-level approver:

}
found.Insert(ip.String())
}
if _, err := r.AllocateNext(); err != ErrFull {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the test that exercises the new random/reserved strategy best. Can you point it out?

This adds a new bitmap allocator used by the Services IP allocators.

This new bitmap allocator allows to reserve certain offsets, so this
offsets can not be allocated randomly. This offsets are hardcoded
on the code and are not externally configurable.

This is required to guarantee that certain services, in this case
the Openshift DNS service that always uses the IP with offset 10,
ie.. in 192.168.0.0/24 it will use 192.168.0.10, doesn't race with
other components that create services with random allocated IPs.

Signed-off-by: Antonio Ojea <aojea@redhat.com>
@openshift-ci-robot
Copy link

@aojea: the contents of this pull request could not be automatically validated.

The following commits could not be validated and must be approved by a top-level approver:

@openshift-ci
Copy link

openshift-ci bot commented Sep 14, 2021

@aojea: The following tests failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
ci/prow/e2e-gcp f300734 link true /test e2e-gcp
ci/prow/e2e-aws-serial f300734 link true /test e2e-aws-serial

Full PR test history. Your PR dashboard.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@aojea
Copy link
Author

aojea commented Dec 8, 2021

better solution in kubernetes/enhancements#3071

@aojea aojea closed this Dec 8, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
approved Indicates a PR has been approved by an approver from all required OWNERS files. backports/unvalidated-commits Indicates that not all commits come to merged upstream PRs.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants