小编Dan*_*Dan的帖子

"致命:数据库系统正在关闭",同时创建与PostgreSQL的连接

FATAL: the database system is shutting down在创建与PostgreSQL 9.2服务器的PostgreSQL JDBC连接时遇到错误.我从JDBC获得的特定异常路径在这里:

Caused by: org.postgresql.util.PSQLException: FATAL: the database system is shutting down
    at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:398)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:173)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:64)
    at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:136)
    at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:29)
    at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:21)
    at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:31)
    at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24)
    at org.postgresql.Driver.makeConnection(Driver.java:393)
    at org.postgresql.Driver.connect(Driver.java:267)
Run Code Online (Sandbox Code Playgroud)

从各种日志文件(来自PostgreSQL,来自我们的管理层,来自使用PostgreSQL的应用程序),我没有看到任何数据库关闭实际发生(其他连接像往常一样创建到PostgreSQL,没有从我们的管理层启动关闭等. ),但是在PostgreSQL服务器日志中,我确实看到了具有相同时间戳的错误消息:

2014-06-16 12:30:00.736 GMT LOG:  connection received: host=127.0.0.1 port=38530
2014-06-16 12:30:00.737 GMT FATAL:  the database system is shutting down
Run Code Online (Sandbox Code Playgroud)

在线研究,我了解到每当PostgreSQL关闭连接时都会使用此错误消息.

为什么PostgreSQL会拒绝给我一个新连接?这可能是由某种资源争用引起的吗?如何从PostgreSQL本身获取有关错误的更多信息?

postgresql jdbc postgresql-9.2

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

在OS X 10.11上,ps上的dtruss失败

我试图查看哪个系统调用ps用于获取OS X 10.11(El Capitan)上的进程的命令行,并遇到以下错误:

# dtruss ps -p 43520 -o args

dtrace: failed to execute ps: dtrace cannot control executables signed with restricted entitlements
Run Code Online (Sandbox Code Playgroud)

谷歌搜索结果表明,制作副本ps会让我绕过这个,但这对我不起作用.为什么我不能再dtruss使用任意二进制文件了,有什么方法可以恢复旧的行为吗?

macos truss dtrace dtruss osx-elcapitan

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

避免在分布式系统中过度使用共识协议

我是分布式系统的新手,我正在读"简单的Paxos".它创造了很多喋喋不休,我正在考虑性能影响.

假设您正在构建一个全球分布式数据库,其中有几个小型集群位于不同的位置.最小化跨站点通信量似乎很重要.

  1. 你肯定需要做出哪些决定才能达成共识?我唯一想到的就是决定是从网络添加还是删除一个节点(或一组节点?).这似乎是矢量时钟工作所必需的.另一个我不太确定是在决定写入同一位置的命令,但是这应该由一位通过Paxos选出的领导者完成吗?

  2. 避免让系统中的所有节点一起做出决定会很好.每个本地群集中的一些节点是否可以参与跨群集决策,并且所有本地节点都使用本地Paxos进行通信以确定跨站点问题的本地答案?假设网络未饱和,延迟将是相同的,但跨站点网络流量将更轻.

  3. 假设您可以沿着行拆分数据库的表,并将每个行子集分配给节点的子集.在系统中的所有机器上使用Paxos选择一组节点来包含数据的每个子集是不正常的,然后只针对处理该数据子集的所有操作在这些节点之间运行Paxos?

一个包罗万象:是否还有其他任何与设计相关或算法优化的人来解决这个问题?

distributed-computing paxos

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

鸭子在D打字

我是D的新手,我想知道是否可以方便地进行编译时检查的鸭子打字.

例如,我想定义一组方法,并要求为传递给函数的类型定义这些方法.它与interfaceD 略有不同,因为我不必在任何地方声明"类型X实现接口Y" - 只能找到方法,否则编译将失败.此外,允许在任何类型上发生这种情况都是好的,而不仅仅是结构和类.我能找到的唯一资源是这个电子邮件线程,它表明以下方法是一种不错的方法:

void process(T)(T s)
    if( __traits(hasMember, T, "shittyNameThatProbablyGetsRefactored"))
    // and presumably something to check the signature of that method
{
    writeln("normal processing");
}
Run Code Online (Sandbox Code Playgroud)

...并建议你可以将它变成一个库调用Implements,以便以下可能:

struct Interface {
    bool foo(int, float);
    static void boo(float);
    ...
}

static assert (Implements!(S, Interface));
struct S {
    bool foo(int i, float f) { ... }
    static void boo(float f) { ... }
    ...
}

void process(T)(T s) if (Implements!(T, Interface)) { ... }
Run Code Online (Sandbox Code Playgroud)

对于未在类或结构中定义的函数,是否可以执行此操作?还有其他/新方法吗?有类似的事吗?

显然,这组约束类似于Go的类型系统.我不是要开始任何火焰战争 - 我只是以一种Go也会很好用的方式使用D.

d duck-typing metaprogramming

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

PostgreSQL 中的事后死锁调试

