bart: extend functionality to make it more useful for implementing a RIB

I am thinking about these new functions:
// Find exact match to pfx, or insert pfx.
// Returns pointer to value, and whether pfx was inserted.
func (t *Table[V]) FetchOrInsert(pfx netip.Prefix) (*V, bool) {...}

This will allow to perform modifications to existing values.  Insert() can then be implemented like
func (t *Table[V]) Insert(pfx netip.Prefix, val V) {
	vp, _ := t.FetchOrInsert(pfx)
	*vp = val
}

// Find  like Lookup but by prefix
// Find does a route lookup for prefix and returns the longest prefix,
// pointer to the associated value and true for success, or false otherwise if
// no route matched.
func (t *Table[V]) Find(pfx netip.Prefix) (lpm netip.Prefix, pv *V, ok bool) {...}

// FindAll  Slice of all matching prefixes and pointers to their values, longest first
func (t *Table[V]) FindAll(pfx netip.Prefix) []struct { pfx netip.Prefix, pv *V }  {...}

I have a ready implementation for fetchOrInsert() but not for the others.

I hit "send" prematurely, so I had to edit the original issue text.  My apologies.

What should FetchOrInsert be useful for? At most I could imagine a Fetch method or let's call it Find, which searches for the exact prefix in the routing table.
But actually bart is a routing table algorithm for longest-prefix-match, the user can also hold in another data structure the information which tuple (prefix/value) he holds in the routing table.

What is the use case for Find(prefix) and FindAll(prefix)?
And the name Find  is also unfortunate, as it searches for the longest-prefix, Find suggests to me an exact match.

