小编Ale*_*don的帖子

Xcode 9中的UINavigationController方法setToolbarHidden bug:自动布局约束的无限计算导致OOM

我有一个UINavigationController嵌套的实例UITabBarController.我使用导航控制器到达某个视图控制器(标签栏仍然可见),从中我切换到第二个视图控制器(标签栏不再可见).

在第二个视图控制器中,只要我调用: [self.navigationController setToolbarHidden:NO] 应用程序冻结并且内存增长,直到OOM异常崩溃.

我承认不建议将导航控制器嵌套在标签栏中,但是这个设置似乎在iOS 11之前正常工作.

编辑:当停止执行时,我看到很多调用:

UIView(UIConstraintBasedLayout)

UIView(AdditionalLayerSupport)

NSLayoutConstraint

这是完整的堆栈跟踪

* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP   * frame #0: 0x0000000106dd895c libobjc.A.dylib`objc_msgSend
+ 28
    frame #1: 0x00000001067b6b9b Foundation`-[NSConcreteMapTable removeObjectForKey:] + 138
    frame #2: 0x00000001069e6019 Foundation`_substituteOutAllOccurencesOfBodyVar + 1282
    frame #3: 0x00000001067f3c5b Foundation`-[NSISEngine tryAddingDirectly:] + 144
    frame #4: 0x00000001067f332f Foundation`-[NSISEngine tryToAddConstraintWithMarker:expression:integralizationAdjustment:mutuallyExclusiveConstraints:]
+ 440
    frame #5: 0x00000001069f2067 Foundation`-[NSLayoutConstraint _addLoweredExpression:toEngine:integralizationAdjustment:lastLoweredConstantWasRounded:mutuallyExclusiveConstraints:]
+ 273
    frame #6: 0x00000001067ea601 Foundation`-[NSLayoutConstraint _addToEngine:integralizationAdjustment:mutuallyExclusiveConstraints:] + 240
    frame #7: 0x0000000109c9488d UIKit`__57-[UIView(AdditionalLayoutSupport) …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c uinavigationcontroller ios ios11

6
推荐指数
1
解决办法
484
查看次数

刷新实例化视图同时导致表膨胀

在PostgreSQL 9.5中,我决定创建一个物化视图“效果”,并计划每小时进行一次并发刷新,因为我希望它始终可用:

REFRESH MATERIALIZED VIEW CONCURRENTLY effects;
Run Code Online (Sandbox Code Playgroud)

在开始的时候,一切都运行良好,我的实例化视图令人耳目一新,磁盘空间使用大致保持不变。


问题

但是,一段时间后,磁盘使用率开始线性增长。

我已经得出结论,这种增长的原因是物化视图,并从答案中运行查询以得到以下结果:

               what                |  bytes/ct   | bytes_pretty | bytes_per_row
-----------------------------------+-------------+--------------+---------------
 core_relation_size                | 32224567296 | 30 GB        |         21140
 visibility_map                    |      991232 | 968 kB       |             0
 free_space_map                    |     7938048 | 7752 kB      |             5
 table_size_incl_toast             | 32233504768 | 30 GB        |         21146
 indexes_size                      | 22975922176 | 21 GB        |         15073
 total_size_incl_toast_and_indexes | 55209426944 | 51 GB        |         36220
 live_rows_in_text_representation  |   316152215 | 302 MB       |           207
 ------------------------------ …
Run Code Online (Sandbox Code Playgroud)

postgresql materialized-views vacuum postgresql-9.5 autovacuum

6
推荐指数
1
解决办法
1202
查看次数

使用 Kubernetes 部署并通过 Ingress 连接后 SSE 损坏

我有一个使用 EventStream 的 ReactJS 客户端和一个实现 SSE 的 golang 后端。

当我将浏览器连接到在 localhost 上运行的后端时,以及当我的后端在带有端口转发的 k8s 上运行时,一切似乎都正常。

一旦我使用主机名创建入口(这样我就不必一直进行端口转发),SSE 就停止工作。我仍然看到客户端发送请求,并且该请求被后端接收并注册。但是,当发送事件时,它永远不会到达我的 ReactJS 应用程序。

