Fixed stopping/removal of VM and extended integration test to check it

For now test fails with
E0201 09:29:47.607864   20472 manager.go:324] Error when stopping container 88fa8fe6-b4a4-4fef-64b6-7797f2382f86: timeout reached
However, if keep build_virtlet container running after test failure, domains can be manually deleted without issues.

This change is

Test looks good for me. Minor flaws in formatting/typos.

Reviewed 1 of 1 files at r1.
Review status: all files reviewed at latest revision, 4 unresolved discussions.

tests/integration/container_create_test.go, line 217 at r1 (raw file):

	}
	for _, container := range containers {
                //Stop container request

Wrong indent level, missing space after //

tests/integration/container_create_test.go, line 226 at r1 (raw file):

		}

		//Remove container request

Missing space

tests/integration/container_create_test.go, line 234 at r1 (raw file):

			t.Fatalf("Removing container %s failure: %v", container.ContainerId, err)
		}
		//check all volumes related to VM have been removed

Missing space

tests/integration/container_create_test.go, line 243 at r1 (raw file):

		outRes := strings.TrimSpace(string(out))
		if outRes != "0" {
			t.Errorf("Expected no ephemeral volumes for %s doamin but instead found %s!", container.ContainerId, outRes)

Typo in "doamin"

Comments from Reviewable

The main reason of the unstability of domain power management is using vmwrapper which spawns qemu process and not exec'ing it, which leads to two processes are running for one domain, but libvirt is aware of only about wrapper one and considers it as a qemu and using its pid to handle doamin.
Ex:
root     20686  0.0  0.0 192872  5392 ?        Sl   08:20   0:00 /vmwrapper -name 9948dfe6-115f-44ae-5a92-d2e5a894da76-testName_1 -S -machine pc-i440fx-xenial,accel=tcg,usb=off -m 1024 -realtime mlock=off -smp 48,sockets=48,cores=1,thr
root     20693 90.5  0.2 3171140 583748 ?      Sl   08:20   0:03 /usr/bin/qemu-system-x86_64 -name 9948dfe6-115f-44ae-5a92-d2e5a894da76-testName_1 -S -machine pc-i440fx-xenial,accel=tcg,usb=off -m 1024 -realtime mlock=off -smp 48,socke

Thus, even shutting down using virsh doesn't stop qemu process, and domain state never transitioned from  'shutdown' state to 'shutoff' state:
# virsh list
 Id    Name                           State
----------------------------------------------------
 1     f083591e-3856-4a7d-63b0-7eefa55e18f6-testName_0 in shutdown
 2     9948dfe6-115f-44ae-5a92-d2e5a894da76-testName_1 in shutdown

# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18036  2856 ?        Ss   08:14   0:00 bash -c tar -C '/go/src/github.com/Mirantis/virtlet' -xz && VIRTLET_DISABLE_KVM=1 build/do-test.sh || while :; do sleep 2; done
root        32  0.1  0.0 1835792 40092 ?       Sl   08:18   0:00 /usr/sbin/libvirtd --listen -d
libvirt+  1822  0.0  0.0  49984  2608 ?        S    08:19   0:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
root      1823  0.0  0.0  49956   392 ?        S    08:19   0:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
root     20377  0.0  0.0  18212  3368 ?        Ss   08:20   0:00 /bin/bash
root     20617  3.5  0.2 3326812 775476 ?      Sl   08:20   0:15 /usr/bin/qemu-system-x86_64 -name f083591e-3856-4a7d-63b0-7eefa55e18f6-testName_0 -S -machine pc-i440fx-xenial,accel=tcg,usb=off -m 1024 -realtime mlock=off -smp 48,socke
root     20693  7.6  0.3 3535756 851976 ?      Sl   08:20   0:32 /usr/bin/qemu-system-x86_64 -name 9948dfe6-115f-44ae-5a92-d2e5a894da76-testName_1 -S -machine pc-i440fx-xenial,accel=tcg,usb=off -m 1024 -realtime mlock=off -smp 48,socke
root     21046  0.0  0.0   4380   652 ?        S    08:28   0:00 sleep 2
root     21047  0.0  0.0  34424  2800 ?        R+   08:28   0:00 ps aux

As the most part of interaction is going thru monitor.socket domain management is feasable.
But not in case of domain power management and releasing resources.
Made research gives that qemu wrappers are implemeted always in the form of following exec'ing for qemu process.
So current plan is to separate dhcp server from qemu wrapper, having two different processes. DHCP server will be spawned from qemu wrapper.

Patch is ready for review, tests pass successfully.

Review status: 0 of 10 files reviewed at latest revision, 4 unresolved discussions.

tests/integration/container_create_test.go, line 217 at r1 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
Wrong indent level, missing space after //

Done.

tests/integration/container_create_test.go, line 226 at r1 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
Missing space

Done.

tests/integration/container_create_test.go, line 234 at r1 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
Missing space

Done.

tests/integration/container_create_test.go, line 243 at r1 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
Typo in "doamin"

Done.

Comments from Reviewable

Reviewed 10 of 10 files at r3.
Review status: all files reviewed at latest revision, 17 unresolved discussions.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 48 at r3 (raw file):

var sigTERM = make(chan os.Signal)

//Spawn child process and wait for its termination

Please add space after //

cmd/inner_vmwrapper/inner_vmwrapper.go, line 59 at r3 (raw file):

	cmd.Stdout = os.Stdout
	if err = cmd.Start(); err != nil {
		glog.Errorf("failed to start %q: %v", name, err)

All messages sent to user should be started from capital letter.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 66 at r3 (raw file):

	go func() {
		if err = cmd.Wait(); err != nil {
			glog.Errorf("failed to run %q: %v", name, err)

Same as above.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 76 at r3 (raw file):

		select {
		case <-done:
			break L

This is first place in golang src where i find this in right place :) :+1:

cmd/inner_vmwrapper/inner_vmwrapper.go, line 78 at r3 (raw file):

			break L
		case <-exitEOF:
			glog.Infof("Recieved EOF on pipe from outer wrapper. Sending to child SIGKILL.\n")

\n is unnecessary there.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 80 at r3 (raw file):

			glog.Infof("Recieved EOF on pipe from outer wrapper. Sending to child SIGKILL.\n")
			if err := cmd.Process.Signal(syscall.SIGKILL); err != nil {
				glog.Infof("Error on sending SIGKILL to child %v!\n", err)

Same as above.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 84 at r3 (raw file):

			procTerminated = true
		case <-sigTERM:
			glog.Infof("Recieved SIGTERM. Sending to child and wait the process to stop.!\n")

Same as above.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 86 at r3 (raw file):

			glog.Infof("Recieved SIGTERM. Sending to child and wait the process to stop.!\n")
			if err := cmd.Process.Signal(syscall.SIGTERM); err != nil {
				glog.Infof("Error on sending SIGTERM to child %v!\n", err)

Same as above

cmd/inner_vmwrapper/inner_vmwrapper.go, line 107 at r3 (raw file):

func catchParentKilled() {
	//Process has been spawned by outer wrapper with setting for child

Missing space after //

cmd/inner_vmwrapper/inner_vmwrapper.go, line 219 at r3 (raw file):

		}

		//Running qemu process

Missing spaces.

cmd/vmwrapper/vmwrapper.go, line 29 at r3 (raw file):

)

//The only aim of this outer qemu wrapper is to be able to do cleanup in case of

Missing spaces.

cmd/vmwrapper/vmwrapper.go, line 50 at r3 (raw file):

	if err := cmd.Start(); err != nil {
		glog.Errorf("failed to start %q: %v", innerWrapper, err)

Output message should be capitalized.

cmd/vmwrapper/vmwrapper.go, line 57 at r3 (raw file):

		for {
			<-sigChan
			glog.Infof("Outer wrapper: recieved SIGTERM. Sending to the child!\n")

Log should not end with \n.

cmd/vmwrapper/vmwrapper.go, line 65 at r3 (raw file):

	if err := cmd.Wait(); err != nil {
		glog.Errorf("failed to run %q: %v", innerWrapper, err)

Message should be capitalized.

pkg/libvirttools/domain_interface.go, line 23 at r3 (raw file):

)

//WARNING: Implementation of GetLastError in libvirt-go calls reset error at the end.

Missing spaces. Good catch with GetLastError!

pkg/libvirttools/virtualization.go, line 402 at r3 (raw file):

	if err := v.StopContainer(containerId); err == nil {
		return nil
	}

This looks wrong. There is no call to undefine domain at least it there was no error.

tests/integration/container_create_test.go, line 25 at r3 (raw file):

	"testing"

	"fmt"

This should be moved up at the start of imports.

Comments from Reviewable

Review status: 5 of 10 files reviewed at latest revision, 17 unresolved discussions.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 48 at r3 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
Please add space after //

Done.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 59 at r3 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
All messages sent to user should be started from capital letter.

Done.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 66 at r3 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
Same as above.

Done.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 76 at r3 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
This is first place in golang src where i find this in right place :) :+1:

yep, look like best applicable here :)

cmd/inner_vmwrapper/inner_vmwrapper.go, line 78 at r3 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
\n is unnecessary there.

Done.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 80 at r3 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
Same as above.

Done.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 84 at r3 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
Same as above.

Done.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 86 at r3 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
Same as above

Done.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 107 at r3 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
Missing space after //

Done.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 219 at r3 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
Missing spaces.

Done.

cmd/vmwrapper/vmwrapper.go, line 29 at r3 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
Missing spaces.

Done.

cmd/vmwrapper/vmwrapper.go, line 50 at r3 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
Output message should be capitalized.

Done.

cmd/vmwrapper/vmwrapper.go, line 57 at r3 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
Log should not end with \n.

Done.

cmd/vmwrapper/vmwrapper.go, line 65 at r3 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
Message should be capitalized.

Done.

pkg/libvirttools/domain_interface.go, line 23 at r3 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
Missing spaces. Good catch with GetLastError!

Done.

pkg/libvirttools/virtualization.go, line 402 at r3 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
This looks wrong. There is no call to undefine domain at least it there was no error.

Oops, agree, thx! Fixed.

tests/integration/container_create_test.go, line 25 at r3 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
This should be moved up at the start of imports.

Done.

Comments from Reviewable

Q: is there a need for separate inner_vmwrapper binary? Maybe use the same vmwrapper executable and pass it either some command line argument or an environment variable to signify that it's inner process? Otherwise we're getting too many binaries... Although feel free to correct me folks if you think I'm wrong here.

Everything looks ok now, but I also think that we should keep single binary for this.

Reviewed 5 of 5 files at r4.
Review status: all files reviewed at latest revision, 3 unresolved discussions, some commit checks failed.

Comments from Reviewable

Ok, will re-work it.

Review status: all files reviewed at latest revision, all discussions resolved, some commit checks failed.

Comments from Reviewable

Review status: all files reviewed at latest revision, 9 unresolved discussions, some commit checks failed.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 46 at r4 (raw file):

var exitEOF = make(chan bool, 1)
var sigTERM = make(chan os.Signal)

Please try to avoid global vars if possible

cmd/inner_vmwrapper/inner_vmwrapper.go, line 51 at r4 (raw file):

// If during waiting for the child termination process
// will recieve EOF on pipe from parent or SIGTERM
// it will send SIGKILL or SIGTERM to child accordingly

If the process receives EOF on the pipe connecting it to parent process or gets a SIGTERM, it sends SIGKILL or SIGTERM to the child process, respectively

cmd/inner_vmwrapper/inner_vmwrapper.go, line 78 at r4 (raw file):

			break L
		case <-exitEOF:
			glog.Infof("Recieved EOF on pipe from outer wrapper. Sending to child SIGKILL.")

Received

cmd/inner_vmwrapper/inner_vmwrapper.go, line 84 at r4 (raw file):

			procTerminated = true
		case <-sigTERM:
			glog.Infof("Recieved SIGTERM. Sending to child and wait the process to stop.!")

Received

cmd/vmwrapper/vmwrapper.go, line 57 at r4 (raw file):

		for {
			<-sigChan
			glog.Infof("Outer wrapper: recieved SIGTERM. Sending to the child!")

received
Also probably "Forwarding to the child!" would sound a bit better

cmd/vmwrapper/vmwrapper.go, line 59 at r4 (raw file):

			glog.Infof("Outer wrapper: recieved SIGTERM. Sending to the child!")
			if err := cmd.Process.Signal(syscall.SIGTERM); err != nil {
				fmt.Printf("Error on sending SIGTERM to child %v!", err)

Error sending ...

contrib/images/local-cluster/start.sh, line 24 at r4 (raw file):

   [ -e "$CONTAINER_RUNTIME_ENDPOINT" ] && break
   sleep 2
done

I'd write this as
while [[ ! -e ${CONTAINER_RUNTIME_ENDPOINT} ]]; do
  echo "Waiting for ${CONTAINER_RUNTIME_ENDPOINT}"
  sleep 2
done

pkg/libvirttools/domain_interface.go, line 25 at r4 (raw file):

// WARNING: Implementation of GetLastError in libvirt-go calls resets error at the end.
// All methods in DomainOperations interface call GetLastError inside.
// Thus, repeated separated call will return no error.

I'd rewrite that comment like this:
Note that GetLastError() is not included in DomainOperations interface. That's because libvirt-go GetLastError() call clears the error, and as all the DomainOperations methods invoke GetLastError(), calling it again afterwards wouldn't make sense.

pkg/libvirttools/virtualization.go, line 377 at r4 (raw file):

	// Wait until domain is capable of processing shutdown signal or timeout after 60 sec.
	// Repeat sending of shutdown request several times with 10 sec interval
	// To process cases when VM is booting and is not in the state to process shutdown signal

Send shutdown request several times with 10 sec interval to account for the cases when VM is booting and cannot handle the shutdown signal

Comments from Reviewable

Review status: all files reviewed at latest revision, 12 unresolved discussions, some commit checks failed.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 220 at r4 (raw file):

		// Running qemu process
		// On domain's shutdown/destroy libvirt terminates corresponding qemu process by using SIGTERM or SIGKILL

Upon domain's shutdown/destroy libvirt terminates corresponding qemu process using SIGTERM or SIGKILL

cmd/inner_vmwrapper/inner_vmwrapper.go, line 221 at r4 (raw file):

		// Running qemu process
		// On domain's shutdown/destroy libvirt terminates corresponding qemu process by using SIGTERM or SIGKILL
		// SIGKILL will be detected by catching up EOF on pipe from outer wrapper designed only with this single aim

We detect SIGKILL by catching EOF on a pipe from the outer wrapper process

cmd/inner_vmwrapper/inner_vmwrapper.go, line 222 at r4 (raw file):

		// On domain's shutdown/destroy libvirt terminates corresponding qemu process by using SIGTERM or SIGKILL
		// SIGKILL will be detected by catching up EOF on pipe from outer wrapper designed only with this single aim
		// On catching SIGTERM just re-send it to spawned qemu process and wait for its termination

If we catch SIGTERM we just forward it to qemu process and wait for it to exit

Comments from Reviewable

Review status: all files reviewed at latest revision, 12 unresolved discussions, some commit checks failed.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 46 at r4 (raw file):
Previously, ivan4th (Ivan Shvedunov) wrote…
Please try to avoid global vars if possible

Well, will re-check whether it's possible during reworking to have all on one wrapper.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 51 at r4 (raw file):
Previously, ivan4th (Ivan Shvedunov) wrote…
If the process receives EOF on the pipe connecting it to parent process or gets a SIGTERM, it sends SIGKILL or SIGTERM to the child process, respectively

Will fix "receives" and remove "will"

cmd/inner_vmwrapper/inner_vmwrapper.go, line 78 at r4 (raw file):
Previously, ivan4th (Ivan Shvedunov) wrote…
Received

will fix

cmd/inner_vmwrapper/inner_vmwrapper.go, line 84 at r4 (raw file):
Previously, ivan4th (Ivan Shvedunov) wrote…
Received

will fix

cmd/inner_vmwrapper/inner_vmwrapper.go, line 220 at r4 (raw file):
Previously, ivan4th (Ivan Shvedunov) wrote…
Upon domain's shutdown/destroy libvirt terminates corresponding qemu process using SIGTERM or SIGKILL

Upon=On, so will keep as it is now.

cmd/inner_vmwrapper/inner_vmwrapper.go, line 221 at r4 (raw file):
Previously, ivan4th (Ivan Shvedunov) wrote…
We detect SIGKILL by catching EOF on a pipe from the outer wrapper process

will fix

cmd/inner_vmwrapper/inner_vmwrapper.go, line 222 at r4 (raw file):
Previously, ivan4th (Ivan Shvedunov) wrote…
If we catch SIGTERM we just forward it to qemu process and wait for it to exit

Will change to "forward" and "wait for it to exit"

cmd/vmwrapper/vmwrapper.go, line 57 at r4 (raw file):
Previously, ivan4th (Ivan Shvedunov) wrote…
received
Also probably "Forwarding to the child!" would sound a bit better

yep, will change it

cmd/vmwrapper/vmwrapper.go, line 59 at r4 (raw file):
Previously, ivan4th (Ivan Shvedunov) wrote…
Error sending ...

oops, will fix.

pkg/libvirttools/domain_interface.go, line 25 at r4 (raw file):
Previously, ivan4th (Ivan Shvedunov) wrote…
I'd rewrite that comment like this:
Note that GetLastError() is not included in DomainOperations interface. That's because libvirt-go GetLastError() call clears the error, and as all the DomainOperations methods invoke GetLastError(), calling it again afterwards wouldn't make sense.

Well, will change to "NOTE" from "WARNING". But otherwise would prefer to keep it "as-is". In my understanding, comments should be formed as simple and short sentences with a complete sense and if possible to fit on one line.

pkg/libvirttools/virtualization.go, line 377 at r4 (raw file):
Previously, ivan4th (Ivan Shvedunov) wrote…
Send shutdown request several times with 10 sec interval to account for the cases when VM is booting and cannot handle the shutdown signal

Using your thoughts along with previuos version, I would re-prase all in following way:
// To process cases when VM is booting and cannot handle the shutdown signal.
// Send sequential shutdown requests with 1 sec interval until domain is shutoff or time after 60 sec.

Comments from Reviewable

please, take a look once more.

Review status: 2 of 6 files reviewed at latest revision, 16 unresolved discussions.

cmd/vmwrapper/vmwrapper.go, line 57 at r4 (raw file):
Previously, vefimova (Victoria Efimova) wrote…
yep, will change it

.! at the end of the string constant

cmd/vmwrapper/vmwrapper.go, line 270 at r5 (raw file):

	signal.Notify(sigTERM, syscall.SIGTERM)

	if os.Args[1] == "-child" {

This will give panic: runtime error: index out of range if vmwrapper invoked w/o args. This is not going to happen most of the time but still can be confusing. It would be better to check the number of args

contrib/images/local-cluster/start.sh, line 19 at r5 (raw file):

export CONTAINER_RUNTIME=remote
export CONTAINER_RUNTIME_ENDPOINT=/run/virtlet.sock
while [[ ! -e "$CONTAINER_RUNTIME_ENDPOINT" ]]

No need to fix this I think, just noting that IIRC it's explicitly mentioned in bash docs that you don't need extra quoting inside [[ ... ]]

pkg/libvirttools/virtualization.go, line 390 at r5 (raw file):

		}
		return di.State == libvirt.DOMAIN_SHUTDOWN || di.State == libvirt.DOMAIN_SHUTOFF, nil
	}, 10*time.Second, 60*time.Second)

It would be better to move all these time values to constants with meaningful names

pkg/libvirttools/virtualization.go, line 437 at r5 (raw file):

		// Other error occured
		return false, err
	}, 500*time.Millisecond, 5*time.Second)

As above -- it would be better to move all these time values to constants with meaningful names

Comments from Reviewable

Reviewed 5 of 8 files at r5.
Review status: all files reviewed at latest revision, 13 unresolved discussions.

cmd/vmwrapper/vmwrapper.go, line 2 at r5 (raw file):

/*
Copyright 2016 Mirantis

2016-2017

cmd/vmwrapper/vmwrapper.go, line 84 at r5 (raw file):

			glog.Infof("Received EOF on pipe from parent process. Forwarding to child SIGKILL.")
			if err := cmd.Process.Signal(syscall.SIGKILL); err != nil {
				glog.Errorf("Error on forwarding SIGKILL to child %v!", err)

Same on as below.

cmd/vmwrapper/vmwrapper.go, line 88 at r5 (raw file):

			procTerminated = true
		case <-sigTERM:
			glog.Infof("Received SIGTERM. Forwarding to child and wait the process to stop.!")

Dot mixed with exclamation mark. All exclamation marks in info/error messages can be removed.

cmd/vmwrapper/vmwrapper.go, line 90 at r5 (raw file):

			glog.Infof("Received SIGTERM. Forwarding to child and wait the process to stop.!")
			if err := cmd.Process.Signal(syscall.SIGTERM); err != nil {
				glog.Errorf("Error on forwarding SIGTERM to child %v!", err)

Was on sending, is on forwarding. Should be sending or forwarding.

cmd/vmwrapper/vmwrapper.go, line 111 at r5 (raw file):

func catchParentKilled(exitEOF chan bool) {
	// Child peocess  has been spawned with setting

s/peocess/process/, double space.
Whole comment could is a bit unclear. Maybe better would be:
Child process is connected to read endpoint of pipe, on 3rd file descriptor.
In loop, try to read something from pipe until it's closed by second side.

cmd/vmwrapper/vmwrapper.go, line 120 at r5 (raw file):

		if err == io.EOF {
			break
		}

What about other errors, are you sure that nothing else could happened there?

cmd/vmwrapper/vmwrapper.go, line 162 at r5 (raw file):

		}
		return
	}

Couldn't this be moved to parent? In this case spawning child is unnecessary...

pkg/libvirttools/virtualization.go, line 376 at r5 (raw file):

	// To process cases when VM is booting and cannot handle the shutdown signal.
	// Send sequential shutdown requests with 1 sec interval until domain is shutoff or time after 60 sec.

Probably first line should should end without dot and second should be started with lowercase.

pkg/libvirttools/virtualization.go, line 390 at r5 (raw file):
Previously, ivan4th (Ivan Shvedunov) wrote…
It would be better to move all these time values to constants with meaningful names

This was not introduced there but earlier. Still can be changed in this PR, but should not block it.

Comments from Reviewable

Review status: all files reviewed at latest revision, 13 unresolved discussions.

pkg/libvirttools/virtualization.go, line 390 at r5 (raw file):
Previously, jellonek (Piotr Skamruk) wrote…
This was not introduced there but earlier. Still can be changed in this PR, but should not block it.

Yes, that's just a suggestion but with two time values it became a bit more confusing

Comments from Reviewable

Fixed all comments, please take a look again.

Review status: 4 of 6 files reviewed at latest revision, 9 unresolved discussions.

Comments from Reviewable

Reviewed 2 of 2 files at r6.
Review status: all files reviewed at latest revision, 8 unresolved discussions.

Comments from Reviewable


NodePool disruption budget doesn't work

Description
Observed Behavior:
Deployed NodePool disruption budget to not do deprovisioning on weekdays, but nodes are still being deprovisioned.
Also I don't see budget field when describing my deployed NodePool config
Expected Behavior:
working NodePool disruption budget
Reproduction Steps (Please include YAML):
disruption:
  consolidationPolicy: WhenUnderutilized
  expireAfter: 720h
  budgets:
  - schedule: "0 * * * mon-fri"
    duration: 1h
    nodes: 0
  - nodes: 10%

Versions:

Chart Version: 0.35.0
Kubernetes Version (kubectl version): 1.27

Please vote on this issue by adding a 👍 reaction to the original issue to help the community and maintainers prioritize this request
Please do not leave "+1" or "me too" comments, they generate extra noise for issue followers and do not help prioritize the request
If you are interested in working on this issue or have submitted a pull request, please leave a comment

Are you in UTC time? The schedule should only be considering the nodes in UTC time.
Please post your logs so we can see when these disruptions are occurring

I just tried your budgets spec on my cluster, and it's blocking all disruption.
This may just be the way your kubectl output was returned, but I believe your existing configuration should have failed since there'd need to be quotes around the nodes: 0 for the it to be recognized as a string and not an int.
  budgets:
  - schedule: "0 * * * mon-fri"
    duration: 1h
    nodes: "0"
  - nodes: 10%

Can you try this and see if this changes anything?

actually the problem is that helm release didn't update nodepool crds

I have exactly the same issue with Karpenter v0.34.1.
Additionally, I tried to edit the NodePool resource directly via 'kubectl edit', and add the lines @njtran suggested:
spec:
  disruption:
    consolidationPolicy: WhenUnderutilized
    expireAfter: 10m0s
    budgets:
    - schedule: "0 * * * mon-fri"
      duration: 1h
      nodes: "0"
    - nodes: 10%

and it errors with:
strict decoding error: unknown field "spec.disruption.budgets"

and it errors with:
strict decoding error: unknown field "spec.disruption.budgets"

Do you have the same error as @adovy? If you run k describe customresourcedefinitions.apiextensions.k8s.io nodepools.karpenter.sh is it showing budgets as a field in the CRD? You might just need to upgrade the crds.

If you're trying to upgrade to Karpenter, you have to upgrade the CRDs yourself. Let us know if that fixes it.

Thanks everyone, I did exactly that, had to go through the troubleshoot guide to update the CRDs, but now budgets are working.

/close


Converting records to a pandas.DataFrame

With Pandas becoming de facto a standard tool for python data analysis, it can be useful to specify the best way (memory efficient etc) of exporting of DBF records to a pandas.DataFrame for latter processing.
This Pull Request adds a DBF.to_dataframe method which can be used as follows,
In [1]: from dbfread import DBF
   ...: db = DBF("/tmp/people.dbf")
   ...: db.to_dataframe()
Out[1]:
    BIRTHDATE   NAME
0  1987-03-01  Alice
1  1980-11-12    Bob

This does not add the pandas dependency to dbfread: pandas is indeed imported in the to_dataframe method but presumably people who would be interested in this would have pandas installed, while it should not impact the rest of the users.
If for design reasons adding this import is an issue, feel free to reject this PR. Although, in this case, adding a small section in the documentation regarding conversion to pandas could be nice.
This basic code could be later extended to ensure that different fields have the correct type in the DataFrame (e.g. date type for the  BIRTHDATE).

Thanks for bringing this up!
Playing around a bit with data frame I found that you can do this:
pandas.DataFrame(iter(db))

which has the same effect as passing _iter_records():
>>> iter(db)
<generator object _iter_records at 0x7f6618a327d0>
>>> db._iter_records(b' ')
<generator object _iter_records at 0x7f6618a326e0>

Would this work for you?
In any case I agree that the docs should include a section about Pandas.

I agree that iter(db) is better. The natural thing would have been to define the DBF class as class DBF(collections.Iterator), so it could be automatically detected as an iterator by pandas in pandas.DataFrame(db). However, for whatever reason that is explicitly not supported. Not sure why that is the case.
Also I just realised that giving an iterator to pandas is not more efficient than a list, as it will just convert it to a list, so maybe pandas.DataFrame(db.records) actually will make more sense as this case.
I will close this this PR, as this commit is not longer relevant, and I'm not completely sure where to add a section in the doc, so I'll let you do that :)

I have updated the docs: [908b5947cc17724eb1b038e06592be637f1b2504].


add currentOrientation(), a new example using hooks & upgrade all examples to expo v38

In trying to get a hooks example going, I ended up doing a fair amount of work I hope others might benefit from:

adjusted index.js to support both this and a useState() set function
added a new exported function: currentOrientation()
added a new example (a clone of example #2) that uses a functional component and React hooks useState & useEffect
updated example # 2 & its hook twin (now called example # 3) to display the "current orientation" in the UI
all examples upgraded to be expo v38 projects
made adjustments to example # 3 (now known as example # 4) to resolve warnings from stylized-components - as of v5 it requires units to be specified on many styles
updated all README files to reflect the above

One note: in each of the examples' package.json, the dependency for react-native-responsive-screen points to a version using yalc as the version the examples required isn't published yet (it is part of this PR...circular dependency).

If not obvious (it is quite a large PR), the likely controversial parts of this are:

Move to use of Expo.  The thinking here is that if it works with Expo, then it works with React Native.  The converse is not necessarily true.  And with Expo there are far less "moving parts" for simply getting up and running.

The method signature of listenOrientationChange has changed, forcing the developer to identify whether they are passing in a class component's "this", or a functional component's "set" method from a call to useState() -- though the code does not enforce that function be a useState() function, so you could pass in any type of function.

Can I use your fork in a production?

Can I use your fork in a production?

It is warranted for its full price 🙂
I am using it in production.

It is warranted for its full price 🙂
I am using it in production.

@gregfenton you could as well add hook support to currentOrientation, I can help if you'd like


Atom

So my antivirus decided that Atom was a virus and deleted it. I went to redownload it and reset it up and now it is telling me that it can't be installed and gave me a huge long error message which I will post at the bottom of this for those who might need it to help me. I'm not sure how to get it reinstalled with the error its giving me.

`
8664> 2017-02-03 17:46:28> Program: Starting Squirrel Updater: --install .
8664> 2017-02-03 17:46:28> Program: Starting install, writing to C:\Users\sl115413\AppData\Local\SquirrelTemp
8664> 2017-02-03 17:46:28> Program: About to install to: C:\Users\sl115413\AppData\Local\Discord
8664> 2017-02-03 17:46:28> SingleGlobalInstance: Grabbing lockfile with timeout of 00:00:10
8664> 2017-02-03 17:46:28> CheckForUpdateImpl: Reading RELEASES file from C:\Users\sl115413\AppData\Local\SquirrelTemp
8664> 2017-02-03 17:46:28> CheckForUpdateImpl: Remote version 0.0.297 differs from local
8664> 2017-02-03 17:46:28> CheckForUpdateImpl: First run or local directory is corrupt, starting from scratch
8664> 2017-02-03 17:46:28> ApplyReleasesImpl: Writing files to app directory: C:\Users\sl115413\AppData\Local\Discord\app-0.0.297
8664> 2017-02-03 17:46:30> ApplyReleasesImpl: Moving file C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\lib\net45\content_resources_200_percent.pak to C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\content_resources_200_percent.pak
8664> 2017-02-03 17:46:30> ApplyReleasesImpl: Moving file C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\lib\net45\app.ico to C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\app.ico
8664> 2017-02-03 17:46:30> ApplyReleasesImpl: Moving file C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\lib\net45\blink_image_resources_200_percent.pak to C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\blink_image_resources_200_percent.pak
8664> 2017-02-03 17:46:30> ApplyReleasesImpl: Moving file C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\lib\net45\content_shell.pak to C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\content_shell.pak
8664> 2017-02-03 17:46:30> ApplyReleasesImpl: Moving file C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\lib\net45\d3dcompiler_47.dll to C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\d3dcompiler_47.dll
8664> 2017-02-03 17:46:30> ApplyReleasesImpl: Moving file C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\lib\net45\Discord.exe to C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\Discord.exe
8664> 2017-02-03 17:46:30> ApplyReleasesImpl: Moving file C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\lib\net45\ffmpeg.dll to C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\ffmpeg.dll
8664> 2017-02-03 17:46:30> ApplyReleasesImpl: Moving file C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\lib\net45\icudtl.dat to C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\icudtl.dat
8664> 2017-02-03 17:46:30> ApplyReleasesImpl: Moving file C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\lib\net45\libEGL.dll to C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\libEGL.dll
8664> 2017-02-03 17:46:30> ApplyReleasesImpl: Moving file C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\lib\net45\libGLESv2.dll to C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\libGLESv2.dll
8664> 2017-02-03 17:46:30> ApplyReleasesImpl: Moving file C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\lib\net45\node.dll to C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\node.dll
8664> 2017-02-03 17:46:30> ApplyReleasesImpl: Moving file C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\lib\net45\Squirrel.exe to C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\Squirrel.exe
8664> 2017-02-03 17:46:30> ApplyReleasesImpl: Moving file C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\lib\net45\natives_blob.bin to C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\natives_blob.bin
8664> 2017-02-03 17:46:30> ApplyReleasesImpl: Moving file C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\lib\net45\snapshot_blob.bin to C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\snapshot_blob.bin
8664> 2017-02-03 17:46:30> ApplyReleasesImpl: Moving file C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\lib\net45\ui_resources_200_percent.pak to C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\ui_resources_200_percent.pak
8664> 2017-02-03 17:46:30> ApplyReleasesImpl: Moving file C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\lib\net45\views_resources_200_percent.pak to C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\views_resources_200_percent.pak
8664> 2017-02-03 17:46:30> ApplyReleasesImpl: Moving file C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\lib\net45\xinput1_3.dll to C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\xinput1_3.dll
8664> 2017-02-03 17:46:31> ApplyReleasesImpl: Started updateSelf pid 9652
8664> 2017-02-03 17:46:31> ApplyReleasesImpl: Squirrel Enabled Apps: [C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\Discord.exe]
8664> 2017-02-03 17:46:32> Utility: Process Started: C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\Discord.exe --squirrel-install 0.0.297, pid 6920
8664> 2017-02-03 17:46:35> Utility: Received exitcode 0 from process C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\Discord.exe
8664> 2017-02-03 17:46:35> ApplyReleasesImpl: ran C:\Users\sl115413\AppData\Local\Discord\app-0.0.297\Discord.exe, pid 8684
8664> 2017-02-03 17:46:35> ApplyReleasesImpl: Starting fixPinnedExecutables
8664> 2017-02-03 17:46:35> ApplyReleasesImpl: fixPinnedExecutables: newCurrentFolder: app-0.0.297
8664> 2017-02-03 17:46:35> ApplyReleasesImpl: File 'C:\Users\sl115413\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Accessibility\Narrator.lnk' could not be converted into a valid ShellLink: System.IO.FileNotFoundException: The system cannot find the file specified. (Exception from HRESULT: 0x80070002)
at Squirrel.Shell.ShellLink.IShellLinkW.Resolve(IntPtr hWnd, UInt32 fFlags)
at Squirrel.Shell.ShellLink.Open(String linkFile, IntPtr hWnd, EShellLinkResolveFlags resolveFlags, UInt16 timeOut)
at Squirrel.UpdateManager.ApplyReleasesImpl.b__ec(FileInfo file)
8664> 2017-02-03 17:46:35> ApplyReleasesImpl: Updating shortcut C:\Users\sl115413\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Hammer & Chisel, Inc\Discord.lnk
8664> 2017-02-03 17:46:35> ApplyReleasesImpl: Updating shortcut C:\Users\sl115413\Desktop\Discord.lnk
8664> 2017-02-03 17:46:35> ApplyReleasesImpl: Fixing up tray icons
8664> 2017-02-03 17:46:35> ApplyReleasesImpl: cleanDeadVersions: for version 0.0.297
8664> 2017-02-03 17:46:35> ApplyReleasesImpl: cleanDeadVersions: exclude current version folder app-0.0.297
2017-09-01 13:01:18> Program: Starting Squirrel Updater: --install .
2017-09-01 13:01:18> Program: Starting install, writing to C:\Users\sl115413\AppData\Local\SquirrelTemp
2017-09-01 13:01:18> Program: About to install to: C:\Users\sl115413\AppData\Local\GitHubDesktop
2017-09-01 13:01:19> CheckForUpdateImpl: Couldn't write out staging user ID, this user probably shouldn't get beta anything: System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Users\sl115413\AppData\Local\GitHubDesktop\packages.betaId'.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.StreamWriter.CreateFile(String path, Boolean append, Boolean checkHost)
at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize, Boolean checkHost)
at System.IO.File.InternalWriteAllText(String path, String contents, Encoding encoding, Boolean checkHost)
at System.IO.File.WriteAllText(String path, String contents, Encoding encoding)
at Squirrel.UpdateManager.CheckForUpdateImpl.getOrCreateStagedUserId()
2017-09-01 13:01:19> CheckForUpdateImpl: Failed to load local releases, starting from scratch: System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Users\sl115413\AppData\Local\GitHubDesktop\packages\RELEASES'.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
at Squirrel.Utility.LoadLocalReleases(String localReleaseFile)
at Squirrel.UpdateManager.CheckForUpdateImpl.d__2.MoveNext()
2017-09-01 13:01:19> CheckForUpdateImpl: Reading RELEASES file from C:\Users\sl115413\AppData\Local\SquirrelTemp
2017-09-01 13:01:19> CheckForUpdateImpl: First run or local directory is corrupt, starting from scratch
2017-09-01 13:01:19> ApplyReleasesImpl: Writing files to app directory: C:\Users\sl115413\AppData\Local\GitHubDesktop\app-0.8.0
2017-09-01 13:01:19> LogHost: Rigging execution stub for lib/net45/GitHubDesktop_ExecutionStub.exe to C:\Users\sl115413\AppData\Local\GitHubDesktop\GitHubDesktop.exe
2017-09-01 13:01:20> LogHost: Rigging execution stub for lib/net45/resources/app/git/mingw64/libexec/git-core/GitHub.Authentication_ExecutionStub.exe to C:\Users\sl115413\AppData\Local\GitHubDesktop\app-0.8.0\resources\app\git\mingw64\libexec\GitHub.Authentication.exe
2017-09-01 13:01:23> ApplyReleasesImpl: Squirrel Enabled Apps: [C:\Users\sl115413\AppData\Local\GitHubDesktop\app-0.8.0\GitHubDesktop.exe]
2017-09-01 13:01:27> ApplyReleasesImpl: Starting fixPinnedExecutables
2017-09-01 13:01:27> ApplyReleasesImpl: Examining Pin: Battle.net.lnk
2017-09-01 13:01:27> ApplyReleasesImpl: Examining Pin: File Explorer.lnk
2017-09-01 13:01:27> ApplyReleasesImpl: Examining Pin: Google Chrome.lnk
2017-09-01 13:01:27> ApplyReleasesImpl: Examining Pin: HOTSLogsUploader.lnk
2017-09-01 13:01:27> ApplyReleasesImpl: Examining Pin: Warcraft III.lnk
2017-09-01 13:01:27> ApplyReleasesImpl: Fixing up tray icons
2017-09-01 13:01:27> ApplyReleasesImpl: Couldn't rewrite shim RegKey, most likely no apps are shimmed: System.NullReferenceException: Object reference not set to an instance of an object.
at Squirrel.UpdateManager.ApplyReleasesImpl.b__13_0(RegistryView view)
2017-09-01 13:01:27> ApplyReleasesImpl: Couldn't rewrite shim RegKey, most likely no apps are shimmed: System.NullReferenceException: Object reference not set to an instance of an object.
at Squirrel.UpdateManager.ApplyReleasesImpl.b__13_0(RegistryView view)
2017-09-01 13:01:27> ApplyReleasesImpl: cleanDeadVersions: for version 0.8.0
2017-09-01 13:01:27> ApplyReleasesImpl: cleanDeadVersions: exclude folder app-0.8.0
2017-09-01 13:04:21> Program: Starting Squirrel Updater: --install .
2017-09-01 13:04:21> Program: Starting install, writing to C:\Users\sl115413\AppData\Local\SquirrelTemp
2017-09-01 13:04:21> Program: About to install to: C:\Users\sl115413\AppData\Local\atom
2017-09-01 13:04:21> CheckForUpdateImpl: Couldn't write out staging user ID, this user probably shouldn't get beta anything: System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Users\sl115413\AppData\Local\atom\packages.betaId'.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.StreamWriter.CreateFile(String path, Boolean append, Boolean checkHost)
at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize, Boolean checkHost)
at System.IO.File.InternalWriteAllText(String path, String contents, Encoding encoding, Boolean checkHost)
at System.IO.File.WriteAllText(String path, String contents, Encoding encoding)
at Squirrel.UpdateManager.CheckForUpdateImpl.getOrCreateStagedUserId()
2017-09-01 13:04:21> CheckForUpdateImpl: Failed to load local releases, starting from scratch: System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Users\sl115413\AppData\Local\atom\packages\RELEASES'.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
at Squirrel.Utility.LoadLocalReleases(String localReleaseFile)
at Squirrel.UpdateManager.CheckForUpdateImpl.d__2.MoveNext()
2017-09-01 13:04:21> CheckForUpdateImpl: Reading RELEASES file from C:\Users\sl115413\AppData\Local\SquirrelTemp
2017-09-01 13:04:21> CheckForUpdateImpl: First run or local directory is corrupt, starting from scratch
2017-09-01 13:04:21> ApplyReleasesImpl: Writing files to app directory: C:\Users\sl115413\AppData\Local\atom\app-1.19.5
2017-09-01 13:04:24> LogHost: Rigging execution stub for atom_ExecutionStub.exe to C:\Users\sl115413\AppData\Local\atom\atom.exe
2017-09-01 13:05:00> ApplyReleasesImpl: Squirrel Enabled Apps: [C:\Users\sl115413\AppData\Local\atom\app-1.19.5\atom.exe]
2017-09-01 13:05:05> ApplyReleasesImpl: Starting fixPinnedExecutables
2017-09-01 13:05:05> ApplyReleasesImpl: Examining Pin: Battle.net.lnk
2017-09-01 13:05:05> ApplyReleasesImpl: Examining Pin: File Explorer.lnk
2017-09-01 13:05:05> ApplyReleasesImpl: Examining Pin: Google Chrome.lnk
2017-09-01 13:05:05> ApplyReleasesImpl: Examining Pin: HOTSLogsUploader.lnk
2017-09-01 13:05:05> ApplyReleasesImpl: Examining Pin: Warcraft III.lnk
2017-09-01 13:05:05> ApplyReleasesImpl: Fixing up tray icons
2017-09-01 13:05:05> ApplyReleasesImpl: Couldn't rewrite shim RegKey, most likely no apps are shimmed: System.NullReferenceException: Object reference not set to an instance of an object.
at Squirrel.UpdateManager.ApplyReleasesImpl.b__13_0(RegistryView view)
2017-09-01 13:05:05> ApplyReleasesImpl: Couldn't rewrite shim RegKey, most likely no apps are shimmed: System.NullReferenceException: Object reference not set to an instance of an object.
at Squirrel.UpdateManager.ApplyReleasesImpl.b__13_0(RegistryView view)
2017-09-01 13:05:05> ApplyReleasesImpl: cleanDeadVersions: for version 1.19.5
2017-09-01 13:05:05> ApplyReleasesImpl: cleanDeadVersions: exclude folder app-1.19.5
2017-09-12 23:43:10> Program: Starting Squirrel Updater: --install . --rerunningWithoutUAC
2017-09-12 23:43:10> Program: Starting install, writing to C:\Users\sl115413\AppData\Local\SquirrelTemp
2017-09-12 23:43:10> Program: About to install to: C:\Users\sl115413\AppData\Local\atom
2017-09-12 23:43:10> Program: Install path C:\Users\sl115413\AppData\Local\atom already exists, burning it to the ground
2017-09-12 23:43:14> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources\app\apm\node_modules\git-utils\deps\libgit2\tests\resources\empty_standard_repo.gitted\refs: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:14> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources\app\apm\node_modules\git-utils\deps\libgit2\tests\resources\empty_standard_repo.gitted: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:14> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources\app\apm\node_modules\git-utils\deps\libgit2\tests\resources\empty_standard_repo: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:14> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources\app\apm\node_modules\git-utils\deps\libgit2\tests\resources\issue_592b.gitted\refs: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:14> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources\app\apm\node_modules\git-utils\deps\libgit2\tests\resources\issue_592b.gitted: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:14> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources\app\apm\node_modules\git-utils\deps\libgit2\tests\resources\issue_592b: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:18> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.7\resources\app\less-compile-cache\9d2ea713bdbcf951a767c144479a96a90db770bf: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:18> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.7\resources\app\less-compile-cache: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:19> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources\app\node_modules\apparatus\lib\apparatus: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:19> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources\app\node_modules\apparatus\lib: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:19> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources\app\node_modules\apparatus: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:21> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources\app\apm\node_modules\git-utils\deps\libgit2\tests\resources\twowaymerge.git\objects: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:21> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources\app\apm\node_modules\git-utils\deps\libgit2\tests\resources\twowaymerge.git: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:21> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources\app\apm\node_modules\git-utils\deps\libgit2\tests\resources: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:21> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources\app\apm\node_modules\git-utils\deps\libgit2\tests: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:21> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources\app\apm\node_modules\git-utils\deps\libgit2: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:21> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources\app\apm\node_modules\git-utils\deps: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:21> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources\app\apm\node_modules\git-utils: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:22> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources\app\apm\node_modules: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:22> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources\app\apm: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:22> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources\app\apm\node_modules\git-utils\deps\libgit2\tests\resources: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:22> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources\app\apm\node_modules\git-utils\deps\libgit2\tests: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:22> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources\app\apm\node_modules\git-utils\deps\libgit2: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:22> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources\app\apm\node_modules\git-utils\deps: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:22> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources\app\apm\node_modules\git-utils: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:22> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources\app\apm\node_modules: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:22> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources\app\apm: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:23> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources\app\node_modules\htmlparser2\node_modules: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:23> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources\app\node_modules\htmlparser2: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:33> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources\app\node_modules: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:33> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources\app: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:33> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5\resources: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:33> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.5: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:34> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources\app\node_modules\mocha-multi-reporters\node_modules\lodash: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:34> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources\app\node_modules\mocha-multi-reporters\node_modules: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:34> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources\app\node_modules\mocha-multi-reporters: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:34> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.7\resources\app: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:34> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.7\resources: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:34> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.19.7: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:34> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources\app\node_modules: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:34> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources\app: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:34> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0\resources: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:34> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom\app-1.20.0: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:34> Utility: DeleteDirectory: could not delete - C:\Users\sl115413\AppData\Local\atom: System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at Squirrel.Utility.d__19.MoveNext()
2017-09-12 23:43:34> IEnableLogger: Failed to copy Update.exe to C:\Users\sl115413\AppData\Local\atom\Update.exe: System.UnauthorizedAccessException: Access to the path 'C:\Users\sl115413\AppData\Local\atom\Update.exe' is denied.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost)
at System.IO.File.Copy(String sourceFileName, String destFileName, Boolean overwrite)
at Squirrel.Update.Program.<>c__DisplayClass4_1.b__5()
at Squirrel.Utility.LogIfThrows(IFullLogger This, LogLevel level, String message, Action block)
2017-09-12 23:43:34> Unhandled exception: System.AggregateException: One or more errors occurred. ---> System.UnauthorizedAccessException: Access to the path 'C:\Users\sl115413\AppData\Local\atom\Update.exe' is denied.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost)
at System.IO.File.Copy(String sourceFileName, String destFileName, Boolean overwrite)
at Squirrel.Update.Program.<>c__DisplayClass4_1.b__5()
at Squirrel.Utility.LogIfThrows(IFullLogger This, LogLevel level, String message, Action block)
at Squirrel.Utility.ErrorIfThrows(IEnableLogger This, Action block, String message)
at Squirrel.Update.Program.d__4.MoveNext()
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.Wait()
at Squirrel.Update.Program.executeCommandLine(String[] args)
at Squirrel.Update.Program.main(String[] args)
---> (Inner Exception #0) System.UnauthorizedAccessException: Access to the path 'C:\Users\sl115413\AppData\Local\atom\Update.exe' is denied.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost)
at System.IO.File.Copy(String sourceFileName, String destFileName, Boolean overwrite)
at Squirrel.Update.Program.<>c__DisplayClass4_1.b__5()
at Squirrel.Utility.LogIfThrows(IFullLogger This, LogLevel level, String message, Action block)
at Squirrel.Utility.ErrorIfThrows(IEnableLogger This, Action block, String message)
at Squirrel.Update.Program.d__4.MoveNext()<---
`

@Glossyy  So I looked up your issue and here is what I found ironically all on github.
Atom detected as malware
Just so you don't feel all alone apparently an old issue searching through this thread may help you.
Alternative releases
Some people had the same issue as you did installing. Here are some alternate releases that may work.
Just an opinion here if you are using Avast free maybe consider trusting Windows Defender in Windows 10 it is pretty much equal to the Avast Free version. It took me a minute to trust it as well. I have never heard of Windows defender deleting a program. So there is that.

Well at least I'm not alone. I think I have windows defender AND Avast somehow on. Maybe I'll just uninstall Avast. The strange thing is I had no problems with Atom last week at all. And then this happened. I will look through the things you linked and see what I can do to get it back up and running.

I uninstalled Avast, went back and attempted to reinstall Atom and it worked, so if anyone else has that problem that may be a solution too :)

I had to re-download atom 5 separate times and it works randomly, I just have to be patient with it on whether it will open or not haha!


Safari 10.1.2 month title bug

Hi, everyone! :)
I encountered a strange behavior of month title (it is moving to the bottom every time I select highlighted date) in Safari 10.1.2:

isDayHighlighted prop function is copied from your examples and looks like:
const isSameDay = (a, b) => {
  if (!moment.isMoment(a) || !moment.isMoment(b)) {
    return false
  }

  return a.date() === b.date() &&
    a.month() === b.month() &&
    a.year() === b.year()
}

const higlightDays = day => day1 => isSameDay(day, day1)

highlightDay = day => {
    const { highlightedDays } = this.props

    return highlightedDays && highlightedDays.some(higlightDays(day))
}

CSS for month title looks like this:
.CalendarMonth__caption
    position: relative
    padding-left: 2px
    height: 26px
    text-align: left

    strong
      font-size: 14px
      font-weight: 600
      line-height: 16px
      color: var(--greyCharcoal)

  .CalendarMonth--horizontal
    .CalendarMonth__caption
      padding-top: 12px
      padding-left: 0
      height: 76px
      text-align: center

I'm using 12.5.1 version of react-dates, component - DayPickerRangeController and testing it in Safari 10.1.2 in storybook. I also could not repeat that issue on your examples. That's happening only in Safari.

@ArtyomResh This is incredibly weird. When you say I also could not repeat that issue on your examples, do you mean that the storybook itself works as expected in Safari?
Can you share the computed css on the caption as it moves down? Is the position being set as an inline style? What is being updated to push it down?

Hi @ArtyomResh
did you finally fix it? I'm having the same issue.
Thanks!


Add 'confirm password' field to the sign up page

This would allow users to ensure the password they input was the one they wanted

Is your feature request related to a problem? Please describe.
When a user sets their password, there is only one password field. If the user mistypes the password, they will have no way of knowing it happened.
Describe the solution you'd like
There should be a confirm password field, where the user must re-enter the new password to ensure they match.


GSD Request

--- GSD JSON ---
{
  "vendor_name": "Linux",
  "product_name": "Kernel",
  "product_version": "versions from  to before v5.15.19",
  "vulnerability_type": "unspecified",
  "affected_component": "unspecified",
  "attack_vector": "unspecified",
  "impact": "unspecified",
  "credit": "",
  "references": [
    "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=3df52448978802ae15dcebf66beba1029df957b4"
  ],
  "extended_references": [
    {
      "type": "commit",
      "value": "3df52448978802ae15dcebf66beba1029df957b4",
      "note": "fixed"
    }
  ],
  "reporter": "joshbressers",
  "reporter_id": 1692786,
  "notes": "",
  "description": "efi: runtime: avoid EFIv2 runtime services on Apple x86 machines\n\nThis is an automated ID intended to aid in discovery of potential security vulnerabilities. The actual impact and attack plausibility have not yet been proven.\nThis ID is fixed in Linux Kernel version v5.15.19 by commit 3df52448978802ae15dcebf66beba1029df957b4. For more details please see the references link."
}
--- GSD JSON ---

This issue has been assigned GSD-2022-1000243


Create FunctionConfig class for Redactor and move "static" info to it.

For performance purposes, our AZ Functions are set to be Always ON.
Because of that, we can initiate and cache some things at the class level so that we don't have to perform those operations every time the FN is invoked.
Create a FunctionConfig class that initializes environment variables and static config files.
Instantiate the FunctionConfig at the class level on the AZ Function class.
For Redactor:

[ ] Move Reading Environment variables to Function Config.
[ ] Move eventHubSender to FunctionConfig
[ ] Move Helper instantiation to FunctionConfig and  Read all 4 redactor configurations on init and cache them in-memory

Other refactoring:

[ ] Move  val startTime = Date().toIsoString() to inside the messages.forEach loop
[ ] Enhance Logging (See Receiver/Debatcher for template)

[ ]  prefix every logging with "DEX::
[ ]  Log receiving message, sending message and any error (catches should have a logging)
[ ]  Do not include entire message on logs (PII issues). Keep logs short.

[ ] Better encapsulate variables used inside the loop -
The following variables should be declared and instantiated inside the loop:

        var hl7Content : String
        var metadata : JsonObject
        var filePath : String
        var messageUUID : String

PR - https://github.com/CDCgov/data-exchange-hl7/pull/1051


Potential formula confusion

The ion-ion potential in K.Michaelian paper is:

and the one found in the Compphys minmax is:

and in the paper, the potential formula is referenced to:

For this homework, which formula should we follow?

@reshnashrestha have you got the answer for potential energy formula to be used. I think the formula are basically same, the only difference is that the negative ion include additional repulsive Pauli energy.

Yeah we should be using the one used in the CompPhys


Synthetic comment duplicated on class with decorators

Bug Report
🔎 Search Terms
setSyntheticLeadingComments, updateClassDeclaration, transformer
🕗 Version & Regression Information
My project has a custom transformer that declares new static properties on classes and attaches comments to them using the setSyntheticLeadingComments function. In TypeScript version 4.4 the comments are duplicated if the class has at least one decorator. If the class doesn't have decorators, the comments are emitted only once.

This changed between versions 4.3.5 and 4.4.2

⏯ Playground Link
Since this is a problem with the compiler API, I can't link to the playground. Instead I have isolated the issue in a small repository.
Link to the reproduction repository
To reproduce the issue, do the follwoing:

git clone https://github.com/crisbeto/ts-4.4-synthetic-comment.git
npm install inside the repo.
npm run transform.
Observe the console output which contains two comments with the text /* This should only exist once */ instead of one.

💻 Code
This is the same code as the repository that is linked above.
Transformer that adds the synthetic comment (transform.ts):
import * as ts from 'typescript';

const program = ts.createProgram(['./sample.ts'], {
  module: ts.ModuleKind.CommonJS,
  importHelpers: true,
  lib: ['dom', 'es2015'],
  target: ts.ScriptTarget.ES2017,
  declaration: true,
  experimentalDecorators: true,
  emitDecoratorMetadata: false,
});

const transformer: ts.TransformerFactory<ts.SourceFile> = context => {
  return sourceFile => {
    const visitor = (node: ts.Node): ts.Node => {
      if (ts.isClassDeclaration(node)) {
        const initializer = ts.createLiteral('hello');
        const prop = ts.createProperty(
            undefined, [ts.createToken(ts.SyntaxKind.StaticKeyword)],
            'customStaticProp', undefined, undefined, initializer);

        ts.setSyntheticLeadingComments(prop, [
          {
            kind: ts.SyntaxKind.MultiLineCommentTrivia,
            text: ' This should only exist once ',
            pos: -1,
            end: -1,
            hasTrailingNewLine: true,
          },
        ]);

        return ts.updateClassDeclaration(
            node, node.decorators, node.modifiers, node.name,
            node.typeParameters, node.heritageClauses, [...node.members, prop]);
      }

      return ts.visitEachChild(node, visitor, context);
    };

    return ts.visitNode(sourceFile, visitor);
  };
};

program.emit(
    undefined, ((fileName, outputText) => {
      console.log(outputText);
      console.log('---------------------', fileName);
    }),
    undefined, undefined, {before: [transformer]});

File that is being transformed (sample.ts):
function MyDecorator<T>(cls: T, ...args: any[]) {
  return cls;
}

@MyDecorator
export class Foo {
}

🙁 Actual behavior
TypeScript compiles the customStaticProp to the following:
/* This should only exist once */
/* This should only exist once */
Foo.customStaticProp = "hello";

🙂 Expected behavior
The customStaticProp should be compiled to:
/* This should only exist once */
Foo.customStaticProp = "hello";

Thanks @mprobst!


add optionvars

Feature propose
Add rezconfig.optionvars to store arbitrary key-value data and retrieve them in package.
# rezconfig.py
optionvars = {
    "hello": "world"
}

# package.py
name = "foo"
def commands():
    print(optionvars("hello"))

> rez-env foo
world

Use case
I currently would use this feature to setup local payload path for package development across developer machines.
# package.py
name = "foo"
def commands():
    if intersects(ephemerals.get("dev.foo", "dev.foo-0"), "1"):
        env.PYTHONPATH.append(optionvars("foo_dev_src"))
    else:
        env.PYTHONPATH.append("{root}/payload")

I know my use case could have many alternatives, but I thought this would be the most convenient approach with ephemeral packages and rezconfig involved.
What do you think ?

Just to be more clearer.
The main idea of this feature, is like adding user preferences on package or the value of corresponding ephemeral, which may not easy to define in package's definition file due to the differences between machines/users.
Although we can define those as environment variables in a shell launching script, but I think it would be better if those can be managed by rezconfig, and traced with rez-config command. In result, the startup environment can be simplified.

What if we were just to expose the config object instead? I like this idea as it may be helpful to expose other exisitng config settings; but also a studio isn't forced to use a specific optionvars key and could instead choose their own.

Thanks !!

isn't forced to use a specific optionvars key and could instead choose their own.

Not sure I understand this, do you mean that one could pick their own name instead of "optionvars" ?
If so, I think we cannot do this actually, rezconfig only accept key that is in it's schema.

Ah yes - I was thinking about package definitions, not the config.
Ok, I think this is fine.
A
On Tue, Mar 9, 2021 at 11:59 AM David Lai<EMAIL_ADDRESS>wrote:

Thanks !!
isn't forced to use a specific optionvars key and could instead choose
their own.
Not sure I understand this, do you mean that one could pick their own name
instead of "optionvars" ?
If so, I think we cannot do this actually, rezconfig only accept key that
is in it's schema.
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/nerdvegas/rez/pull/1036#issuecomment-793221531, or
unsubscribe
https://github.com/notifications/unsubscribe-auth/AAMOUSTNZECFQ4YAEDS73MLTCVXGZANCNFSM4YVSMVKA
.

Great, thanks !
Will start updating Wiki doc for this.

Note that when updating the wiki, you need a section in https://github.com/nerdvegas/rez/wiki/Package-Commands#objects. In this case I think it'd be fine for that to be very brief and link to the optionvars section in Configuring-Rez. Something like
### optionvars
*Function*

Arbitrary data from the rez config, that can be accessed by packages. See the [config setting](...) for more details.

Just checking, is this able to be merged ?

It's on my list yes. I can probably get to it next week.
A
On Wed, Mar 24, 2021 at 8:35 PM David Lai @.***> wrote:

Just checking, is this able to be merged ?
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/nerdvegas/rez/pull/1036#issuecomment-805647589, or
unsubscribe
https://github.com/notifications/unsubscribe-auth/AAMOUSRVXP45GA2VJXLS73TTFGW5LANCNFSM4YVSMVKA
.


Add register_components helper for registering View Component helper methods

Context
We want to be able to rapidly create and use View Components. By following the precedent set with the GOV UK components gem, we can easily add in view helpers to render our view components.

Changes proposed in this pull request

Add a register_components method to the ComponentsHelper.

Guidance to review

See the example at app/components/claims/greeting_component.rb.
Try adding a new custom View Component, registering it via register_components, and finally rendering it on a page.

Link to Trello card

Things to check

[ ] If the code removes any existing feature flags, a data migration has also been added to delete the entry from the database
[ ] This code does not rely on migrations in the same Pull Request
[ ] If this code includes a migration adding or changing columns, it also backfills existing records for consistency
[ ] If this code adds a column to the DB, decide whether it needs to be in analytics yml file or analytics blocklist
[ ] API release notes have been updated if necessary
[ ] If it adds a significant user-facing change, is it documented in the CHANGELOG?
[ ] Required environment variables have been updated or added to the Azure KeyVault

@ollietreend @elceebee @CatalinVoineag Alrighty, based on the team feedback here, I'll drop the view helpers for the view components. 😄 😢 😄 😆


[Feature] Android app

This could be an alternative to the proprietary ChatGPT app, which doesn't work on devices without Google Play and/or in certain countries. We can use a webview wrapper (as on desktop).
I know ChatGPT Next Web works in the browser, but having an app with its own icon would be better.

Just use PWA on your Android/IOS phone, try to use 'send to desktop' button in your mobile's browser.


The settings are not saved at PowerToys Run Plug-Ins

Microsoft PowerToys version
0.58.0
Running as admin

[X] Yes

Area(s) with issue?
PowerToys Run, Settings
Steps to reproduce
https://user-images.githubusercontent.com/84781281/170314480-3ffcf6dc-5210-4bd3-9a2c-42c5422a4bdf.mp4
✔ Expected Behavior
Setting are saved automatically.
❌ Actual Behavior
After I went to another tab, the setting was disabled again.
Other Software
No response

Hi there!We need a bit more information to really debug this issue. Can you add a "Report Bug" zip file here?  Then drag the zipfile from your desktop onto the GitHub comment box in this issue. Thanks!

Ok, here: PowerToysReport_2022-05-31-19-53-06.zip

/bugreport
Also, could you please check how are your permissions for the file "%localappdata%\Microsoft\PowerToys\PowerToys Run\settings.json"? It's possible settings is unable to write there currently.

How can I see how the permissions of this file are? I found the file.

Couldn't find anything useful from the logs. If you right click the file and select Properties it shows a screen with some useful info:

Read-only or hidden could cause problems.

Looking at your user's permissions for the file in Security will also tell you if there's some permission issues.
/needinfo


allow type coercion for fields

Not sure if this is considered useful since there is a possibility to force basic type coercion by prefixing the fields with 'date' or 'amount'. But since explicit is better than implicit, maybe it is.

It should be automagical where possible. For edge cases, I see some use in specifying it. This would probably need more complicated field definitions. So each field to extract would have a name, regex, type, etc defined.
I also don't see an example template or any documentation for this feature. This would be useful too before merging it.

The feature in general is useful, but for a full PR, there should be

updated documentation
sample template
new test template

The code is also a bit hard to understand/read.
If you are interested in this feature, I suggest you open an issue and we have a discussion there. Then do a more complete PR.


Issue-Refactors Get Coin Handler

Automated Review Comments
Issues in src/actions/index.js:

(3, 'Line exceeds 80 characters')
(24, 'Line exceeds 80 characters')
(24, 'Hardcoded string found')
Issues in src/components/BitcoinTracker.js:
(14, 'Hardcoded string found')
Issues in src/reducers/coins.js:
(1, 'Line exceeds 80 characters')
(17, 'Line exceeds 80 characters')

I got it.


Start 0-stor without JWT authentification

Since the 0-stor used for the object storage cluster are not exposed to the public and only used internall for the storage system. I think it's safe to start the 0-stor servers with JWT authentification disabled.
The will simplify the configuration and deployment of the 0-stor servers greatly.
Depends on : https://github.com/zero-os/0-stor/pull/237

Won't fix


If I enter the LNURL version of my lightning address the app crashes

Description
I can scan my own lightning address in from my pay page as an lnurl encoded string (e.g. from https://pay.bbw.sv/vindard/print) and move through to the send screen. When input an amount and then hit Next the app crashes with the below screen.

this seems to not crash anymore


Add support for nested maps to csv-importer and exporter

Summary of resolution: extend the current -dest-type:map,4 thing to support multiple keys and output a nested map
===
for @kylelundstedt , the monthly loan perf data key'd by loan-id + month.

Do we have some sample data with multiple keys?

I was looking at https://nycopendata.socrata.com/Transportation/Medallion-Vehicles-Authorized/rhe8-mgbb/data. I think that some combination of VIN, License Plate, and License Number may be unique but I never figured it out.

This data changes everyday, so if you can figure out what set of columns is unique that'd be cool to track on demo.noms.io.

That data does not have a set of columns that are unique.

good to know

I guess we'll have to track it with -dest-type:set then

Or -dest-type:multiset (Map<T, number>)

@mikegray: @rafael-atticlabs has a dataset that has a compound key that you can use for development. We cannot redistribute that one though.

where can i get a copy?

@rafael-atticlabs I have this working, but I am concerned with the performance ramifications. We moved to using a StreamingMap/mapMutator/opcache to improve performance for csv-import with dest-type=map, but with the work to fix this issue we have potentially several levels of maps within maps. Since the csv file isn't guaranteed to be sorted (and likely isn't), we need to be able to either ask the StreamingMap/mapMutator/opcache if a key already exists to re-use an already created nested map or we need to basically use non-streaming Maps to be able to re-use already created Maps from earlier processing. Or maybe you have another idea?  Interested in your thoughts.

fixed with #2433


Add tests to ensure we can marshal and unmarshal our min/max times

Related to https://github.com/prometheus/client_golang/issues/614
This simply showcases the exact issue. If this test passes then the issue will be resolved (either moving the min/max time so we can parse them, or implementing parsing for the times we currently have).
cc @brian-brazil  @krasi-georgiev

@brian-brazil comment updated, tests passed.

@brian-brazil Comment updated again, I included links to both issues.

Unfortunately this requires a prometheus release+deploy for anyone impacted by this issue (server-side fix not just a client-side fix), will we be able to get this into 2.11 ?

:+1:
@brancz You own 2.11, this would be good to get in.

Considering that this is going to be handled on client_golang by switching to unix timestamps, I'm just going to merge now and not worry about getting this in to 2.11.