FetchOrInsert (or FindOrInsert, I am not insisting on the exact naming) is essentially an optimization and can easily be replaced by the two calls, to ExactFind and to Insert if not found, as you mention.  The reason I think it is worth to have it as a standalone call is to avoid repeating 95% of the operations twice, since the execution of both will be identical until the final decision point.
The use case for it is for example for a BGP implementation or a BMP listener getting information from multiple peers/vantage points and collating this information together in a single table (instead of keeping one per peer).   In this scenario, a lot of the operations will be updates to the existing structure associated with a given prefix, with occasional inserts.   Keeping such information on a side is possible but a waste of memory since the existing RT is perfectly adequate.
Similarly, LPMFind(prefix) (for the lack of a better name;  we are running out of verbs) is quite essential since without it the whole implementation is kinda write-only.  With only Get(ip) or Lookup(ip) BART is only ever useful for implementing a routing table in the strictest sense of the term.
While ExactFind(prefix) can be emulated by LCMFind(prefix) plus a check whether we overshot, its presence makes the whole API a bit more rounded.  Also, it is probably slightly faster.
After some thought, I find that FindAll(prefix) is a bit niche, as it can be easily simulated by a loop of LPMFind(prefix) calls.  (Found <IP_ADDRESS>/24 ?  Now do LPMFind("<IP_ADDRESS>/23").  Found <IP_ADDRESS>/8?  Now do LPMFind("<IP_ADDRESS>/7")`.  Not found?  Stop.)
So, to sum it up, I think that LCMFind(prefix) is essential in general, either StrictFind(prefix) or FindOrInsert(prefix) or both are needed for the use case I have in mind, and let's drop the FindAll().

Insert() has already the update feature, maybe the naming should be Update() instead of insert?
What is missing is the Value() instead of ExactFind(), if really needed.
What do you think about this API naming and feature change? We are still below v1.0.0, an API change is cheap and the user base is small.
  func (t *Table[V]) Update(pfx netip.Prefix, new V) (old V, ok bool)
  func (t *Table[V]) Value(pfx netip) (val V, ok bool)

Insert() could be marked as deprecated.
Let us first discuss this part of your proposal, we will come back to the prefix lookup methods afterwards.

I have no issue with the naming, but there's a slight problem with the API.  For example, using pointer-based FetchOrInsert() a simple counter like this is trivial:
var poInput = []netip.Prefix{
        p("<IP_ADDRESS>/8"),
        p("<IP_ADDRESS>/16"),
        p("<IP_ADDRESS>/24"),
        p("<IP_ADDRESS>/24"),
        p("<IP_ADDRESS>/16"),
        p("<IP_ADDRESS>/24"),
        p("<IP_ADDRESS>/24"),
        p("<IP_ADDRESS>/24"),
        p("<IP_ADDRESS>/24"),
        p("<IP_ADDRESS>/24"),
}

...

       it := new(Table[int])
        for _, item := range poInput {
                iv, found := it.FetchOrInsert(item)
                *iv++
        }
        it.Fprint(os.Stdout)

▼
└─ <IP_ADDRESS>/8 (1)
   └─ <IP_ADDRESS>/16 (2)
      ├─ <IP_ADDRESS>/24 (3)
      └─ <IP_ADDRESS>/24 (4)

And with the proposed Update() the problem is that the new value cannot be calculated from the old value because it needs to be known beforehand.  So we either need to call Value() first - which will lead to doing the same traversal twice,
or we need V to be a pointer itself, and then supply a pointer to zero value as new, and then analyze and potentially copy a lot of information from old.   Incidentally, that was the reason I did not include new in the parameters to FetchOrInsert.
I have no issue with Value().

But this seems to me to be a very special problem of yours, that the payload is only an integer value and should simply be incremented. It would be better to solve this with a different data structure.

This was just an example which was aiming to illustrate the problem of being unable to derive the new value from the old value, in part or in full.

I'm a fan of KISS methods, in naming and in function, I don't like IfThenOr methods, your use case is still very special, I prefer Value() followed by Insert() for your use case.
The Value() method can be implemented without memory allocation. The Value() is very fast, faster than Get/Lookup (no backtracking needed).
If you have big payloads, the value V itself should be a pointer.

I am not sure I agree entirely with having to call both Value() and then Insert() if not found, but I guess I can live with that, so let's consider this settled.  Do you want an implementation from me, or is this something you intend to implement yourself?
And now to the LPM prefix lookup.  :-)
Do you think just adding
func (t *Table[V]) PrefixLookup(pfx netip.Prefix) (lpm netip.Prefix, val V, ok bool)

is feasible?

I'll will implement it, Value() is nearly the same as Delete(), just simpler.
And I'll implement the prefix LPM lookup, the API method name is not fixed yet. See for example also my cidrtree package or the interval package, maybe I'll choose the same names when possible.

Value() is implemented in the devel branch, would you like to review it?

What do you think of the following idea to implement your proposal for FetchOrInsert after all?
func (t *Table[V]) Update(pfx netip.Prefix, callback func(V, bool) V)

The update method has a callback function as a parameter in addition to the prefix. The callback function receives the (value, ok) for the prefix and returns the modified or new value, which is then set as the payload for the prefix in the routing table.

Value() is implemented in the devel branch, would you like to review it?

It looks good.  I tested this version with my code storing 26375555 prefixes (1208207 unique ones), and it worked fast and correct.

What do you think of the following idea to implement your proposal for FetchOrInsert after all?
func (t *Table[V]) Update(pfx netip.Prefix, callback func(V, bool) V)

The update method has a callback function as a parameter in addition to the prefix. The callback function receives the (value, ok) for the prefix and returns the modified or new value, which is then set as the payload for the prefix in the routing table.

That would be great to have, absolutely.  It gives the functionality while avoids dealing with ugliness with pointers.

Have you considered adding a walk (or maybe two, depth-first and breadth-first)?
func (t *Table[V]) Walk(callback func(netip.Prefix V) bool) int

Callback returning false would terminate the walk.  The result would be the number of prefixes visited.

Have you considered adding a walk (or maybe two, depth-first and breadth-first)?
func (t *Table[V]) Walk(callback func(netip.Prefix, V) bool) int

Callback returning false would terminate the walk. The result would be the number of prefixes visited.

The implementation should be simple, since the MarshalXXX is already doing a walk. Will you contribute it?

The implementation should be simple, since the MarshalXXX is already doing a walk. Will you contribute it?

Sure, I'll give it a shot.

The implementation should be simple, since the MarshalXXX is already doing a walk. Will you contribute it?

Sure, I'll give it a shot.

The question is: how is depth-first or breadth-first defined for CIDRs ;)

metrics and dump are also already walking the trie, just to get some inspiration.

The question is: how is depth-first or breadth-first defined for CIDRs ;)

It's still essentially a trie, so those things can be defined, if a bit loosely.   Something like, go through the stride before recursing = breadth-first, recurse as soon as possible = depth-first.   But it is a bit contrieved, so a single walk using a "natural order" should suffice.

back to the update proposal, which callback function signature fits better for your use cases:
1.)
func (t *Table[V]) Update(pfx netip.Prefix, callback func(V, bool) V)

2.)
func (t *Table[V]) Update(pfx netip.Prefix, callback func(netip.Prefix, V, bool) V)

background, with signature #2 the callback would have the whole context: (pfx, value, ok)

I think (1) is quite sufficient since the prefix can be made readily available if needed via using a closure as a callback.

next question, what do you prefer?
1.)
func (t *Table[V]) Update(pfx netip.Prefix, callback func(V, bool) V)

2.)
func (t *Table[V]) Update(pfx netip.Prefix, callback func(V, bool) V) (val V)

returning the updated value to the callsite

Maybe (2) is slightly more useful here.

I just updated the devel branch with a work in progress implementation, no tests yet. Would you be so kind and review it?

Have you considered adding a walk (or maybe two, depth-first and breadth-first)?
func (t *Table[V]) Walk(callback func(netip.Prefix, V) bool) int

Callback returning false would terminate the walk. The result would be the number of prefixes visited.
Having it there would probably make stringification and jsonification simpler, but would be useful beyond that.

I don't think so, since stringification is a very complex recdescent monster, not just a simple walk. The order from top to bottom is in ascending order of the prefix address and the subtree structure is determined by the CIDRs coverage, this is really very tricky.

devel branch: Update() is now as fast as Insert(), and a test is also included.

devel branch: LookupPrefix() is implemented

devel branch: LookupPrefixAll() is implemented, comments about naming and function signature welcome.

Now with the lookup-all method, returning all matching prefixes, I'll delete the LookupShortest(ip), it was just a special use case for me, now also possible with LookupPrefixAll(pfx). Sure, LookupPrefixAll can't be super fast, but I think, we must be as fast as possible with Get(ip)/Lookup(ip)/LookupPrefix(pfx) and Insert, Update, Delete, the are convenience methods with a lot of memory allocations anyway.

IMO: As long as changelog for tagged release provides hints on breaking changes / migration, everything should be fine.

Have you considered adding a walk (or maybe two, depth-first and breadth-first)?
func (t *Table[V]) Walk(callback func(netip.Prefix, V) bool) int

I need it already for Subnets(), will implement it somehow itself.

@maisem @tobez @s3rj1k @mieczkowski
Im not happy with the naming and signatures of the API.
I propose the following simplification:
// longest prefix match
func (t *Table[V]) Get(ip netip.Addr)       (                  val V, ok bool) // input ip
func (t *Table[V]) Lookup(pfx netip.Prefix) (lpm netip.Prefix, val V, ok bool) // input pfx, get the lpm too

func (t *Table[V]) Supernets(pfx netip.Prefix) []netip.Prefix  // all prefixes covering pfx, sorted

func (t *Table[V]) Value(pfx netip.Prefix) (val V, ok bool)    // getter for pfx, or...
func (t *Table[V]) Find(pfx netip.Prefix)  (val V, ok bool)    // ...exact match, instead of Value() ???

Get() is for normal and fast(est) routing queries, the rest tells more about the structure of the routing table and used for table handling itself by routing processes or needed as IPAM functions.
Comments welcome.

I've been wondering whether Get() and Value() can be neatly polymorphed into a single Get(), taking either an Addr or a Prefix?  "Value" is anot a verb, and Get/Find/Lookup gets confusing, fast.
Is there something better than a plain interface{} and a type switch in the implementation?   Even that would work nicely I think, without loosing performance in any meaningful way.

please see the current tip in devel, it has currently the following 'streamlined' API, Value is now called Get,it's just a getter.
And Lookup is (currently) the single longest-prefix-match:
  func (t *Table[V]) Insert(pfx netip.Prefix, val V)
  func (t *Table[V]) Delete(pfx netip.Prefix)
  func (t *Table[V]) Get(pfx netip.Prefix) (val V, ok bool)
  func (t *Table[V]) Update(pfx netip.Prefix, cb func(val V, ok bool) V) V

  func (t *Table[V]) Union(o *Table[V])
  func (t *Table[V]) Clone() *Table[V]

  func (t *Table[V]) Lookup(ip netip.Addr) (val V, ok bool)
  func (t *Table[V]) Subnets(pfx netip.Prefix) []netip.Prefix
  func (t *Table[V]) Supernets(pfx netip.Prefix) []netip.Prefix

  func (t *Table[V]) Overlaps(o *Table[V]) bool
  func (t *Table[V]) OverlapsPrefix(pfx netip.Prefix) bool

  func (t *Table[V]) String() string
  func (t *Table[V]) Fprint(w io.Writer) error
  func (t *Table[V]) MarshalText() ([]byte, error)
  func (t *Table[V]) MarshalJSON() ([]byte, error)

  func (t *Table[V]) Walk(cb func(pfx netip.Prefix, val V) bool) bool
  func (t *Table[V]) Walk4(cb func(pfx netip.Prefix, val V) bool) bool
  func (t *Table[V]) Walk6(cb func(pfx netip.Prefix, val V) bool) bool

  func (t *Table[V]) DumpList4() []DumpListNode[V]
  func (t *Table[V]) DumpList6() []DumpListNode[V]

please see the current tip in devel, it has currently the following 'streamlined' API, Value is now called Get,it's just a getter.

Neat.

And Lookup is (currently) the single longest-prefix-match:
  func (t *Table[V]) Get(pfx netip.Prefix) (val V, ok bool)
  func (t *Table[V]) Lookup(ip netip.Addr) (val V, ok bool)

But what do I do if I want to LPM a Prefix?

Neat.

And Lookup is (currently) the single longest-prefix-match:
  func (t *Table[V]) Get(pfx netip.Prefix) (val V, ok bool)
  func (t *Table[V]) Lookup(ip netip.Addr) (val V, ok bool)

But what do I do if I want to LPM a Prefix?

do you really need a fast LPM lookup of a prefix?
For what use case? If it must not be super fast, you could take the last element of the Supernets() returned slice followed by a Get(lpm).
Another possibility would of course be to have only one Lookup(pfx) method that takes a prefix, because the caller can of course always turn an IP into a /32 or /128 prefix, but I think that you are mainly looking for IP addresses in a routing table and less for prefixes then this would be inconvenient and takes also some ns.
If you really need a Lookup(pfx), then please give me a suitable method name.

What I was thinking is having Lookup accept both, something like:
func (t *Table[V]) Lookup(p interface{}) (val V, ok bool) {
    var pfx netip.Prefix
    switch pp := p.(type) {
    case netip.Addr:
        if pp.Is4() {
            pfx = pp.Prefix(32)
        } else {
            pfx = pp.Prefix(128)
        }
    case netip.Prefix:
        pfx = pp
    default:
        // should not happen
        return
    }
    // the rest of the Lookup based on Prefix
    ...
}

hmm, giving up compile time errors for convenience and having generics and interfaces in one library is not my favourite. And I loose some ns
Again my question: do you really need a superfast Lookup(pfx) ?

hmm, giving up compile time errors for convenience and having generics and interfaces in one library is not my favourite. And I loose some ns

Fair enough.

Again my question: do you really need a superfast Lookup(pfx) ?

No not really, having Supernets() + Get() should be enough.

No not really, having Supernets() + Get() should be enough.

yeah, please give it a try and if not suitable, we can still re-introduce LookupPrefix(pfx) even it's an ugly name ;)

branch devel: rebased and squashed intermediate WIPs, tests are implemented, also some Benchmarks for the new methods.
Ready to test for the interested reader. Please fetch it again

@tobez sorry, could not resist:
func (t *Table[V]) Lookup2(pfx netip.Prefix) (lpm netip.Prefix, val V, ok bool)
    Lookup2 is similar to Lookup, but has a prefix as input parameter and
    returns the lpm prefix in addition to value,ok.

    This method is about 15-20% slower than Lookup and should only be used if
    you either explicitly have a prefix as an input parameter or the prefix of
    the matching lpm entry is also required for other reasons.

    If Lookup2 is to be used for IP addresses, they must be converted to /32 or
    /128 prefixes.

@tobez sorry, could not resist:
func (t *Table[V]) Lookup2(pfx netip.Prefix) (lpm netip.Prefix, val V, ok bool)
    Lookup2 is similar to Lookup, but has a prefix as input parameter and
    returns the lpm prefix in addition to value,ok.

    This method is about 15-20% slower than Lookup and should only be used if
    you either explicitly have a prefix as an input parameter or the prefix of
    the matching lpm entry is also required for other reasons.

    If Lookup2 is to be used for IP addresses, they must be converted to /32 or
    /128 prefixes.

I think 2 is misleading when module is about IP :)

I think 2 is misleading when module is about IP :)
hmm, IP versions 6-4=2
joking aside, I don't understand what you mean

I think 2 is misleading when module is about IP :)

hmm, IP versions 6-4=2 joking aside, I don't understand what you mean

Just call it SlowLookup or anything other that Lookup2 :) where is 2 there can be 3 or even 4 and 4 is IP version)

60ns instead of 40ns is not really slow, the additional ns comes from getting back the lpm prefix since the prefix is not stored in the datastructure

Just LookupPrefix(), mayhaps?

not possible with go

variadic input? why?

Just LookupPrefix(), mayhaps?

somehow misleading, Lookup() returns (val, ok), Lookup2 returns (lpm, val, ok)

so Lookup(ip netip.Addr, pfx ...netip.Prefix) or literally anything else apart from number suffix

so Lookup(ip netip.Addr, pfx ...netip.Prefix) or literally anything else apart from number suffix

and how shall the result look like? My primary intention is to keep the Lookup(ip) as fast as possible, no additional gimmicks for the IP route lookup.

result look like

can be something like this (lpm *netip.Prefix, val V, ok bool)
But I think making second function and naming it more descriptive would be nicer.

result look like

can be something like this (lpm *netip.Prefix, val V, ok bool)

not possible, this takes some ns to get back the lpm, against my first rule, keep Lookup(ip) fast as possible.

But I think making second function and naming it more descriptive would be nicer.

yeah, that's the point, but the description should make it clear, that it's also a lookup (longest-prefix-match) but with different input params AND an additional output param.

How about renaming original Lookup to something else? Fetch,  Get, Find, ...

it was Get(), tailscale/art calls it Get, but this is bad, it's a routing table lookup, the lookup is special in that it is a longest prefix match, not just a get or find or fetch

@tobez @s3rj1k
  func (t *Table[V]) LookupExtra(pfx netip.Prefix) (lpm netip.Prefix, val V, ok bool)
  func (t *Table[V]) LookupMore(pfx netip.Prefix) (lpm netip.Prefix, val V, ok bool)
  func (t *Table[V]) LookupOther(pfx netip.Prefix) (lpm netip.Prefix, val V, ok bool)
  func (t *Table[V]) LookupBonus(pfx netip.Prefix) (lpm netip.Prefix, val V, ok bool)
  func (t *Table[V]) LookupLuxury(pfx netip.Prefix) (lpm netip.Prefix, val V, ok bool)

LookupLuxury

$$$

LookupLuxury

$$$

Well, it's 50% more expensive in nanoseconds...

next try:
  func (t *Table[V]) Lookup(ip netip.Addr)             (val V, ok bool)
  func (t *Table[V]) LookupPrefix(pfx netip.Prefix)    (val V, ok bool)
  func (t *Table[V]) LookupPrefixLPM(pfx netip.Prefix) (lpm netip.Prefix, val V, ok bool)

full is the default-free Internet Routing table with:
1062046 all prefixes
 901899  IPv4 prefixes
 160147  IPv6 prefixes

merged to main, bumped version to v0.5.0


Allow to change bundle size and view

Is your feature request related to a problem? Please describe.
Currently you are stuck with large bundles with list view. It would be great if you could change the view and budle size similar to start menu tiles (expact +1 more which sets the bundle height to items (files) height)
Describe the solution you'd like
see above
Describe alternatives you've considered
Currently there's no alternatives except not using bundles at all.
Additional context

It would also be good to be able to resize Bundles larger. Currently there appears to be a limit of 8 items per bundle. It would good if the size of the Bundle could be manually reshaped, or to have different view options - grid, list, tile etc.

I would also like to be able to adjust the size of the group-tiles. If they contain only a few (for example two or three) files/folders they take up a lot of space. So I think the idea of a size selection (for example like the tiles in the Windows start menu) is good.
AND: Could the activation/deactivation of the group-tiles be made more easily accessible? For example via the three-point-menu in the top right.

Considering the tags feature is replaceing bundles so im going to close this.


allow anonymous functions

fun () {
   print("hi")
}

Usage:
let Lol = { "test": fun() { return "ok" } };

print(Lol.test())

Closed by https://github.com/xHyroM/frog/commit/f06e7346e5ca3f8bb685ea9e56e70669cdb14507


PR: Add clear button to find comboboxes

Fixes #5373

@dalthviz, please review that this is working locally for you.

@ccordoba12  I tested locally and worked for me :+1: (tested in PyQt4 and PyQt5)

Thanks @dalthviz!


CircleCI test for discogapic

Temporarily using a custom build.gradle for the artifact, which was built directly by the gapic-generator fatjar.

Codecov Report

Merging #2412 into master will not change coverage.
The diff coverage is n/a.

@@            Coverage Diff            @@
##             master    #2412   +/-   ##
=========================================
  Coverage     86.72%   86.72%
  Complexity     5241     5241
=========================================
  Files           458      458
  Lines         20867    20867
  Branches       2252     2252
=========================================
  Hits          18096    18096
  Misses         1968     1968
  Partials        803      803

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update ef87bd8...cda3eb5. Read the comment docs.

PTAL


Incorporate sequence into Snowplow for log file parsing

https://github.com/strace/sequence

Migrated to https://github.com/snowplow/enrich/issues/178


Sanitation setup

Pylama, isort and mypy are setup. The same tools are used in pre-commit hook which can be checked at .pre-commit-config.yaml file. These tools are set up with travis CI which can be checked  at .travis.yml file.
fixes #7

Please setup logging as well :D

Yes :)
On Tue, Jul 2, 2019 at 1:48 PM Raghavendra Kaushik<EMAIL_ADDRESS>wrote:

@rakaar commented on this pull request.
In .travis.yml
https://github.com/iit-technology-ambit/common-backend/pull/11#discussion_r299357344
:

@@ -0,0 +1,12 @@
+language: python
+python: -"3.6"

should there be any change is Pipfile , where it is
[requires]python_version="3.6"
—
You are receiving this because you were assigned.
Reply to this email directly, view it on GitHub
https://github.com/iit-technology-ambit/common-backend/pull/11?email_source=notifications&email_token=AH2K2IGWAGP6JSPUQNPVZ7TP5MFMZA5CNFSM4H4Y7Z4KYY3PNVWWK3TUL52HS4DFWFIHK3DMKJSXC5LFON2FEZLWNFSXPKTDN5WW2ZLOORPWSZGOB5GW5IA#discussion_r299357344,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AH2K2IECBENOZIQ2FTASNN3P5MFMZANCNFSM4H4Y7Z4A
.

1)Removed the .vscode folder
2)changed Python version to 3.7 in Pipfile and .travis.yml file
3)Conifguration files for sanity tests:

pylama : pylama.ini (as in README.md of pylama project)
isort: .isort.cfg (as in README.md of isort project)
mypy: mypy.ini (as in Sample Platform of CC Extractor)

@rakaar Can you please add information about this in a new file CONTRIBUTING.md as well?
For an example on how to write about them, see Etiquettes under Contributing here in sample-platform README.md
Also add the instructions that one should run pre-commit install as the first thing after installing dependencies.

@thealphadollar , Can you tell more about what should be present in Contributing.md for this proj

@rakaar I've attached a template contributing.md you can use. Our main purpose should be to convey what all standard we follow in the code as well as the organisation. You should mention that our code passes through x, y and z checks (in bullet form as in template) and what they ensure. Also, we should mention how we ensure that these are enforced (using pre-commit hook and CI tests).
Use your own creativity and I'll improve it when you send in the PR :smile:
https://gist.github.com/PurpleBooth/b24679402957c63ec426

Thank you. Looks great to me :D


Level 24 is difficult for understand

How can I resolve it?

grid-template-columns: 50px repeat(3, 1fr) 50px

Faced the same misunderstanding. I was wondering why 50px 3fr 50px was not working. We need 3 more columns.
Other alternative: grid-template-columns: 50px 1fr 1fr 1fr 50px;

This also states "3 or more" fractional columns, which can never work.

Who else arrived here after spending some time stuck on level 24? It was genuinely perplexing for me 😄.


WIP: Staking fixes

Closes #842
Closes #880

Hide grey bar when we previously had 0 bonded to a validator
Show inline errors when user tries to bond too much
Indicate if a validator is revoked
Fetch validator set when fetching candidates, so we can indicate which candidates are currently validators (closes #880)

I can't really reproduce the remaining bugs in #842 with my local testnet. It would be easier if the testnet was up, but we should probably merge the changes we have in the PR so far, then put the remaining problems into their own ticket(s).

Pulling in @nylira and @jolesbi for design

The only thing added is the ~slashed out~ validator name and "REVOKED", which is simple, but usable. Let's add a TmFormMsg below "REVOKED" validators that explains what revoked means.
Did we solve the question of what delegators can do if they delegated tokens to revoked validator?

@rigelrozanski What can delegators do if they delegated tokens to revoked validator?

@faboweb When a validator is revoked it begins the unbonding process. During the unbonding process a delegator can either instantaneously redelegate, OR commit to unbonding. During this unbonding process if the validator is unrevoked and becomes bonded again (if they are in the top 100 validators) then they will automatically bond all the stake associated with that validator as well as all their delegators stake who haven't redelegated  or who have NOT committed to unbonding.
The same mechanisms apply after the validator has been unbonding enough and it now fully unbonded, delegators can then opt to commit to unbonding, but since the unbonding period has already passed they will simply get their funds instantaneously

Nice. Thank you for the clarification.

Added the warning. For simplicity I added the warning once, if there are any revoked validators.

Can someone approve that PageBond is fully tested?
Screenshot of local coverage:

I got this error trying to unbond after previously bonding to myself on local-testnet

Thank you for testing. I will investigate.

I got this error trying to unbond after previously bonding to myself on local-testnet

What version of gaia are you running?

running local testnet as per fabo's recent docs update
0.19.0-c6711810

I confirm @okwme error.
Also have these errors (might be unrelated):

Apparently no shares are submitted in the POST?

Tests for the delegation module are completely commented out. Let's readd them.

I can't get to the PageBond after bonding:

Posted errors are fixed.
Note: Unbonding shares are currently not accessible but will be in future SDK versions.
Let's test the existing code properly and get this merged.

Using local testnet i import my new account and go to staking page.

I see myself, am already selected, click next, put 10 into the input to add 10 atom, click checkbox, click submit.

I'm sent back to validators page, I see my node now has 10 more total votes to equal 110, but under "your votes" is still says 0.

I click next again, looks like i have 0 bonded to this validator (myself), bond 10 more, click checkbox, click submit.

I'm sent back to validators page, I see my node now has 10 more total votes to equal 120, under "your votes" it says 110

I refresh the page and have 120 listed under "your votes"

I click next, in the already bonded input box it says "119.99999999999" with an error below that says "Atoms must contain only numerals"

I take the slider down to 0 so that the unbonding orange slider increases until<PHONE_NUMBER>9

I click the checkmark, then click submit and I get the following Error:

Codespace: 4
Code:      203
ABCICode:  262347
Error:     --= Error =--
Message: bad shares provided as input, must be MAX or decimal
Cause: <nil>
T: 0xcb
Msg Traces:
--= /Error =--

=== /ABCI Log ===

I change my unbonding amount to 3.999999 so that my bonded amount is equal to 116

Click submit and get the same error

I increase my bonds to 140, click submit and get the following error:

json: cannot unmarshal number 20.000000000000014 into Go struct field Coin.amount of type int64

ok, landing back in the updated app i still had this strange decimal balance of atoms delegated to myself. Trying to increase them resulted in the json: cannot unmarshal... error above. Making them lower succeeded and took me back to the validator page. Clicking next to adjust again, I tried to take the balance all the way down to 0. This succeeded also.
In the list of all validators (where I am the only one) I now have 0 votes, but also 100% of the votes (because i am the only one i guess). It says NaN under total votes with a full bar.
 Will check the errors tomorrow!
billy rennekamp<EMAIL_ADDRESS>schrieb am Mi., 11. Juli 2018,
17:52:

new local chain install with fresh seeds and screenshots:
first view:
[image: screenshot 2018-07-11 17 38 30]
https://user-images.githubusercontent.com/964052/42583861-2b84d768-8532-11e8-8411-8fed6c5da71c.png
staking page:
[image: screenshot 2018-07-11 17 38 23]
https://user-images.githubusercontent.com/964052/42583871-31c05774-8532-11e8-99af-02e7340d31d1.png
bonding page:
[image: screenshot 2018-07-11 17 38 39]
https://user-images.githubusercontent.com/964052/42583888-3a1c07ce-8532-11e8-8520-1a9fde4d4123.png
increase:
[image: screenshot 2018-07-11 17 38 51]
https://user-images.githubusercontent.com/964052/42583916-4eb8e828-8532-11e8-8b31-02e34c61743d.png
submit:
[image: screenshot 2018-07-11 17 38 58]
https://user-images.githubusercontent.com/964052/42583930-59fc8b54-8532-11e8-8079-f0a99505397e.png
bond again:
[image: screenshot 2018-07-11 17 39 08]
https://user-images.githubusercontent.com/964052/42583944-64bcf52e-8532-11e8-8ad4-967544e8b1aa.png
increase again:
[image: screenshot 2018-07-11 17 39 20]
https://user-images.githubusercontent.com/964052/42583950-69991302-8532-11e8-9759-736159b6245c.png
submit:
[image: screenshot 2018-07-11 17 39 26]
https://user-images.githubusercontent.com/964052/42583969-745725ae-8532-11e8-8c0a-2066e56e9124.png
hit refresh (notice"Your Votes" increases by 100):
[image: screenshot 2018-07-11 17 39 44]
https://user-images.githubusercontent.com/964052/42584003-7f46640c-8532-11e8-9e50-6c4826aea01d.png
bond again and we got funny stuff:
[image: screenshot 2018-07-11 17 39 55]
https://user-images.githubusercontent.com/964052/42584062-a4c4f1bc-8532-11e8-94b8-e7feba63e5f6.png
increase:
[image: screenshot 2018-07-11 17 40 05]
https://user-images.githubusercontent.com/964052/42584103-bd806a74-8532-11e8-9e16-2279de354b37.png
error:
[image: screenshot 2018-07-11 17 40 11]
https://user-images.githubusercontent.com/964052/42584113-c35b5e68-8532-11e8-89da-4d278b17fbce.png
decrease:
[image: screenshot 2018-07-11 17 40 24]
https://user-images.githubusercontent.com/964052/42584133-cced0a3a-8532-11e8-80d5-bf678dce2295.png
error:
[image: screenshot 2018-07-11 17 40 28]
https://user-images.githubusercontent.com/964052/42584150-d231fdde-8532-11e8-86f7-5f23c9b87171.png
decrease all:
[image: screenshot 2018-07-11 17 40 36]
https://user-images.githubusercontent.com/964052/42584176-e1b6f2dc-8532-11e8-8b46-cfe3a2b0178b.png
error:
[image: screenshot 2018-07-11 17 40 40]
https://user-images.githubusercontent.com/964052/42584190-e98a55a8-8532-11e8-8f53-1de908a1634b.png
wallet:
[image: screenshot 2018-07-11 17 41 05]
https://user-images.githubusercontent.com/964052/42584245-08260016-8533-11e8-9c36-a39e4b5e5e33.png
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/cosmos/voyager/pull/912#issuecomment-404219998, or mute
the thread
https://github.com/notifications/unsubscribe-auth/AFmO2acQHsU9AgyrlZ9Oxk_rerm_aTIgks5uFh8tgaJpZM4VAMTN
.

https://github.com/cosmos/cosmos-sdk/issues/1637

I am seeing similar problems with the stake calculation:
Starting of with 0 bond
Validator has 100 steak
Bonding 10
Bonding 10
Validator has 120 steak, I have 11
Data:
/stake/validators
[{"owner":"cosmosvaladdr1znx55r09uks9kreft3rrn22j3cpf6mh5kt3n4j","pub_key":"cosmosvalpub1zcjduc3q9gax50xwp8h8fw22nm8d2qkk8fx8sh7pv6r3g3galwptfzmdj66squ49n5","revoked":false,"pool_shares":{"status":2,"amount":"120"},"delegator_shares":"120/11","description":{"moniker":"local","identity":"","website":"","details":""},"bond_height":0,"bond_intra_tx_counter":0,"proposer_reward_pool":null,"commission":"0","commission_max":"0","commission_change_rate":"0","commission_change_today":"0","prev_bonded_shares":"0"}]
```

/stake/cosmosaccaddr1znx55r09uks9kreft3rrn22j3cpf6mh5s6yymt/bonding_status/cosmosvaladdr1znx55r09uks9kreft3rrn22j3cpf6mh5kt3n4j
```
{"delegator_addr":"14CD4A0DE5E5A05B0F295C4639A9528E029D6EF4","validator_addr":"14CD4A0DE5E5A05B0F295C4639A9528E029D6EF4","shares":"120/11","height":217}
```

Pulling in @rigelrozanski for debugging.

so we decided to merge this and make a new issue right?

If you approve the code. ;)


