__thread,记一次不成功的socket连接

背景:公司某产品自动更新特征库需求,创建临时线程,通过socket建链并下载更新特征库,前期这个需求是同事做的,由于方案问题,做了一部分做不下去了抛给了我
基于openstack的底层重度封装产品,不同头文件引用,暴露到产品层的也有多套socket连接(呵呵)
某某头文件里是:

#ifndef socket
#define socket xx_socket
#endif

又或是某某头文件里面写的:

int socket(int domain, int type, int protocol);

引用到不同头文件,又是截然不同的结果,网络经过封装,底层看不到需要使用的逻辑IP, <sys/socket.h>中的socket行不通,需要使用xx封装的xx_socket,经过尝试后,当调用到xx_socket后发现进程出现段错误复位,调用栈中的函数代码不可见,排查入参无异常,disass反汇编该调用函数和其他已有函数,xx_socket跳转的地址相同,排除引用错误的原因。
会看调用栈,栈顶函数getCompCSI(),获取组件CSI编码,有可能是线程级变量存储,gdb断点组件流程开线程之前,p getCompCSI(),结果返回正常,进入临时线程中继续p,引发复位,问题定位,线程级变量在新开线程没有初始化原因导致。

__thread

引用gcc.gnu.org中的介绍:

5.48 Thread-Local Storage

Thread-local storage (TLS) is a mechanism by which variables are allocated such that there is one instance of the variable per extant thread. The run-time model GCC uses to implement this originates in the IA-64 processor-specific ABI, but has since been migrated to other processors as well. It requires significant support from the linker (ld), dynamic linker (ld.so), and system libraries (libc.so and libpthread.so), so it is not available everywhere.

At the user level, the extension is visible with a new storage class keyword: __thread. For example:

     __thread int i;
     extern __thread struct state s;
     static __thread char *p;

The __thread specifier may be used alone, with the extern or static specifiers, but with no other storage class specifier. When used with extern or static, __thread must appear immediately after the other storage class specifier.

The __thread specifier may be applied to any global, file-scoped static, function-scoped static, or static data member of a class. It may not be applied to block-scoped automatic or non-static data member.

When the address-of operator is applied to a thread-local variable, it is evaluated at run-time and returns the address of the current thread’s instance of that variable. An address so obtained may be used by any thread. When a thread terminates, any pointers to thread-local variables in that thread become invalid.

No static initialization may refer to the address of a thread-local variable.

In C++, if an initializer is present for a thread-local variable, it must be a constant-expression, as defined in 5.19.2 of the ANSI/ISO C++ standard.

一个简单的用例,自己跑下它:

#include <stdio.h>
#include <pthread.h>

__thread int iTestVal = 1;

void* thread1(void *arg)
{
        printf("thread1, iTestVal = %d\n", iTestVal);
        iTestVal = 2;
        sleep(1);
        printf("thread1, after delay iTestVal = %d\n", iTestVal);
}

void* thread2(void *arg)
{
        printf("thread2, iTestVal = %d\n", iTestVal);
        sleep(1);
        printf("thread2, after delay iTestVal = %d\n", iTestVal);
}


int main()
{
        pthread_t pid1, pid2;
        pthread_create(&pid1, NULL, thread1, NULL);
        pthread_create(&pid2, NULL, thread2, NULL);
        pthread_join(pid1, NULL);
        pthread_join(pid2, NULL);

        return 0;
}

结果:

[root@TubbyFlashy-VM test]# gcc -lpthread main.c 
[root@TubbyFlashy-VM test]# ./a.out 
thread2, iTestVal = 1
thread1, iTestVal = 1
thread2, after delay iTestVal = 1
thread1, after delay iTestVal = 2

windows可以ping通ip,但是dns无法解析问题(dns probe possible)的解决办法

今天打开电脑,发现一切网络软件连不上网,打开浏览器报错dns probe possible,通过ping命令ping了谷歌dns 8.8.8.8和阿里dns 223.5.5.5,均可以ping通
手机通过同一个路由器访问网页也正常
尝试了ipconfig /flushdns未果
怀疑有可能是ss把本机dns搞坏了
尝试netsh winsock reset命令,提示重启,重启后正常,Bye

php升级版本后导致的500错误

php升级版本后导致的500错误

centos+lnmp+wordpress的组合,有时候会出现403错误,发现这个组合下没啥好的解决方法,有人说更新php版本有奇效,这也是成本最低的方案了,遂折腾之
lnmp更新php非常方便,upgrade.sh php,升级脚本人家都写现成的
升级后问题来了,探针正常,但wordpress 500错误,试用了治百病的重启大法,无果
怀疑php-fpm的php-cgi.sock不正确,但是探针能访问,说不过去,排查了也没发现问题
nginx日志能看到500,但是看不到更多细节,php日志也看不到有价值信息
由于只变更了php,想到了是不是php.ini配置有什么变化引起的问题,索性upgrade脚本自动备份了php
对比php.ini