我想收集有关 PostgreSQL 死锁中“获胜者”事务和“失败者”事务的事后调试信息。

  • 我发现这个维基页面包含一些很好的实时视图,可以提示当前出现的问题,但如果我理解正确的话,当丢失的事务已经回滚时,大多数最有用的信息将已经被删除从这些实时视图中。
  • 我看到了deadlock_timeoutlog_lock_waits等选项,它们记录有关失败事务的信息,但值得注意的是不记录获胜事务的信息。似乎没有任何方法可以自定义生成的日志输出以包含比这更详细的信息(值得注意的是,当我事后根据日志进行调试时,这些整数都没有任何意义): LOG: process 11367 still waiting for ShareLock on transaction 717 after 1000.108 ms DETAIL: Process holding the lock: 11366. Wait queue: 11367. CONTEXT: while updating tuple (0,2) in relation "foo" STATEMENT: UPDATE foo SET value = 3;

我可以使用更好的数据源来收集这些信息吗?

postgresql transactions database-deadlocks

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

轮询与中断

我对中断有一个基本的疑问.想象一下没有任何中断的计算机,所以为了让它进行I/O,CPU必须轮询*键盘以进行按键,鼠标按键定时等.现在,如果它有中断,CPU将继续检查中断线是否定期变高(或低).那么如何通过使用中断来节省CPU周期.根据我的理解而不是现在检查设备,我们正在检查中断线.有人可以解释我错误的基本逻辑.

*这里通过轮询我并不是说CPU处于忙碌状态.引用维基百科"轮询还指的是重复检查设备是否准备就绪的情况,如果不是,则计算机返回到不同的任务"

operating-system interrupt polling

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

不允许使用可变线程局部数据的别名

我是D的新手,我正在编写一个简单的多线程服务器进行练习.在C中启动客户端处理程序线程的一个常见范例是将新的accept()ed套接字的文件描述符传递给pthread_create(),但是D的std.concurrency.spawn()将不允许我传递Socket,因为它是可变的并且可以通过两个线程访问

当然,我实际上并不想要一个不可变的套接字(这就是为什么我真的不想把它放在主线程中,除非我必须) - 我想传递一个可变的套接字并让它超出范围在主线程中.我该怎么做?我应该(/可以)tid.send(s)让线程使用套接字吗?出于某种原因,这对我来说似乎非常笨拙.

我的代码现在:

void main() {
    Socket listener = new TcpSocket;
    ...
    for (;;) {
        Socket s = listener.accept();
        scope(exit) s.close();

        auto tid = spawn(&clientHandler, s);
    }
}

void clientHandler(Socket s) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

产生:错误:静态断言"不允许使用可变线程本地数据的别名"....从这里实例化:spawn!(套接字)

concurrency multithreading alias d

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

链接器选项以忽略未使用的依赖项

我想从我编译的C++二进制文件中删除所有未使用的符号.我看到了这个,它使用gcc概述,这是我正在使用的工具链:如何用GCC和ld删除未使用的C/C++符号?

但是,在我的系统上,链接选项(-Wl,--gc-sections)被拒绝:

$ gcc -fdata-sections -ffunction-sections a.c -o a.o -Wl,--gc-sections
ld: fatal: unrecognized option '--'
ld: fatal: use the -z help option for usage information
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我正在运行illumos,这是一个(相对)最新的Solaris分支,具有GCC 4.7.有谁知道这里使用的正确链接器选项是什么?


编辑:更仔细地搜索手册页"-zignore":

 -z ignore | record

     Ignores, or records, dynamic dependencies that  are  not
     referenced   as  part  of  the  link-edit.  Ignores,  or
     records, unreferenced ELF sections from the  relocatable
     objects  that  are  read  as  part  of the link-edit. By
     default, -z record is in …
Run Code Online (Sandbox Code Playgroud)

linker gcc solaris

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

如何编写跨版本/平台的Linux内核模块?

我是编程Linux内核模块的新手,许多关于该主题的入门指南包含很少有关如何构建内核模块的信息,该内核模块将在Linux的许多版本和CPU平台上运行.我见过的大多数指南都只是说"Linux不能确保版本之间的任何 ABI/API兼容性".但是,其他操作系统确实为主要版本提供了这些保证,并且指南主要针对2.7(现在有点旧).

我想知道现在是否有任何类型的ABI/API兼容性,或者是否有任何标准方法来处理版本控制,而不是将我的代码的内核相关位隔离到具有大量预处理器指令的文件中.(另外,在第二种情况下我应该使用任何标准的预处理器符号吗?)

abi kernel-module linux-device-driver linux-kernel

5
推荐指数
2
解决办法
1354
查看次数

在运行时加载jvmti的java代理,从内部卸载

我正在编写一个Java代理来与JVMTI进行交互.由于我不会涉及的原因,我需要使用JVMTI(java流程中的C接口)而不是Java API java.lang.instrument或JDI.我希望能够做一些似乎不能直接支持的事情.

  1. 有没有办法在Java进程启动后加载代理?
  2. 有没有办法从JVMTI代码内部或从进程外部卸载Java代理(没有杀死整个Java进程)?例如,dlclose()如果我能找到动态加载模块的句柄,我可以安全地从JVMTI代码调用吗?

如果无法完成这些操作,是否有办法在加载后将数据传递给Java代理?有没有通过某些Java命令行实用程序执行此操作的常规方法?如果没有,我可以安全地创建一个线程并让它在我的代理的代码中使用标准的C或C++库调用来监听套接字吗?

如果它有帮助,不要担心用你的答案支持Windows - 我正在进行这个项目来扩展一个只有Unix的调试工具.

注意:我已经看过这个但是认为可能有一些正常的方法来做这个不在JVMTI标准中.

java debugging dynamic-loading dlopen jvmti

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