feat(logstash): allow httpsAgent option in LogStashHttpAppender

Pull Request Test Coverage Report for Build<PHONE_NUMBER>

0 of 0   changed or added relevant lines in 0 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage remained the same at 91.107%

Totals

Change from base Build<PHONE_NUMBER>:
0.0%

Covered Lines:
417

Relevant Lines:
441

💛  - Coveralls


added measure_number_map

I don't want to be annoying, but maybe 2 tests for this? Like 1 for the anacrusis and one for a bar in the middle of the score.

sure!

I added this plus unittest to another PR. This one is closed.


Add v1 crate feature for conditional wasmi_v1 usage

This PR allows to conditionally enable or disable the new wasmi_v1 implementation.
Partially implements https://github.com/paritytech/wasmi/issues/306.

Codecov Report

Merging #329 (1ecea9b) into master (4b8dc4a) will not change coverage.
The diff coverage is n/a.

@@           Coverage Diff           @@
##           master     #329   +/-   ##
=======================================
  Coverage   80.09%   80.09%
=======================================
  Files          71       71
  Lines        9298     9298
=======================================
  Hits         7447     7447
  Misses       1851     1851

Impacted Files
Coverage Δ

src/lib.rs
27.27% <ø> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 4b8dc4a...1ecea9b. Read the comment docs.


MongoDB sink connector

Hi, While doing a POC, got the following errors. The log file is also attached below.
The configuration are according to the documentation and also exported the Classpath for the jar file.

ERROR Task kafka-connector-mongodb-sink-0 threw an uncaught and unrecoverable exception (org.apache.kafka.connect.
runtime.WorkerTask:148)
java.lang.NoSuchMethodError: org.apache.kafka.common.config.AbstractConfig.(Ljava/util/Map;)V

ERROR Task startappdev-kafka-connect-mongodb-0 threw an uncaught and unrecoverable exception (org.apache.kafka.connect.runtime.WorkerSinkTask:455)
java.lang.ClassCastException: java.util.HashMap cannot be cast to org.apache.kafka.connect.data.Struct
Log.txt

Hi can you please add additional info on how you are starting the mongoDb connector ?
Also can you post your Worker configuration and kafka-connect configuration ?

should be fixed when #32 is resolved


fix: do not exit on empty arguments

Fix #1706
Compare the slice of arguments with an empty slice and a slice with one empty string. (credit @olblak)
Test
To test this pull request, you can run the following commands:
cat > test.yml << EOF
name: test
pipelineid: test

sources:
  one:
    name: 'Check {{ $updateChannel }} channel'
    kind: shell
    spec:
      command: echo 1
targets:
  one:
    name: 'Check {{ $updateChannel }} channel'
    kind: shell
    spec:
      command: echo 1
EOF
go run . apply "" --config test.yml

Additional Information
Tradeoff

Potential improvement

Thanks for the pullrquest, I am planning to trigger a release in the coming days as I made a few fixes around the registry


Removed the [bone] mod

#### Bugged and useless