我附上后端 SSE 实现的代码:

package sse

import (
    "encoding/json"
    "fmt"
    "net/http"
    "time"

    "go.uber.org/zap"

    "github.com/talon-one/towers/controller/api/log"
)

// the amount of time to wait when pushing a message to
// a slow client or a client that closed after `range clients` started.
const patience time.Duration = time.Second * 2

type customerStateUpdate struct {
    sseEvent
    CustomerName  string `json:"customer_name"`
    CustomerState string `json:"customer_state"`
}

type contentUpdate struct { …
Run Code Online (Sandbox Code Playgroud)

go server-sent-events reactjs kubernetes eventsource

3
推荐指数
1
解决办法
4680
查看次数

使用 HTTP 状态代码 206 - 部分内容进行分页

背景

我们的团队提出了206 - Partial Content在 REST API 中使用状态代码的想法,以指示GET对大型数据集的请求比返回的内容更多,以便允许 API 用户进行分页。hasMore这将是我们当前在响应正文中使用的标志的替代方案。

专业版

  • 使用已知的状态代码将允许 API 的用户依赖通用 HTTP 语言,而不是学习我们的“专有”语言。
  • 声称是否有更多结果表明这是非常合适的。

骗局

  • 由于所有请求都有一个pageSize数字查询参数,因此通信可能不正确,206 - Partial Content因为响应包含查询参数请求的所有结果pageSize
  • 该声明206 - Partial Content通常用于字节流,而不是集合列表。

问题

在哪些情况下可以应该 206 - Partial Content用于响应静态GET请求而发送的结果集的分页?

rest pagination http

2
推荐指数
1
解决办法
1847
查看次数

Kubernetes Pod 与容器 OOMKilled

如果我正确理解 Kubernetes OOM 杀死 pod 或容器的条件(来自 komodor.com):

如果容器使用的内存超过其内存限制,则会以 OOMKilled 状态终止。同样,如果节点上所有容器或所有 pod 的总体内存使用量超过定义的限制,则一个或多个 pod 可能会被终止。

这意味着,如果 Pod 中的容器超过总内存,它将被杀死(容器),但 Pod 本身不会被杀死。同样,如果一个 Pod 中有多个容器,并且该 Pod 本身超出了其内存限制(即该 Pod 中所有容器的内存限制之和),则该 Pod 将被 OOM 杀死。然而,只有当其中一个容器超过其内存限额时,后一种情况才可能出现。这样的话——容器不是会先被杀死吗?

我试图了解 pod 而不是容器被 OOM 杀死的实际情况。

我还注意到,当 Pod 中有一个容器并且该容器反复超出其内存限额时,Pod 和容器会间歇性地被终止。我观察到这一点 -容器将重新启动,这可以通过观察 Pod 中的日志来观察到,并且每隔一次 - Pod就会被终止并重新启动,从而增加其重新启动计数。

如果它有助于理解行为 - Pod 的 QOS 类别是Burstable

qos containers out-of-memory kubernetes

2
推荐指数
1
解决办法
8933
查看次数

使用 Gorilla Mux 端点通过 HTTP 流式传输数据

在我的 REST 端点上收到请求后,我想回复状态200和连续生成和刷新的数据主体(从数据库获取,可能非常大)。我正在寻找一种使用Gorilla Mux的有效方法,因为它已在整个项目中使用。

我看到了,这是可能的Labstack回声,因为它的ResponseWriter 支持 http.Flusher界面允许HTTP处理程序,以冲洗缓冲的数据到客户端)。不幸的是,似乎大猩猩的ResponseWriter不支持这一点。


问题:

  • 有没有办法让 Gorilla Mux 出现这种行为?
  • 如果没有,我会很感激一个指向“最薄”方法的指针来实现这种行为(我已经找到了 Labstack Echo,但也许有更好的方法?)

不变量:

  • 我不能使用WebSockets并且应该将解决方案与 REST API 集成。
  • 我将无法在服务器内存中保存整个文件。

rest flush go endpoint mux

1
推荐指数
1
解决办法
910
查看次数