至此,破案,之前折腾zlib时,改了php.ini,升级后的php.ini zlib没开,导致500,恢复php.ini后正常

phpmyadmin导入wordpress sql文件报错Unrecognized keyword. (near “ON” at position 25)的解决办法

phpmyadmin导入wordpress sql文件报错Unrecognized keyword. (near “ON” at position 25)的解决办法

今天迁站,文件打包,mysql通过phpmyadmin导出导入的方式,但是导入时遇到了如下的错误

1 errors were found during analysis.

Unrecognized keyword. (near “ON” at position 25)

SQL query: Edit Edit

SET FOREIGN_KEY_CHECKS = ON;

原因之一是max_allowed_packet 设置过小
“mysql根据配置文件会限制server接受的数据包大小。
有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。”

解决方法是将max_allowed_packet改大即可
在mysql命令行中输入:set global max_allowed_packet = 2*1024*1024*10

gitlab 的备份还原与迁移

gitlab 的备份还原与迁移

本文章适合于一键安装的gitlab,文章转载自 段错误 http://segmentfault.com/blog/venmos/1190000002439923

Gitlab 创建备份

使用Gitlab一键安装包安装Gitlab非常简单, 同样的备份恢复与迁移也非常简单. 使用一条命令即可创建完整的Gitlab备份:

gitlab-rake gitlab:backup:create
使用以上命令会在/var/opt/gitlab/backups目录下创建一个名称类似为1393513186_gitlab_backup.tar的压缩包, 这个压缩包就是Gitlab整个的完整部分, 其中开头的1393513186是备份创建的日期.

Gitlab 修改备份文件默认目录

你也可以通过修改/etc/gitlab/gitlab.rb来修改默认存放备份文件的目录:

gitlab_rails['backup_path'] = '/mnt/backups'
/mnt/backups修改为你想存放备份的目录即可, 修改完成之后使用gitlab-ctl reconfigure命令重载配置文件即可.

Gitlab 自动备份

也可以通过crontab使用备份命令实现自动备份:

sudo su -
crontab -e

加入以下, 实现每天凌晨2点进行一次自动备份:

0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create
Gitlab 恢复

同样, Gitlab的从备份恢复也非常简单:

# 停止相关数据连接服务
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq

# 从1393513186编号备份中恢复
gitlab-rake gitlab:backup:restore BACKUP=1393513186

# 启动Gitlab
sudo gitlab-ctl start
Gitlab迁移

迁移如同备份与恢复的步骤一样, 只需要将老服务器/var/opt/gitlab/backups目录下的备份文件拷贝到新服务器上的/var/opt/gitlab/backups即可(如果你没修改过默认备份目录的话). 但是需要注意的是新服务器上的Gitlab的版本必须与创建备份时的Gitlab版本号相同. 比如新服务器安装的是最新的7.60版本的Gitlab, 那么迁移之前, 最好将老服务器的Gitlab 升级为7.60在进行备份.

其他

最新版本的Gitlab已经修复了HTTPS设备的BUG, 现在使用官方HTTPS配置即可轻松启用HTTPS.

Centos7 安装openvpn

下载OPENVPN

wget http://swupdate.openvpn.org/as/openvpn-as-2.0.10-CentOS7.x86_64.rpm

安装

rpm -Uvh openvpn-as-2.0.10-CentOS7.x86_64.rpm  

看到成功信息,更改openvpn管理密码 ,

passwd openvpn

进入

https://IP:943/admin 

管理地址

DELL PowerEdge 1950服务器升级更新BIOS

DELL服务器提供了一大堆相关软件及光盘映像ISO,SUU,DSUU等一堆东西,令人眼花缭乱,谷歌了几十篇相关更新BIOS的方法,试了几种,失败了几种,最终在一种方法中成功了

DELL PowerEdge其他系列服务器同样适用,其他的可能更简单些,因为1950在官方source找不到了,只能手动添加固件。

软件:(Data Center Version) Dell Repository Manager v2.0.0 简称DRM

到Support.dell.com 下载.BIN驱动文件和.BIN.sign文件 ,主板BIOS,raid固件等同样适用

打开DRM ,Data Center的快捷方式

1

windows8.1离线安装.net framework3.5的方法及“组件的文件跟组件清单中的验证信息不匹配”的解决方案

1.通过管理员权限打开cmd (开始-应用-右键命令提示符-以管理员权限打开)

2.输入  dism.exe /online /enable-feature /featurename:NetFX3 /Source:F:\sources\sxs  其中F为win8镜像的盘符

 

如果出现以下问题

启用一个或多个功能[===========================65.8%====== ]
错误: 14028
组件的文件跟组件清单中的验证信息不匹配。
可以在 C:\Windows\Logs\DISM\dism.log 上找到 DISM 日志文件

 

是因为:一定要在windows中通过windows自带的虚拟光驱打开镜像文件,光盘无效,U盘无效,拷贝出来的文件无效