[X] Removed the bone mod => https://github.com/MinetestForFun/minetest-minetestforfun-server/commit/0cde41ff4919f7f11f0ed400aae9485c53583bcb

https://github.com/MinetestForFun/minetest-minetestforfun-server/commit/0cde41ff4919f7f11f0ed400aae9485c53583bcb


Switch up how targets groups are associated with the ASG

Small change to how we associate target groups with the ASG in the asg module

[ ] Update the changelog
[ ] Make sure that modules and files are documented. This can be done inside the module and files.
[ ] Make sure that new modules directories contain a basic README.md file.
[ ] Make sure that the module is added to tests/main.tf
[ ] Make sure that the linting passes on CI.
[ ] Make sure that there is an up to date example for your code:
- For new modules this would entail example code for how to use the module or some explanation in the module readme.
- For new examples please provide a README explaining how to run the example. It's also ideal to provide a basic makefile to use the example as well.
[ ] Make sure that there is a manual CI trigger that can test the deployment.

We're currently using this in practice now and have shown it to work. I can link to examples but I'd like to work to get this reviewed and merged. (And we can updated any places where they refer to the branch in this PR).

Nice change, I like it, it solve a problem of using both target_group_arns and aws_autoscaling_attachment at the same time, mainly because the default value for the variable was [] that made target_group_arns count as used, which made terraform nuts when planning.
I just add a small change to replace the count for a foreach, as having a count might make the plans horrible if you for example delete one element, it would become a cascade update and might generate some errors in the deployment

I revert from for each to count as you would get errors like:
The "for_each" value depends on resource attributes that cannot be determined
until apply, so Terraform cannot predict how many instances will be created.
To work around this, use the -target argument to first apply only the
resources that the for_each depends on.

that, although not impossible to solve using for depends_on, makes using the module a bit harder

as validation, I have made
test1.tf that shows the current state of the issue, after applying once, applying again does:
Terraform will perform the following actions:

  # module.asg.aws_autoscaling_group.cluster will be updated in-place
  ~ resource "aws_autoscaling_group" "cluster" {
        arn                       = "arn:aws:autoscaling:us-west-2:793514493597:autoScalingGroup:92b5938d-bc1d-4fdf-a6b6-e3579cf5a82d:autoScalingGroupName/jose-cluster20200330211542083500000003"
        availability_zones        = [
            "us-west-2a",
            "us-west-2b",
        ]
        default_cooldown          = 300
        desired_capacity          = 1
        enabled_metrics           = []
        force_delete              = true
        health_check_grace_period = 300
        health_check_type         = "EC2"
        id                        = "jose-cluster20200330211542083500000003"
        launch_configuration      = "terraform-20200330211539726100000002"
        load_balancers            = []
        max_instance_lifetime     = 0
        max_size                  = 1
        metrics_granularity       = "1Minute"
        min_size                  = 1
        name                      = "jose-cluster20200330211542083500000003"
        name_prefix               = "jose-cluster"
        protect_from_scale_in     = false
        service_linked_role_arn   = "arn:aws:iam::793514493597:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling"
        suspended_processes       = []
        tags                      = [
            {
                "key"                 = "Name"
                "propagate_at_launch" = "true"
                "value"               = "jose-cluster"
            },
        ]
      ~ target_group_arns         = [
          - "arn:aws:elasticloadbalancing:us-west-2:793514493597:targetgroup/test1-https-tg/f0b9ae61cd2ac918",
        ]
        termination_policies      = []
        vpc_zone_identifier       = [
            "subnet-022fee224c80dcbdb",
            "subnet-05a6c059ff79508d5",
        ]
        wait_for_capacity_timeout = "10m"
    }

Plan: 0 to add, 1 to change, 0 to destroy.
Terraform will perform the following actions:

  # module.asg.aws_autoscaling_group.cluster will be updated in-place
  ~ resource "aws_autoscaling_group" "cluster" {
        arn                       = "arn:aws:autoscaling:us-west-2:793514493597:autoScalingGroup:92b5938d-bc1d-4fdf-a6b6-e3579cf5a82d:autoScalingGroupName/jose-cluster20200330211542083500000003"
        availability_zones        = [
            "us-west-2a",
            "us-west-2b",
        ]
        default_cooldown          = 300
        desired_capacity          = 1
        enabled_metrics           = []
        force_delete              = true
        health_check_grace_period = 300
        health_check_type         = "EC2"
        id                        = "jose-cluster20200330211542083500000003"
        launch_configuration      = "terraform-20200330211539726100000002"
        load_balancers            = []
        max_instance_lifetime     = 0
        max_size                  = 1
        metrics_granularity       = "1Minute"
        min_size                  = 1
        name                      = "jose-cluster20200330211542083500000003"
        name_prefix               = "jose-cluster"
        protect_from_scale_in     = false
        service_linked_role_arn   = "arn:aws:iam::793514493597:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling"
        suspended_processes       = []
        tags                      = [
            {
                "key"                 = "Name"
                "propagate_at_launch" = "true"
                "value"               = "jose-cluster"
            },
        ]
      ~ target_group_arns         = [
          - "arn:aws:elasticloadbalancing:us-west-2:xxxxxxxxxxxxxxxx:targetgroup/test1-https-tg/xxxxxxxxxxxxxxxx",
        ]
        termination_policies      = []
        vpc_zone_identifier       = [
            "subnet-xxxxxxxxxxxxxxxxxxx",
            "subnet-xxxxxxxxxxxxxxxxxxx",
        ]
        wait_for_capacity_timeout = "10m"
    }

Plan: 0 to add, 1 to change, 0 to destroy.

it removes the target_group_arns even though no change has been done. Applying another time I get:
Terraform will perform the following actions:

  # aws_autoscaling_attachment.asg_alb will be created
  + resource "aws_autoscaling_attachment" "asg_alb" {
      + alb_target_group_arn   = "arn:aws:elasticloadbalancing:us-west-2:xxxxxxxxxxxxxx:targetgroup/test1-https-tg/xxxxxxxxxxxxxxxxx"
      + autoscaling_group_name = "jose-clusterxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      + id                     = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

restoring the aws_autoscaling_attachment, after that apply will loop the two last changes every time I apply. I add
test2.tf which uses this MR on the asg and applying multiple times results in no changes

I'm going to hold off deleting the branch for now until I've updated the places internally where this is used (but I will remove it soon).


Client IP is sent to downstream with Cache Purge request, instead of upstream pagespeed ip.

I have nginx as a downstream caching proxy.  When pagespeed emits a cache purge to the downstream, the original client IP is sent with it.  Example from my logs:
172.218.???.??? - - [10/Dec/2015:18:38:51 -0500] "GET /purge/storage-auctions/affordable-mini-storage/unit-120 HTTP/1.1" 200 330 "https://dev.bid13.c
om/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 mod_pagespeed/<IP_ADDRESS>
0-7423"
Where 172.218.???.??? is my public IP address of my home ISP, redacted for obvious reasons.
This forces me to use a insecure purge location block:
location ~ /purge(/.*) {
  allow all;
  proxy_cache_purge main $ps_capability_list$scheme$host$1$is_args$args;
}

Is there a workaround to this?

Are there any X-Forwarded-For or X-Real-IP headers involved? Custom log formatting?

Yes, i am using those because i needed my upstream to see the IP address of the client. without those the upstream saw <IP_ADDRESS>:port.
My config:
# Define a mapping used to mark HTML as uncacheable.
map $upstream_http_content_type $new_cache_control_header_val {
    default $upstream_http_cache_control;
    "~*text/html" "no-cache, max-age=0";
}

###########################
#  HTTP->HTTPS REDIRECT   #
###########################
server {
  listen         <IP_ADDRESS>:80;
  server_name    dev.bid13.com;
  pagespeed off;
  root /var/www/dev.bid13.com/public_html/drupal;
  location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc|webp)$ {
    expires 1M;
    add_header Cache-Control "public";
    try_files $uri =404;
  }
  location /{
    return 301 https://dev.bid13.com$request_uri;
  }
}

####################
#  DRUPAL BACKEND  #
####################
server {
    listen <IP_ADDRESS>:9998;
    server_name dev.bid13.com;
    root /var/www/dev.bid13.com/public_html/drupal;
    access_log  /var/www/dev.bid13.com/log/drupal-access.log;
    error_log   /var/www/dev.bid13.com/log/drupal-error.log info;

    set_real_ip_from   <IP_ADDRESS>;
    real_ip_header     X-Forwarded-For;
    pagespeed off;
    index index.php;
    charset utf-8;
    include /etc/nginx/global/h5bp/basic.conf;
    include global/drupal-cached.conf;
    # nginx strips this header - but we want it to propagate down to the cache layer first
    fastcgi_pass_header X-Accel-Expires;
    # We don't trust drupal's cache control, we controll it ourselves with X-Accel-Expires
    fastcgi_hide_header Cache-Control;
}

####################
# PAGE SPEED LAYER #
####################
server {
    listen <IP_ADDRESS>:9997;
    server_name dev.bid13.com;
    access_log  /var/www/dev.bid13.com/log/ps-access.log;
    error_log   /var/www/dev.bid13.com/log/ps-error.log info;

    set_real_ip_from   <IP_ADDRESS>;
    real_ip_header     X-Forwarded-For;

    pagespeed on;

    pagespeed FetchHttps enable;
#    pagespeed LowercaseHtmlNames on;
    pagespeed PreserveUrlRelativity off;
    pagespeed Domain bid13.com;
    pagespeed Domain *.bid13.com;
    pagespeed Domain *.cdn.bid13.com;

    # allow pagespeed to bypass https & get files directly from upstream backend
    pagespeed MapOriginDomain "http://localhost:9998" "https://dev.bid13.com";
    pagespeed MapOriginDomain "http://localhost:9998" "https://devkey1.cdn.bid13.com";
    pagespeed MapOriginDomain "http://localhost:9998" "https://devkey2.cdn.bid13.com";

    pagespeed LoadFromFile "https://dev.bid13.com" "/var/www/dev.bid13.com/public_html/drupal/";
    pagespeed LoadFromFile "https://devkey1.cdn.bid13.com" "/var/www/dev.bid13.com/public_html/drupal/";
    pagespeed LoadFromFile "https://devkey2.cdn.bid13.com" "/var/www/dev.bid13.com/public_html/drupal/";

    # Spread resources across our CDNs
    #pagespeed MapRewriteDomain "https://devkey1.cdn.bid13.com" "http://dev.bid13.com";
    pagespeed MapRewriteDomain "https://dev.bid13.com" "http://dev.bid13.com";
    pagespeed ShardDomain https://dev.bid13.com https://devkey1.cdn.bid13.com,https://devkey2.cdn.bid13.com;
#    pagespeed ShardDomain http://dev.bid13.com https://devkey1.cdn.bid13.com,https://devkey2.cdn.bid13.com;

    # pagespeed proxy cache integration
    pagespeed EnableCachePurge on;
    pagespeed DownstreamCachePurgeMethod "GET";
    pagespeed DownstreamCachePurgeLocationPrefix "http://<IP_ADDRESS>:9996/purge";
    pagespeed DownstreamCacheRebeaconingKey "<redacted>";

     # These are enabled by default
    pagespeed EnableFilters lazyload_images;
    pagespeed EnableFilters prioritize_critical_css;
    pagespeed EnableFilters convert_png_to_jpeg;
    pagespeed EnableFilters inline_google_font_css;
    pagespeed EnableFilters local_storage_cache;
    pagespeed EnableFilters convert_to_webp_lossless;
    pagespeed EnableFilters insert_image_dimensions;
    pagespeed EnableFilters inline_preview_images;
    pagespeed EnableFilters resize_mobile_images;
    pagespeed EnableFilters remove_comments;
    pagespeed EnableFilters collapse_whitespace;
    pagespeed EnableFilters add_instrumentation;
    pagespeed EnableFilters dedup_inlined_images;
    pagespeed EnableFilters insert_dns_prefetch;
    pagespeed EnableFilters extend_cache;

    # only let adrian access pagespeed admin
    location /ngx_pagespeed_statistics {
        allow <IP_ADDRESS>; # localhost
        allow <IP_ADDRESS>; # Adrian home ip
        allow <IP_ADDRESS>; # server public ip
        deny all;
    }
    location /ngx_pagespeed_global_statistics {
        allow <IP_ADDRESS>; # localhost
        allow <IP_ADDRESS>; # Adrian home ip
        allow <IP_ADDRESS>; # server public ip
        deny all;
    }
    location /ngx_pagespeed_message {
        allow <IP_ADDRESS>; # localhost
        allow <IP_ADDRESS>; # Adrian home ip
        allow <IP_ADDRESS>; # server public ip
        deny all;
    }
    location /pagespeed_console {
        allow <IP_ADDRESS>; # localhost
        allow <IP_ADDRESS>; # Adrian home ip
        allow <IP_ADDRESS>; # server public ip
        deny all;
    }
    location ~ ^/pagespeed_admin {
        allow <IP_ADDRESS>; # localhost
        allow <IP_ADDRESS>; # Adrian home ip
        allow <IP_ADDRESS>; # server public ip
        deny all;
    }
    location ~ ^/pagespeed_global_admin {
        allow <IP_ADDRESS>; # localhost
        allow <IP_ADDRESS>; # Adrian home ip
        allow <IP_ADDRESS>; # server public ip
        deny all;
    }

    location ~ "^/pagespeed_static/" { }
    location ~ "^/ngx_pagespeed_beacon$" { }

    location / {
        proxy_pass http://drupal_backend_dev;
        # Forward Host header to upstream server.
        proxy_set_header Host $host;
        # Pass client information upstream
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        # Strip the crap Expires header drupal gives us back
        # proxy_hide_header Expires;
        # proxy_hide_header Last-Modified;
        proxy_hide_header X-Powered-By;
        proxy_pass_header X-Accel-Expires;
    }
}

#######################
#  PROXY CACHE LAYER  #
#######################
server {
    listen <IP_ADDRESS>:9996;
    server_name dev.bid13.com;
    access_log  /var/www/dev.bid13.com/log/cache-access.log;
    error_log   /var/www/dev.bid13.com/log/cache-error.log info;
    pagespeed off;

    set_real_ip_from   <IP_ADDRESS>;
    real_ip_header     X-Forwarded-For;
    set $upstream "pagespeed_layer_dev";

    # Block 2: Define prefix for proxy_cache_key based on the UserAgent.
    # Define placeholder PS-CapabilityList header values for large and small
    # screens with no UA dependent optimizations. Note that these placeholder
    # values should not contain any of ll, ii, dj, jw or ws, since these
    # codes will end up representing optimizations to be supported for the
    # request.
    set $default_ps_capability_list_for_large_screens "LargeScreen.SkipUADependentOptimizations";
    set $default_ps_capability_list_for_small_screens "TinyScreen.SkipUADependentOptimizations";

    # As a fallback, the PS-CapabilityList header that is sent to the upstream
    # PageSpeed server should be for a large screen device with no browser
    # specific optimizations.
    set $ps_capability_list $default_ps_capability_list_for_large_screens;

    # Cache-fragment 1: Desktop User-Agents that support lazyload_images (ll),
    # inline_images (ii) and defer_javascript (dj).
    # Note: Wget is added for testing purposes only.
    if ($http_user_agent ~* "Chrome/|Firefox/|MSIE |Safari|Wget") {
      set $ps_capability_list "ll,ii,dj:";
    }
    # Cache-fragment 2: Desktop User-Agents that support lazyload_images (ll),
    # inline_images (ii), defer_javascript (dj), webp (jw) and lossless_webp
    # (ws).
    if ($http_user_agent ~* "Chrome/[2][3-9]+\.|Chrome/[[3-9][0-9]+\.|Chrome/[0-9]{3,}\.") {
      set $ps_capability_list "ll,ii,dj,jw,ws:";
    }
    # Cache-fragment 3: This fragment contains (a) Desktop User-Agents that
    # match fragments 1 or 2 but should not because they represent older
    # versions of certain browsers or bots and (b) Tablet User-Agents that
    # correspond to large screens. These will only get optimizations that work
    # on all browsers and use image compression qualities applicable to large
    # screens. Note that even Tablets that are capable of supporting inline or
    # webp images, e.g. Android 4.1.2, will not get these advanced
    # optimizations.
    if ($http_user_agent ~* "Firefox/[1-2]\.|MSIE [5-8]\.|bot|Yahoo!|Ruby|RPT-HTTPClient|(Google \(\+https\:\/\/developers\.google\.com\/\+\/web\/snippet\/\))|Android|iPad|TouchPad|Silk-Accelerated|Kindle Fire") {
      set $ps_capability_list $default_ps_capability_list_for_large_screens;
    }
    # Cache-fragment 4: Mobiles and small screen Tablets will use image compression
    # qualities applicable to small screens, but all other optimizations will be
    # those that work on all browsers.
    if ($http_user_agent ~* "Mozilla.*Android.*Mobile*|iPhone|BlackBerry|Opera Mobi|Opera Mini|SymbianOS|UP.Browser|J-PHONE|Profile/MIDP|portalmmm|DoCoMo|Obigo|Galaxy Nexus|GT-I9300|GT-N7100|HTC One|Nexus [4|7|S]|Xoom|XT907") {
      set $ps_capability_list $default_ps_capability_list_for_small_screens;
    }

    set $bypass_reason "";
    # Block 3a: Bypass the cache for .pagespeed. resource. PageSpeed has its own
    # cache for these, and these could bloat up the caching layer.
    if ($uri ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+") {
      set $bypass_cache "1";
      set $bypass_reason "Bypassed for pagespeed asset";
    }

    # PageSpeed's beacon dependent filters need the cache to let some requests
    # through to the backend.  This code below depends on the ngx_set_misc
    # module and randomly passes 5% of traffic to the backend for rebeaconing.
    set $should_beacon_header_val "";
    set $bypass_cache 0;
    set_random $rand 0 100;
    if ($rand ~* "^[0-4]$") {
      set $should_beacon_header_val "<redacted>";
      set $bypass_cache 1;
      set $bypass_reason "Bypassed For Rebeaconing";
    }
    # Block 3b: Only cache responses to clients that support gzip.  Most clients
    # do, and the cache holds much more if it stores gzipped responses.
    #if ($http_accept_encoding !~* gzip) {
    #  set $bypass_cache "1";
    #  set $bypass_reason "No Gzip Available";
    #}

    if ($uri ~ "live_update\.php") {
      set $bypass_cache "1";
      set $bypass_reason "Never cache live update requests";
      # skip pagespeed entirely
      set $upstream "drupal_backend_dev";
    }

    # Block 4: Location block for purge requests.
    location ~ /purge(/.*) {
      # This looks insecure, but we block access to /purge at the security layer.
      #add_header CachePurge "Purging resource from cache:$1";
      #add_header CacheKey $ps_capability_list$scheme$host$1$is_args$args;
      allow all;
      proxy_cache_purge main $ps_capability_list$scheme$host$1$is_args$args;
    }

    # Look for authenticated users by matching the cookeis sent
    set $drupal_auth "";
    if ($http_cookie ~* "SESS[a-z,0-9]{32}=([a-z,0-9]+);") {
       set $drupal_auth drupal_logged_in_$1;
       # even if pagespeed isn't rebeaconing, we still want to bypass cache
       set $bypass_cache 1;
       set $bypass_reason "Drupal Authentication Detected";

       # I'm not sure if this is correct!!!
       # disable rebeaconing header if user is authenticated
       # set $should_beacon_header_val "";
    }

    location / {
        # upstream pagespeed server
        proxy_pass http://$upstream;
        # Forward Host header to upstream server.
        proxy_set_header Host $host;
        # Pass client information upstream
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        # nginx proxy cache zone
        proxy_cache main;
        # Bypass cache creation for rebeaconing or authenticated users
        proxy_cache_bypass $bypass_cache;

        # Do not serve cached responses for authenticated users
        proxy_no_cache $drupal_auth;

        # Set the proxy cache key
        proxy_cache_key $ps_capability_list$scheme$host$uri$is_args$args;

        # Set the PS-CapabilityList header for PageSpeed server to respect.
        proxy_set_header PS-CapabilityList $ps_capability_list;

        # Allow rebeaconing
        proxy_set_header PS-ShouldBeacon $should_beacon_header_val;
        proxy_hide_header PS-ShouldBeacon;

        # Debug headers
        # add_header DebugCacheKey $ps_capability_list$scheme$host$uri$is_args$args;
        add_header X-Proxy-Cache $upstream_cache_status;
        add_header ByPassReason $bypass_reason;

        # Generally this is overridden by drupal with the X-Accel-Expires header
        proxy_cache_valid 10m; # 200, 301 and 302 will be cached.

        # Fallback to stale cache on certain errors.
        proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_504 http_404;

    }
}

#########################
#  SECURIT / SSL LAYER  #
#########################
server {
    listen <IP_ADDRESS>:443 ssl http2;
    server_name dev.bid13.com;
    ssl on;
    ssl_certificate      /etc/ssl/localcerts/dev.bid13.com.crt;
    ssl_certificate_key  /etc/ssl/localcerts/dev.bid13.com.key;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
    ssl_dhparam /etc/ssl/localcerts/dhparam.pem;
    ssl_session_cache shared:SSL:20m;
    ssl_session_timeout 180m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    access_log off;
    error_log off;
    root /var/www/dev.bid13.com/public_html/drupal;
    charset utf-8;

    pagespeed off;
    gzip_vary on;

    ####### REDIRECTS #######
    error_page 497 https://$host:443$request_uri;
    location = /facilities {
      return 301 /learnmore;
    }
    location = /feedback {
      return 301 /contact-us;
    }

    ##### SECURITY ######
    # deny any requests to cache purge from outside
    # all purge requests happen internally
    location ~ /purge(/.*) {
      deny all;
    }

    location /{
        proxy_pass http://cache_layer_dev;
        # Forward Host header to upstream server.
        proxy_set_header Host $host;
        # Pass client information upstream
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;

        # Prevent browser caching, but allow upstream to use cache control headers for proxy cache
        # Hide the upstream cache control header.
        proxy_hide_header Cache-Control;
        # Add the inferred Cache-Control header.
        add_header Cache-Control $new_cache_control_header_val;
    }
}

Thanks for the configuration, that should help reproducing. I suspect that the code that executes the purge requests copies over the incoming X-Forwarded-For header which would explain the symptoms you are seeing.
I'll have a look and post back here.

I was able to confirm the purge requests copying over X-Real-IP, I think we need to filter a few headers from purge requests before executing them.

Thanks for all your help Otto, I really appreciate it.

In general you do want the purge request to copy over all the headers from the client request.  If you have geocoding dependent content and so have set up a region-specific cache key that's dependent on the client IP, then if pagespeed didn't set X-Real-IP it wouldn't purge properly.
This is causing you a problem because to get purging to work you needed to open up your purge handler to the whole internet.  I agree that's bad and not how it should be configured.  Can you add a check that $realip_remote_addr (see docs) is localhost before purging?

It's actually not that unsafe (i think).  Because on my main SSL block i drop all traffic to /purge:
##### SECURITY ######
# deny any requests to cache purge from outside
# all purge requests happen internally
location ~ /purge(/.*) {
  deny all;
}

With Downstream Caching + Varnish, there is no way to tell whether PURGE request is originating from localhost or not. Only for the simple fact that all the headers are copied by pagespeed's request - it looks like an external request to Varnish.


Oculus Quest controller at wrong angle (pitch) + button mapping

I've noticed that in all VR games on Steam the controllers seem to be at a really awkward bent angle. Is this fixable in the next release or am I simply missing something?
Also, Steam has the Oculus Legacy Layout selected, but for some reason most of the button layout seems to be off. Would I have to remap the controllers for every game?

I've noticed the same controller angle issue (maybe 20-25 degrees too low in games like COMPOUND), hopefully can be made adjustable at some point?

Yeah its super annoying hopefully alpha 6 will fix this

same problem

Same issue for me. Too bad because ALVR runs very well otherwise...

Same here. Too bad because ALVR runs really well otherwise...

Same here.


Validate values of enumerations in simulator specifications

E.g. validate that the value is a valid enumeration of AlgorithmParameter.type

closed in #1435


Config migrator for 1.x to 2.x configurations ?

What are everyone's thoughts on this ?
Do we need one ?
Should we refuse to run if the config doesn't have a version string in it ?
Should we highlight "old" config sections and refuse to start ?
Personally I've been caught out running and old code only to find it still has a boot sequence statement in it!

We definitly need strong schema validation, so an old config will fail to load. We can define a version in config and set valid value in json schema. Then we can be sure that we get no old stuff.
Migration .... don't know. For now I would say no, we have other things to do.

Depending on how much work you invest it is possible or not, as the current configs for hyperion are very  inconsistent i would do a entire cut here.
People should delete and reinstall. Writing a "migration guide" is enough i think.
benefits:

don't waste time on thinking about all available settings combinations and how to extend (migrate) them. For example "lost" settings, renaming, ... For sure this is no fun to program.

Instead of refuse we could think about
Error in schema -> restore hyperion.conig.json.default to keep Hyperion always alive. redPanther already spoke about to keep the webinterface alive and delay hyperion start/fixing issues or start in "save" mode.

More or less dicussed, if someone is bored he could do it. But i take no responsibility for the results. I think the time is still wasted as 2.0 is a big breakpoint so rather work on something more important :)
(my opinion comes also along as i hacked around with our install .sh and i am sure this has the same fun of endless hours of issues /try and error). Due to the point you are forced to expect anything.


Avatar no longer shows

It looks like the code to generate the avatar does not work with the latest hugo. It looks like it's missing a forward slash. This is the new html generated in index.html:

      <meta itemprop="image" content="https://basesite.comimg/personal-photo.jpg">

Nevermind, this was my fault. I omitted the trailing slash in baseurl in the config file.


Export to html full shelf

Describe the feature you'd like
Current version only allows export to html from page level
I was hoping to export to html from a full shelf
Describe the benefits this feature would bring to BookStack users
Would be great to have an interactive backup of shelves
Additional context
Add any other context or screenshots about the feature request here.

Hi @magicman32,
Shelf export is already open under #1138 so I'll therefore close this off as a duplicate.


How to use Local Position Updates?

Hi, this work is vary useful for us to change the position  of  UAVs from GPS to local position. But when use the code we meet some errors.
BackGround:
We use RTK for UAV swarm  location. But we don't know how to use the same coordinate for each UAV.  Becase each UAV treats the starting position as the coordinate origin.  So, we want set the local_position by calculating the latitude and longitude height of the UAV.
Methods to try:
Fristly, we build the lib and it looks like good, and we change the value of "EKF2_EV_CTRL" from 0 to 15 and we run :
ros2 run example_local_navigation_cpp example_local_navigation ,

and it also  looks like good .
But when we use : ros2 topic echo /fmu/out/vehicle_local_position , the locai_position is  don`t change:

and here is the code we use, just change px4_ros2::VelocityFrame::LocalNED from to px4_ros2::VelocityFrame::Unkown, and  set the position for test, and here is the code:
/****************************************************************************
 * Copyright (c) 2023 PX4 Development Team.
 * SPDX-License-Identifier: BSD-3-Clause
 ****************************************************************************/
#pragma once

#include <rclcpp/rclcpp.hpp>
#include <px4_ros2/navigation/experimental/local_position_measurement_interface.hpp>

using namespace std::chrono_literals; // NOLINT

class LocalNavigationTest : public px4_ros2::LocalPositionMeasurementInterface
{
public:
  explicit LocalNavigationTest(rclcpp::Node & node)
  : LocalPositionMeasurementInterface(node, px4_ros2::PoseFrame::LocalNED,
      px4_ros2::VelocityFrame::Unknown)
  {
    _timer =
      node.create_wall_timer(1s, [this] {updateLocalPosition();});

    RCLCPP_INFO(node.get_logger(), "example_local_navigation_node running!");
  }

  void updateLocalPosition()
  {
    px4_ros2::LocalPositionMeasurement local_position_measurement {};

    local_position_measurement.timestamp_sample = _node.get_clock()->now();

    // local_position_measurement.velocity_xy = Eigen::Vector2f {1.f, 2.f};
    // local_position_measurement.velocity_xy_variance = Eigen::Vector2f {0.3f, 0.4f};

    local_position_measurement.position_z = 12.3f;
    local_position_measurement.position_xy = Eigen::Vector2f {1.f, 2.f};
    local_position_measurement.position_xy_variance = Eigen::Vector2f {0.01f, 0.01f};
    local_position_measurement.position_z_variance = 0.33F;

    local_position_measurement.attitude_quaternion = Eigen::Quaternionf {0.1, -0.2, 0.3, 0.25};
    local_position_measurement.attitude_variance = Eigen::Vector3f {0.2, 0.1, 0.05};

    try {
      update(local_position_measurement);
      RCLCPP_DEBUG(
        _node.get_logger(),
        "Successfully sent position update to navigation interface.");
    } catch (const px4_ros2::NavigationInterfaceInvalidArgument & e) {
      RCLCPP_ERROR_THROTTLE(
        _node.get_logger(),
        *_node.get_clock(), 1000, "Exception caught: %s", e.what());
    }
  }

private:
  rclcpp::TimerBase::SharedPtr _timer;
};

class ExampleLocalNavigationNode : public rclcpp::Node
{
public:
  ExampleLocalNavigationNode()
  : Node("example_local_navigation_node")
  {
    // Enable debug output
    auto ret =
      rcutils_logging_set_logger_level(get_logger().get_name(), RCUTILS_LOG_SEVERITY_DEBUG);

    if (ret != RCUTILS_RET_OK) {
      RCLCPP_ERROR(get_logger(), "Error setting severity: %s", rcutils_get_error_string().str);
      rcutils_reset_error();
    }

    _interface = std::make_unique<LocalNavigationTest>(*this);

    if (!_interface->doRegister()) {
      throw std::runtime_error("Registration failed");
    }
  }

private:
  std::unique_ptr<LocalNavigationTest> _interface;
};

Desired Effect :
when change position_xy and position_z, the UAV's local Position is  also change . Hope for useful ideas  T-T

We find the position_xy from the topic /fmu/in/vehicle_visual_odometry  by read the code:examples/cpp/navigation/local_navigation. By the way,   the name of the topic is should be "/xxx/out/xxxx"  for is a Publisher?

And how to  change the /fmu/out/vehicle_local_position is still confused.

I'm not quite sure what you want to achieve. If you want to have a reference position between all UAVs, why not use the global position directly?

I am also experiencing an issue with the ROS2 example navigation nodes. Specifically, when I run the following commands:
ros2 run example_local_navigation_cpp example_local_navigation
ros2 run example_global_navigation_cpp example_global_navigation
I do not observe any changes in the values from:
ros2 topic echo /fmu/out/vehicle_local_position
ros2 topic echo /fmu/out/vehicle_global_position
The output simply prints:
[DEBUG] [1728284976.510910435] [example_local_navigation_node]: Successfully sent position update to navigation interface.
Despite this, there is no actual change in the position values. Could you please advise what might be causing this issue, or if there are any additional steps I should take to diagnose or resolve it?
Thank you for your assistance.

This interface is documented here: https://docs.px4.io/main/en/ros2/px4_ros2_navigation_interface.html

I have followed the instructions from the wiki and updated the EKF2_EV_CTRL parameter to 15 to receive all position and velocity updates. Afterward, I launched the example_local_navigation_node, and I received the following debug message:
[DEBUG] [1729252811.314581572] [example_local_navigation_node]: Successfully sent position update to navigation interface.
The drone is currently in Position Mode, hovering in place. However, I noticed that there is no significant change in position or velocity, despite my expectation that these values should update. Specifically, I anticipated a change in position and velocity setpoints since they were initially near zero, and I expected the drone to adjust accordingly to maintain its position.
Could you please clarify if my expectations regarding the behavior of the position and velocity setpoints are incorrect? Additionally, how can I verify that the setpoints are being sent correctly to the drone? I have also monitored the /fmu/out/vehicle_local_position topic using ros2 topic echo, and I observed that the position and velocity values do not change as expected.
Any guidance on troubleshooting or validating the setpoint updates would be appreciated.

I have a theory regarding the issue I'm encountering. I am providing position and velocity updates, but it seems that the EKF (Extended Kalman Filter) is comparing these updates with data from other sensors, such as the accelerometer and GPS. Since the EKF may determine that my updates significantly differ from the sensor data, it may reject or downweight these updates during the sensor fusion process. As a result, my setpoints become ineffective because the drone is stationary, and no meaningful movement occurs.
If this theory is correct, it raises concerns about the practicality of this example for demonstration purposes. The tutorial may not be functioning as intended because the position and velocity updates aren't being used effectively in scenarios where the drone remains in hover.
Could you confirm if this is the case? If so, it would suggest that the current example might not be suitable for showcasing this functionality in a static or near-static situation.

Thanks for the clarification. I'd be happy to create a PR to update the code/docs and provide more clarity on this. I'll get started on it. Let me know if you have any specific suggestions or if there's anything else you'd like included.

Thanks for the clarification. I'd be happy to create a PR to update the code/docs and provide more clarity on this. I'll get started on it. Let me know if you have any specific suggestions or if there's anything else you'd like included.

I am in great hurry，I want to know if your theory  is correct？And how you fix it？


Release Google.Cloud.DataFusion.V1 version 2.3.0

Changes in this release:
New features

Change netstandard2.1 target to netstandard2.0 (commit 82bea85)

Created release for Google.Cloud.DataFusion.V1-2.3.0


Fix broken tests for non-aws platforms

Some non-AWS e2e tests are failing, e.g for KubeVirt.
What this PR does / why we need it:
This PR tries to solve these failures.
Fix #2578
Checklist

[ ] Subject and description added to both, commit and PR.
[ ] Relevant issues have been referenced.
[ ] This change includes docs.
[ ] This change includes unit tests.

@davidvossel

/test unit
/test verify

/retest

/retest

/hold cancel


etcd cluster unhealthy after IPsec upgrade

Rancher versions:
rancher/server:Upgrade from v1.6.5-rc1 to v1.6.6-rc3
**Docker version: (docker version,docker info preferred)**1.12.6
Operating system and kernel: (cat /etc/os-release, uname -r preferred)
**Type/provider of hosts: (VirtualBox/Bare-metal/AWS/GCE/DO)**DO
**Setup details: (single node rancher vs. HA rancher, internal DB vs. external DB)**Single noce
**Environment Template: (Cattle/Kubernetes/Swarm/Mesos)**Kubernetes
Steps to Reproduce:

Create a 3 node rancher v1.6.5-rc1 setup with Kubernetes environment
Upgrade rancher to v1.6.6-rc3
Upgrade network services stack and then upgrade IPsec stack

After IPsec upgrade, etcd cluster is unhealthy. Two etcds are stuck in initializing state.
bash-4.3# etcdctl cluster-health
failed to check the health of member 33a4e6624f1251f8 on http://<IP_ADDRESS>:237
9: Get http://<IP_ADDRESS>:2379/health: dial tcp <IP_ADDRESS>:2379: getsockopt:
connection refused
member 33a4e6624f1251f8 is unreachable: [http://<IP_ADDRESS>:2379] are all unrea
chable
member 491b7cab4f0e0a43 is unhealthy: got unhealthy result from http://10.42.250
.11:2379
failed to check the health of member 557d2aed72327140 on http://<IP_ADDRESS>:23
79: Get http://<IP_ADDRESS>:2379/health: dial tcp <IP_ADDRESS>:2379: getsockop
t: connection refused
member 557d2aed72327140 is unreachable: [http://<IP_ADDRESS>:2379] are all unre
achable
cluster is unhealthy

etcd logs
7/26/2017 3:54:49 PM+ META_URL=http://rancher-metadata.rancher.internal/2015-12-19
7/26/2017 3:54:49 PM++ wget -q -O - http://rancher-metadata.rancher.internal/2015-12-19/self/stack/name
7/26/2017 3:54:49 PM+ STACK_NAME=kubernetes
7/26/2017 3:54:49 PM+ '[' kubernetes == '' ']'
7/26/2017 3:54:49 PM++ giddyup service scale etcd
7/26/2017 3:54:49 PM+ SCALE=3
7/26/2017 3:54:49 PM++ giddyup ip myip
7/26/2017 3:54:49 PM+ IP=<IP_ADDRESS>
7/26/2017 3:54:49 PM++ wget -q -O - http://rancher-metadata.rancher.internal/2015-12-19/self/container/create_index
7/26/2017 3:54:49 PM+ CREATE_INDEX=115
7/26/2017 3:54:49 PM++ wget -q -O - http://rancher-metadata.rancher.internal/2015-12-19/self/container/service_index
7/26/2017 3:54:49 PM+ SERVICE_INDEX=1
7/26/2017 3:54:49 PM++ wget -q -O - http://rancher-metadata.rancher.internal/2015-12-19/self/host/uuid
7/26/2017 3:54:49 PM+ HOST_UUID=c4e703fb-6c33-42c3-a91a-c90fcb1670f6
7/26/2017 3:54:49 PM+ LEGACY_DATA_DIR=/data
7/26/2017 3:54:49 PM+ DATA_DIR=/pdata
7/26/2017 3:54:49 PM+ DR_FLAG=/pdata/DR
7/26/2017 3:54:49 PM+ export ETCD_DATA_DIR=/pdata/data.current
7/26/2017 3:54:49 PM+ ETCD_DATA_DIR=/pdata/data.current
7/26/2017 3:54:49 PM+ export ETCDCTL_ENDPOINT=http://etcd.kubernetes:2379
7/26/2017 3:54:49 PM+ ETCDCTL_ENDPOINT=http://etcd.kubernetes:2379
7/26/2017 3:54:49 PM++ tr . -
7/26/2017 3:54:49 PM++ echo <IP_ADDRESS>
7/26/2017 3:54:49 PM+ NAME=10-42-60-105
7/26/2017 3:54:49 PM+ '[' 1 -eq 0 ']'
7/26/2017 3:54:49 PM+ eval node
7/26/2017 3:54:49 PM++ node
7/26/2017 3:54:49 PM++ mkdir -p /pdata/data.current
7/26/2017 3:54:49 PM++ '[' -d /data/member ']'
7/26/2017 3:54:49 PM++ '[' -d /data/data.current ']'
7/26/2017 3:54:49 PM++ '[' -f /pdata/DR ']'
7/26/2017 3:54:49 PM++ '[' -d /pdata/data.current/member ']'
7/26/2017 3:54:49 PM+++ grep 10-42-60-105
7/26/2017 3:54:49 PM+++ etcdctl_one member list
7/26/2017 3:54:49 PM+++ target_ip=0
7/26/2017 3:54:49 PM++++ giddyup service containers
7/26/2017 3:54:49 PM+++ for container in '$(giddyup service containers)'
7/26/2017 3:54:49 PM++++ wget -q -O - http://rancher-metadata.rancher.internal/2015-12-19/self/service/containers/kubernetes-etcd-2/primary_ip
7/26/2017 3:54:49 PM+++ primary_ip=<IP_ADDRESS>
7/26/2017 3:54:49 PM+++ giddyup probe tcp://<IP_ADDRESS>:2379
7/26/2017 3:54:49 PM+++ '[' 0 == 0 ']'
7/26/2017 3:54:49 PM+++ target_ip=<IP_ADDRESS>
7/26/2017 3:54:49 PM+++ break
7/26/2017 3:54:49 PM+++ '[' <IP_ADDRESS> == 0 ']'
7/26/2017 3:54:49 PM+++ etcdctl --endpoints http://<IP_ADDRESS>:2379 member list
7/26/2017 3:54:50 PMFailed to get leader:  client: etcd cluster is unavailable or misconfigured
7/26/2017 3:54:50 PM++ '[' '' ']'
7/26/2017 3:54:50 PM++ giddyup leader check
7/26/2017 3:54:50 PM++ runtime_node
7/26/2017 3:54:50 PM++ '[' -d /pdata/data.current/member ']'
7/26/2017 3:54:50 PM+++ giddyup service containers --exclude-self
7/26/2017 3:54:50 PMWaiting for lower index nodes to all be active
7/26/2017 3:54:50 PM++ for container in '$(giddyup service containers --exclude-self)'
7/26/2017 3:54:50 PM++ echo Waiting for lower index nodes to all be active
7/26/2017 3:54:50 PM+++ wget -q -O - http://rancher-metadata.rancher.internal/2015-12-19/self/service/containers/kubernetes-etcd-2/create_index
7/26/2017 3:54:50 PM++ ctx_index=2
7/26/2017 3:54:50 PM+++ wget -q -O - http://rancher-metadata.rancher.internal/2015-12-19/self/service/containers/kubernetes-etcd-2/primary_ip
7/26/2017 3:54:50 PM++ primary_ip=<IP_ADDRESS>
7/26/2017 3:54:50 PM++ '[' 2 -lt 115 ']'
7/26/2017 3:54:50 PM++ giddyup probe http://<IP_ADDRESS>:2379/health --loop --min 1s --max 15s --backoff 1.2
7/26/2017 3:54:50 PMHTTP 503
7/26/2017 3:54:50 PM
7/26/2017 3:54:51 PMHTTP 503
7/26/2017 3:54:51 PM
7/26/2017 3:54:52 PMHTTP 503
7/26/2017 3:54:52 PM
7/26/2017 3:54:54 PMHTTP 503
7/26/2017 3:54:54 PM
7/26/2017 3:54:56 PMHTTP 503
7/26/2017 3:54:56 PM
7/26/2017 3:54:58 PMHTTP 503
7/26/2017 3:54:58 PM
7/26/2017 3:55:00 PMHTTP 503
7/26/2017 3:55:00 PM
7/26/2017 3:55:03 PMHTTP 503
7/26/2017 3:55:03 PM
7/26/2017 3:55:07 PMHTTP 503
7/26/2017 3:55:07 PM
7/26/2017 3:55:11 PMHTTP 503
7/26/2017 3:55:11 PM

New pods cannot be created
> kubectl create -f pod5.yml
Error from server (InternalError): error when creating "pod5.yml": Internal error occurred: failed to allocate a service
IP: client: etcd cluster is unavailable or misconfigured
Error from server: error when creating "pod5.yml": client: etcd member http://etcd.kubernetes.rancher.internal:2379 has
no leader

https://github.com/rancher/rancher/issues/9385

Related to https://github.com/rancher/rancher/issues/9385

Closing in favor of https://github.com/rancher/rancher/issues/9385


chore: remove podman workaround

This has been fixed in podman 4.7.0 https://github.com/containers/podman/issues/19930#issuecomment-1737456096
(draft until it hits stable https://src.fedoraproject.org/rpms/podman)

Yeah and also we need to account for the delay between it being published in fedora and making it to the oci image that it's published so we don't remove it too early.

@castrojo you beat me to this :-)

I've got this patch installed on my machine and confirmed it's working as expected.


[thumbnailer.js] Output app name, reset lcd and intervals

flow app sets LCDMode to 120x120 wich will break image export (TypeError: FUNCTION_TABLE[(HEAPU8[(($0 + 52) | 0)] | (HEAPU8[(($0 + 53) | 0)] << 8) | ((HEAPU8[(($0 + 54) | 0)] << 16) | (HEAPU8[(($0 + 55) | 0)] << 24)))] is not a function)
Some applications use a very short timeout, which also break the export.

Thanks!


gamma: add more conformance tests

What type of PR is this?
/kind test
/area conformance
What this PR does / why we need it:
Largely pulling from https://gateway-api.sigs.k8s.io/geps/gep-1686/, although not complete as I didn't want a massive PR.
Note: tested on Istio since this is the only implementation I know of. We actually have a known issue with part of the spec so we don't pass 1 test (which proves it fails as expected, I suppose).
Which issue(s) this PR fixes:
Does this PR introduce a user-facing change?:

NONE

/assign @keithmattix

/cc @mikemorris @michaelbeaumont

/cc

@sunjayBhatia have all of your comments been addressed? I'd like to add an LGTM if so

We've got 2 approvals and, from what I can tell, no outstanding comments, so in the spirit of lazy consensus, I'm going to try and approve
/lgtm

sigh forgot a label.
/approve

This is ready to go now that 0.7.0 is out

Thanks @howardjohn!
/lgtm
/approve


Resolve element replicas in FloorPlot

Changes:

Resolve element replicas in FloorPlot

I also added a requirement for the version of pint as users reported that that xplt stopped working after upgrading to numpy 2.0 (even reinstalling xplt did not help as pint was not updated).
Present version of pint does not support python 3.8 so I had to remove it from the test workflow.

Thank you, @giadarol
If you don't mind, I'd like to separate the Numpy 2 compatibility change on a separate PR, so we can have xplt 0.9 release pinned with everything numpy<2 and dedicated 0.10 release for numpy>=2

Thank you @eltos
Would you like to make the releases or you prefer that we do?


TPU cannot do simple arithmetic!

I am trying to do simple matrix multiplication on TPU, but it gives a wrong result:
import jax.numpy as np
import numpy as onp

# On CPU
x = onp.array([[0.3744, 0.1656],
               [0.4707, 0.1663]])
y = onp.array([[0.3946, 0.1186],
               [0.1569, 0.3145]])
z = onp.dot(x, y)

# On TPU
x_ = np.asarray(x)
y_ = np.asarray(y)
z_ = np.dot(x_, y_)

print('JAX device:', x_.device())

# Compare
print('CPU result:', z)
print('TPU result:', z_)
assert np.allclose(z, z_)

Output:
JAX device: TPU_0(process=0,(0,0,0,0))
CPU result: [[0.17372088 0.09648504]
 [0.21183069 0.10812637]]
TPU result: [[0.17405128 0.09669876]
 [0.21180916 0.10805416]]
Traceback (most recent call last):
  File "/home/ayaka/main.py", line 21, in <module>
    assert np.allclose(z, z_)
AssertionError

Manual calculation:
0.3744 * 0.3946 + 0.1656 * 0.1569 = 0.13732088
So the result on CPU is correct, while the result on TPU is wrong.
Library versions:
jax                  0.3.4
jaxlib               0.3.2
libtpu-nightly       0.1.dev20220315

There are two "sharp bits" to be aware of here.
1. float64 - Your NumPy example is running with f64 inputs/outputs but the JAX version is f32.  See https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html#double-64bit-precision
2. Compute precision - XLA supports computing dot product in various precisions. JAX's default precision is optimised for performance and thus has relatively low precision (see #9952). This is typically OK for NN training, but can be the wrong choice for other applications.
You can adjust the precision globally using:
jax.config.update('jax_default_matmul_precision', jax.lax.Precision.HIGHEST)

Or you can do so on a per operation basis:
c = jnp.dot(a, b, precision=jax.lax.Precision.HIGHEST)

Here is a copy of your example using HIGHEST precision on TPU (with f32 inputs) and getting a very close result compared to CPU: https://colab.research.google.com/gist/tomhennigan/69844409e46fd71267acf7479e2ba7f4/example-of-changing-default-precision-in-jax.ipynb

Thank you for the explanation!
I am wondering:

Are there any research indicating low precision will not affect the model performance? As deep learning models are growing larger and larger, I am thinking that different precision may result to totally different output after many layers of operations.
How much training time I can save when using lower precision?

I think we can close this issue, but please let me know if not!


Unable to Access Function in Module from Start-RSJob

I'm running PoshRSJob v<IP_ADDRESS> on Powershell v5.1.15063.1029 on Windows 10.
I'm navigating to a folder named "Coffee.Application" with the following files:

Coffee.Application.ps1
Coffee.Application.psm1

I then run the following:
Start-RSJob -ScriptBlock { Get-CoffeeDBConnectionString } `
	-Name t1 `
	-ModulesToImport .\Coffee.Application.psm1

Receive-RSJob -Name t1

Receive-RSJob -Name t1, returns the following error:

The term 'Get-Foo' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

The function Get-Foo is in the module Coffee.Application. I expected the thread to be able to execute the Get-Foo function in the Coffee.Application module.
The module's script file is in the current workspace. I can load the module into the active session with the following:
import-module .\Coffee.Application.psm1

Once loaded, I can access any exposed functions.
I have tried closing all session. Starting a fresh session and making the call to Start-RSJob the first call made.

unlike Import-Module,   -ModulesToImport  parameter supports module name, but not module path.
When commit #178 will be accepted it will work

Why did not you give yourself a chance to try ? ;-)
...both sopported.

That worked.
Thank you @MVKozlov!


Update TimedLoop module

Added the possibility to have different periods between different module implementations by overriding the new getPeriod() function.

I think the multiple timers kind of get rid of the performance benefit?
Maybe a timestamp could be preferred here?

Maybe keep the original TimedLoop and add another module with different period per implementation possible?
One other idea would be to have timers associated to their period and when a class request a timer of a given period it would check if that timer already exist and run and would add the class function to the list of the callbacks of that timer. Might be overkill.

I went with the second idea. Tell me what you think.

Should be fine this way I suppose.
@Cokemonkey11 what do you think?

I don't use this package, so:

what's this for?
what's the package for?
where's the docs?
why would you want to override the period?

I didn't create the package, I just made it so the TimedLoop module could support different periods in different class implementation.

The diff for that should be just a few lines, no?

Not saying this can't be merged as-is, but
I'm not the best person for that

Thanks 👍


Remove query for Boechera laevigata

One host plant, Borodinia laevigata, has two junior synonyms on GBIF:

Boechera laevigata
Arabis laevigata

All observations on a query for 1 appear to be included in a query for the accepted name, Borodinia laevigata. However, observations on a query for 2 will return unique records, that is, none are included in a query for the accepted name. So the query for Boechera laevigata can be removed, but the query for Arabis laevigata, and subsequent binding to Borodinia laevigata query results, will need to remain.

Addressed in cf6d3eb.


Endless loop after call Fugit::Cron#next_time with time zone 'CST'

environment:

ruby 2.3.3p222
fugit 1.1.6
Time.now.zone is CST(+08:00)

code:
Time.now.utc # "2019-01-02T05:25:53.960Z"
cron = Fugit.do_parse_cron('0 0 1 1 *')
cron.next_time.to_s

expected:
"2019-12-01 00:00:00 +0000"

got:
Endless loop
What I found:
After some debugging, I thought the method TimeCursor#inc_mont doesn't work right in timezone CST  (maybe all positive east of UTC timezones).
https://github.com/floraison/fugit/blob/6488c5f4e47ac63a2a5b7f290656a344ff9d2ca9/lib/fugit/cron.rb#L88
This line will parse the year and month as time zone CST, and then transfer to UTC.
For example:
::EtOrbi.make(2019, 2).to_s

expected:  2019-02-01 00:00:00 +0000
but got: 2019-01-31 16:00:00 +0000
The month isn't increased, and the loop in next_time will last forever.
Thank you for your work.

Hello, thanks for the very professional issue report.
Could you please tell me what is your operating system?

CST is too ambiguous as a timezone name. See https://24timezones.com/time-zone/cst Please use Asia/Shanghai or something more appropriate.
Please note that "cron.next_time" yields a result in the time zone for its cron.
Thanks in advance.

:My operating system is macOS:
ProductName:	Mac OS X
ProductVersion:	10.14.2
BuildVersion:	18C54

Here is the output of the code:
---
2019-01-02 14:20:24 +0800
2019-01-02 06:20:24 UTC
#<Fugit::Cron:0x007fdc7d0f5260 @original="0 0 1 1 *", @cron_s=nil, @seconds=[0], @minutes=[0], @hours=[0], @monthdays=[1], @months=[1], @weekdays=nil, @zone=nil, @timezone=nil>
"2020-01-01 00:00:00 +0800"
"2019-12-31 16:00:00 UTC"
---
2019-01-02 14:20:25 +0800
2019-01-02 06:20:25 UTC
#<Fugit::Cron:0x007fdc7c1496e0 @original="0 0 1 1 * UTC", @cron_s=nil, @seconds=[0], @minutes=[0], @hours=[0], @monthdays=[1], @months=[1], @weekdays=nil, @zone="UTC", @timezone=#<TZInfo::DataTimezone: UTC>>
"2020-01-01 00:00:00 +0800"
"2019-12-31 16:00:00 UTC"

The code in my issue run in the rails console. It seems to work after set ENV['TZ'].
Is ENV['TZ'] a requirement while working in a different time zone?
And the result in part 2 seems to be incorrect, should it be 2020-01-01 00:00:00 UTC?

Hello,

Is ENV['TZ'] a requirement while working in a different time zone?

Outside of Windows, that should not be necessary.
What does
bundle exec ruby -r et-orbi -e "EtOrbi._make_info"
in your project terminal yield?
Thanks in advance.

(secs:1546415129.1046982,utc~:"2019-01-02 07:45:29.10469818115234375",ltz~:"CST")
(etz:nil,tnz:"CST",tzid:nil,rv:"2.3.3",rp:"x86_64-darwin18",win:false,rorv:nil,astz:nil,eov:"1.1.6",eotnz:#<TZInfo::TimezoneProxy: Asia/Chongqing>,eotnfz:"+0800",eotlzn:"Asia/Chongqing",debian:nil,centos:nil,osx:"zoneinfo/Asia/Shanghai")

Hello,
I've set my Mac to Changzhou - China and tried your code:
074113 pollux 仁 ~/w/fugit (master)↑ ダ make info
uname -a
Darwin pollux.local 17.7.0 Darwin Kernel Version 17.7.0: Fri Nov  2 20:43:16 PDT 2018; root:xnu-4570.71.17~1/RELEASE_X86_64 x86_64
bundle exec ruby -v
ruby 2.3.7p456 (2018-03-28 revision 63024) [x86_64-darwin17]
bundle exec ruby -Ilib -r et-orbi -e "EtOrbi._make_info"
(secs:1546469146.095888,utc~:"2019-01-02 22:45:46.09588789939880371",ltz~:"CST")
(etz:nil,tnz:"CST",tzid:nil,rv:"2.3.7",rp:"x86_64-darwin17",win:false,rorv:nil,astz:nil,eov:"1.1.6",eotnz:#<TZInfo::TimezoneProxy: Asia/Chongqing>,eotnfz:"+0800",eotlzn:"Asia/Chongqing",debian:nil,centos:nil,osx:"zoneinfo/Asia/Shanghai")

064546 pollux 仁 ~/w/fugit (master)↑ ダ bxr wenhui.rb
#<Fugit::Cron:0x00007fec499b88a8 @original="0 0 1 1 *", @cron_s=nil, @seconds=[0], @minutes=[0], @hours=[0], @monthdays=[1], @months=[1], @weekdays=nil, @zone=nil, @timezone=nil>
#<EtOrbi::EoTime:0x00007fec49aa9c58 @seconds=1577808000.0, @zone=#<TZInfo::TimezoneProxy: Asia/Chongqing>, @time=nil>
"2020-01-01 00:00:00 +0800"

064603 pollux 仁 ~/w/fugit (master)↑ ダ cat wenhui.rb
require 'fugit'
#Time.now.utc # "2019-01-02T05:25:53.960Z"
cron = Fugit.do_parse_cron('0 0 1 1 *')
p cron
p cron.next_time
p cron.next_time.to_s

and, as you, I couldn't get it to fail :-(

After some debugging, I thought the method TimeCursor#inc_mont doesn't work right in timezone CST (maybe all positive east of UTC timezones).

Fortunately, it works in my JST (Asia/Tokyo) UTC+0900 time zone.

I'm going on investigating. Thanks again.

@w11th By the way, what version number for your tzinfo gem? what version number your tzinfo-data gem (if you use it)?
Thanks in advance.

Appreciate your help.
My tzinfo gem version number is 1.2.5, and I didn't use the tzinfo-data gem.

and, as you, I couldn't get it to fail :-(

I found that the code behaves differently in my rails console.
In my rails console, EtOrbi parse time with Chronic gem:
https://github.com/floraison/et-orbi/blob/ef6b69644c4b19e1c72b87539173f9e87c2f6986/lib/et-orbi.rb#L26
Chronic parse the time with Time class, and then return a new  EoTime with code:T
 EoTime.new(t, nil)

This initialization build time with the time zone which EtOrbi.determine_local_tzone method returns.
It's #<TZInfo::DataTimezone: Etc/UTC>(Time.zone value) in my rails console.
so, the code ::EtOrbi.make(2019, 2) parse the time in local time zone, and transfer to UTC time zone.

I tried to require 'chronic' in the example you gave, but still, no loop.
What is the simplest piece of code that you can come up with that shows the problem? Does adding Chronic and/or Active Support shows the problem on your system?

I think the problem is, method TimeCursor#inc_mont builds the new time with ::EtOrbi.make(y,m). The time zone of cron job wasn't passed to  EtOrbi.

I would love to find the simplest piece of code that shows the problem so that I can fix it.

require 'fugit'
require 'active_support/all'
require 'chronic'

# Do not set ENV['TZ']
# ENV['TZ'] = 'Asiz/Chongqing'
puts EtOrbi.os_tz

Time.zone = ::TZInfo::Timezone.get('UTC')

puts Time.now
puts Time.now.zone
puts Time.current

cron = Fugit.do_parse_cron('0 0 1 1 *')
p cron

puts cron.next_time

here is my output:
zoneinfo/Asia/Shanghai
2019-01-03 11:18:40 +0800
CST
2019-01-03 03:18:40 UTC
#<Fugit::Cron:0x007faabf185620 @original="0 0 1 1 *", @cron_s=nil, @seconds=[0], @minutes=[0], @hours=[0], @monthdays=[1], @months=[1], @weekdays=nil, @zone=nil, @timezone=nil>
<Endless loop>

@jmettraux are you sure that this is fixed? I'm using gitlab-11.8.2-ee and it seems to be stuck in this loop:
2019-03-20_21:58:36.80890 2019-03-20T21:58:36.808Z 5353 TID-oxdlhwzy1 WARN: /opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/core_ext/time/calculations.rb:239:in `+'
2019-03-20_21:58:36.80891 /opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/core_ext/time/calculations.rb:239:in `plus_with_duration'
2019-03-20_21:58:36.80891 /opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/et-orbi-1.1.7/lib/et-orbi/eo_time.rb:129:in `utc'
2019-03-20_21:58:36.80891 /opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/et-orbi-1.1.7/lib/et-orbi/eo_time.rb:358:in `to_time'
2019-03-20_21:58:36.80892 /opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/et-orbi-1.1.7/lib/et-orbi/eo_time.rb:203:in `block (2 levels) in <class:EoTime>'
2019-03-20_21:58:36.80892 /opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/fugit-1.1.7/lib/fugit/cron.rb:76:in `block (2 levels) in <class:TimeCursor>'
2019-03-20_21:58:36.80892 /opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/fugit-1.1.7/lib/fugit/cron.rb:119:in `sec_match?'
2019-03-20_21:58:36.80893 /opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/fugit-1.1.7/lib/fugit/cron.rb:252:in `block in previous_time'
2019-03-20_21:58:36.80893 /opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/fugit-1.1.7/lib/fugit/cron.rb:232:in `loop'
2019-03-20_21:58:36.80894 /opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/fugit-1.1.7/lib/fugit/cron.rb:232:in `previous_time'
2019-03-20_21:58:36.80894 /opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/sidekiq-cron-1.0.4/lib/sidekiq/cron/job.rb:561:in `not_past_scheduled_time?'
2019-03-20_21:58:36.80894 /opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/sidekiq-cron-1.0.4/lib/sidekiq/cron/job.rb:23:in `block in should_enque?'

Hello @conet,
what is gitlab-11.8.2-ee? Never heard of it.
Please give me the shortest piece of code that shows this behaviour.
Please give me as well the output of bundle exec ruby -r et-orbi -e "EtOrbi._make_info" in your project/system.
Thanks in advance.

@jmettraux It's https://gitlab.com/gitlab-org/gitlab-ee/tree/v11.8.2-ee
@conet What's the cron pattern you're using?

Cross referencing the GitLab issue, which has more information: https://gitlab.com/gitlab-org/gitlab-ce/issues/59273

Cross referencing the GitLab issue

Thanks @godfat !
I am opening a new issue, I think it has nothing to do with the original issue here. Stay tuned.


Grafana

Link to product page on endoflife.date
https://endoflife.date/grafana
Details of incorrect and correct details you have found
For self-managed Grafana (both Enterprise and OSS), the support for versions is as follows:

Support for each minor release extends to nine months after the release date.
Support for the last minor release of a major version is extended an additional six months, for a total of 15 months of support after the release date.

endoflife.date:

Release
Security Support

11.2
Yes

11.1
Ended 2 weeks and 5 days ago(22 Oct 2024)

11.0
Ended 2 months and 2 weeks ago(27 Aug 2024)

10.4
Yes

10.3
Ended 6 months ago(14 May 2024)

Product documentation:

Version
Support end of life (EOL)

11.2
May 2025 (tentative)

11.1
March 2025

11.0
February 2025

10.4 (Last minor of 10.0)
June 2025 (extended support)

10.3
October 2024

What is the source website for the product and for its version information?
https://grafana.com/docs/grafana/latest/upgrade-guide/when-to-upgrade/#what-to-know-about-version-support

@PiRomant just merged the fix, thanks for the report! 🙏