postgres – btree level 1 not found in index

We have a jira instance which uses the postgres database to store its information. The server had roughly 50 Gb of disk, so it ran out of space before we noticed. We extended the partition to 100 Gb but apparently it was too late.
Jira started complaining about it with an 500 internal server error (Estado HTTP 500 – Could not determine database type. (Conexión rechazada. Verifique que el nombre del Host y el puerto sean correctos y que postmaster este aceptando conexiones TCP/IP.)). Viewing the logs we found Caused by: java.net.ConnectException: Connection refused

We checked our database and database settings for external connections and couldn’t connect.

Then we tried to start the postgres service

sudo service postgresql start

2018-12-04 09:01:59.268 CST [21281] LOG:  database system was interrupted while in recovery at 2018-12-04 08:59:20 CST
2018-12-04 09:01:59.268 CST [21281] HINT:  This probably means that some data is corrupted and you will have to use the last backup for recovery.
2018-12-04 09:01:59.631 CST [21281] LOG:  database system was not properly shut down; automatic recovery in progress
2018-12-04 09:01:59.636 CST [21281] LOG:  redo starts at 7/CC020C68
2018-12-04 09:01:59.639 CST [21281] LOG:  record with zero length at 7/CC07E998
2018-12-04 09:01:59.639 CST [21281] LOG:  redo done at 7/CC07E968
2018-12-04 09:01:59.639 CST [21281] LOG:  last completed transaction was at log time 2018-12-03 10:29:49.99078-06
2018-12-04 09:01:59.641 CST [21281] FATAL:  btree level 1 not found in index "19881"

VITALLY IMPORTANT FIRST RESPONSE

I did a backup of the postgres data files

ssh admin@jira.server
sudo tar cvf postgres.bkp.tar /var/lib/postgresql/

Copied it to my local machine

rsync -av admin@jira.server:postgres.bkp.tar .

then installed the same version (series) that is on the server into my local machine.
Since I have ubuntu 18.04 I had to add the postgres repository to install postgres version 9.3.

echo “deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main” | sudo tee /etc/apt/sources.list.d/pgdg.list
wget –quiet -O – https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add –
sudo apt update
sudo apt install postgresql-9.3 postgresql-contrib-9.3

Then I tried to run postgres locally with the backup data

cd /tmp
tar xvf postgres.bkp.tar
sudo su postgres
/usr/lib/postgresql/9.3/bin/postgres -D /tmp/var/lib/postgresql/9.3/main/

it complained about not finding the configuration file so I just copied it from the default dirs

cp /etc/postgresql/10/main/postgresql.conf /tmp/var/lib/postgresql/9.3/main/
cp -R /etc/postgresql/10/main/conf.d/ /tmp/postgres/var/lib/postgresql/9.3/main/

edit the postgresql.conf file and change the data dir appropiately

data_directory = ‘/tmp/var/lib/postgresql/9.3/main’

then I tried again (but this time in single mode) and it reproduced exactly the same error as on server. Great!

postgres@elite-tsj:/tmp$ /usr/lib/postgresql/9.3/bin/postgres --single -P -d 1 -D /tmp/var/lib/postgresql/9.3/main/
2018-12-04 09:01:59.268 CST [21281] LOG:  database system was interrupted while in recovery at 2018-12-04 08:59:20 CST
2018-12-04 09:01:59.268 CST [21281] HINT:  This probably means that some data is corrupted and you will have to use the last backup for recovery.
2018-12-04 09:01:59.631 CST [21281] DEBUG:  checkpoint record is at 7/CC025C50
2018-12-04 09:01:59.631 CST [21281] DEBUG:  redo record is at 7/CC020C68; shutdown FALSE
2018-12-04 09:01:59.631 CST [21281] DEBUG:  next transaction ID: 0/9547804; next OID: 227497
2018-12-04 09:01:59.631 CST [21281] DEBUG:  next MultiXactId: 3; next MultiXactOffset: 5
2018-12-04 09:01:59.631 CST [21281] DEBUG:  oldest unfrozen transaction ID: 676, in database 1
2018-12-04 09:01:59.631 CST [21281] DEBUG:  oldest MultiXactId: 1, in database 1
2018-12-04 09:01:59.631 CST [21281] DEBUG:  transaction ID wrap limit is 2147484323, limited by database with OID 1
2018-12-04 09:01:59.631 CST [21281] DEBUG:  MultiXactId wrap limit is 2147483648, limited by database with OID 1
2018-12-04 09:01:59.631 CST [21281] LOG:  database system was not properly shut down; automatic recovery in progress
2018-12-04 09:01:59.634 CST [21281] DEBUG:  resetting unlogged relations: cleanup 1 init 0
2018-12-04 09:01:59.636 CST [21281] LOG:  redo starts at 7/CC020C68
2018-12-04 09:01:59.639 CST [21281] LOG:  record with zero length at 7/CC07E998
2018-12-04 09:01:59.639 CST [21281] LOG:  redo done at 7/CC07E968
2018-12-04 09:01:59.639 CST [21281] LOG:  last completed transaction was at log time 2018-12-03 10:29:49.99078-06
2018-12-04 09:01:59.639 CST [21281] DEBUG:  resetting unlogged relations: cleanup 0 init 1
2018-12-04 09:01:59.641 CST [21281] FATAL:  btree level 1 not found in index "19881"

since this data is a copy i just executed pg_resetxlog as shown here.
Be aware that use of the pg_resetxlog utility should be done as an absolute last resort, and there are still some things you should try first..

/usr/lib/postgresql/9.3/bin/pg_resetxlog /tmp/var/lib/postgresql/9.3/main/

it complained I had to force it, there you go

/usr/lib/postgresql/9.3/bin/pg_resetxlog -f /tmp/var/lib/postgresql/9.3/main/

done! Now let’s see if it’s working again

sudo su postgres
/usr/lib/postgresql/9.3/bin/postgres -D /tmp/var/lib/postgresql/9.3/main/

boom! it’s working.

Now it’s time to do a backup with sql dump (pg_dump) or better yet a full sql dump (pg_dumpall).

In another terminal (or tab)

sudo su postgres
pg_dumpall -p 5433 > /tmp/postgres-full.dmp

in my case I had to specify the port (-p 5433).

Now that I have a full backup I can try the same on production.

/usr/lib/postgresql/9.3/bin/pg_resetxlog -f /var/lib/postgresql/9.3/main/
sudo service postgresql start

thank the gods! (to recall the option pointed here)

Anuncios

EclipseLink error: Entity class has no primary key specified. It should define either an @Id, @EmbeddedId or an @IdClass

I had an entity working perfectly until I added a ‘custom’ getter, to return an object array as a string array.

This entity had the @Id attribute properly set, but when deploying, it threw me this nasty error

Entity class [class …] has no primary key specified

I discovered after some time wondering what had just happened, that if you use EclipseLink < 2.6.0 and deploy to Glassfish (very common if you use Netbeans IDE), if you add lambda expressions on entities it just goes wrong. bug

This is my entity class and the seemingly innocent culprit method

@Entity
public class Carpeta implements Serializable {

    @Id
    @NotNull
    @Column(name = "ID")
    private String id;

    ... other fields

    @OneToMany(mappedBy = "acumulada")
    @JsonIgnore
    private Collection<Carpeta> carpetasAcumuladas;

    public Carpeta() {
    }

    ... other getter and setters

    public Collection<Carpeta> getCarpetasAcumuladas() {
        return carpetasAcumuladas;
    }

    /** custom getter using lambda expression **/
    public List<String> getNucsAcumulados(){
        return getCarpetasAcumuladas().stream().map(carpeta -> {
            return carpeta.getNuc();
        }).collect(Collectors.toList());
    }

}

to solve the issue, just remove lambda expressions from your entities if you're using EclipseLink < 2.6.0 on Glassfish.

In our case

    public List<String> getNucsAcumulados(){
        List<String> nucs = new ArrayList<>();
        for (Carpeta carpeta : getCarpetasAcumuladas()) {
            nucs.add(carpeta.getNuc());
        }
        return nucs;
    }

we can cache the array instead of returning a new
array each time

    private List<String> nucsAcumulados = null;

    public List<String> getNucsAcumulados(){
        if (nucsAcumulados == null) {
            nucsAcumulados = new ArrayList<>();
            for (Carpeta carpeta : getCarpetasAcumuladas()) {
                nucsAcumulados.add(carpeta.getNuc());
            }
        }
        return nucsAcumulados;
    }

sources:
https://stackoverflow.com/a/35623026/961652
https://bugs.eclipse.org/bugs/show_bug.cgi?id=429992

jhipster – runs fine from maven but not from intellij

Screenshot from 2017-11-08 14-43-11

I’ve started a project with jhipster@4.10.2 and ran the usual yarn install and afterwards mvn, it executed fine and I could see the result on http://localhost:8080.
Then, I opened the project on [IntelliJ] and followed the steps on the guide to configure the IDE to exclude directories, enable spring support, enable javascript code support and -the most important feature to me- application hot restart. The last step in the guide is to enable the maven IDE profile, but it caused the following error

Error:(19, 8) java: cannot access javax.servlet.Filter
class file for javax.servlet.Filter not found

when I tried to run the app (right click your app class file src/main/java/{package}/{appname}.java and choose ‘Run’), well actually at compile time.

I just had to disable the IDE maven profile to get it working again.

jhipster – The engine “node” is incompatible with this module

jhipster_logo

En un proyecto generado con jhipster@4.5.6 me estaba marcando el error ‘The engine “node” is incompatible with this module’ al ejecutar el comando yarn install

El problema es que en esta versión el archivo packages.json tenía una línea que decía

“engines”: {
“node”: “^4.3”
}

mi versión de node es

node -v
v7.1.0

y de acuerdo a semver la especificación “node”: “^4.3” me permitiría solamente utilizar node 4.x
Puedes forzar la ejecución de yarn install de la siguiente manera

yarn install –ignore-engines

Esto fue corregido en versiones posteriores de jhipster, por ejemplo en la versión 4.10.2 el archivo packages.json especifica

“engines”: {
“node”: “>=6.9.0”
}

lo que permite utilizar versiones más recientes de node, v7.1.0 por ejemplo.

para actualizar tu proyecto de jhipster (primero actualiza jhipster con yarn global upgrade generator-jhipster) intenté utilizar el comando jhipster upgrade pero no pudo actualizar debido a que marcaba el mismo error. Para actualizar lo que hice fue simplemente volver a ejecutar el comando jhipster (equivalente a jhipster app)

fuentes:
https://github.com/gilbarbara/react-joyride/issues/131
https://docs.npmjs.com/misc/semver
https://yarnpkg.com/
https://nodejs.org/

Ubuntu – Instalar el cliente de spotify para linux

Es conveniente mencionar la relación que presenta el uso de las tecnologías de
información y comunicación (TIC) con la música y los jóvenes. En la actualidad, los jóvenes
emplean diariamente las TIC para incrementar conocimiento, buscar información, relacionarse
con otras personas o para divertirse. En la música, las TIC influyen en la manera en que ésta se
crea, se produce y se difunde; éstas también han generado cambios que ofrecen gran cantidad de
opciones musicales, desde la composición hasta el consumo de la música, y que gracias a los
medios de comunicación han permitido la distribución musical masiva, inmediata y global

http://musica.rediris.es/leeme/revista/terrazasetal13.pdf

En la página oficial de spotify nos dice como debemos instalar el cliente de spotify en linux

  1. Agrega esta línea a tu lista de depósitos al # editar tu /etc/apt/sources.list

    deb http://repository.spotify.com stable non-free

  2. Si quieres verificar los paquetes descargados,
    necesitarás agregar nuestra clave pública

    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 94558F59

  3. Ejecuta la aplicación - obtén la actualización

    sudo apt-get update

  4. ¡Instala Spotify!

    sudo apt-get install spotify-client

Recientemente quise instalarlo y me arrojó errores debido a que no localizaba el servidor repository.spotify.com

Al parecer esto se debe a algún problema con sus servidores DNS, para instalarlo debes utilizar http://repository-origin.spotify.com en vez de http://repository.spotify.com

Fuentes:
https://www.spotify.com/mx/download/previews/
http://community.spotify.com/t5/Help-Desktop-Linux-Mac-and/Spotify-0-9-11-for-GNU-Linux/td-p/842969/page/4

Linux – Copiar un archivo demasiado grande a una memoria usb (fat32)

El tamaño máximo de un archivo que puedes almacenar en una USB (fat32) es de 2Gb (o 4Gb si estas utilizando LFS).

Si quieres copiar un archivo con un tamaño mayor, en linux, puedes hacerlo mediante el comando split, por ejemplo

split -b 2048 image.iso

que nos producirá una serie de archivos

image.isoaa
image.isoab
image.isoac
...

Después para juntarlos utilizamos el comando cat

cat image.iso* > ~/image.iso

El comando anterior no nos muestra un avance del progreso. Para ver el progreso podemos utilizar el comando pv, para instalarlo ejecuta sudo apt-get install pv y lo utilizas de la siguiente manera

cat image.iso* | pv -s $(du -cb image.iso* | grep total | awk '{print $1}') > ~/image.iso

Fuentes:
http://unix.stackexchange.com/questions/24630/whats-the-best-way-to-join-files-again-after-splitting-them
http://www.catonmat.net/blog/unix-utilities-pipe-viewer/
http://en.wikipedia.org/wiki/File_Allocation_Table#FAT32
http://unix.stackexchange.com/questions/41550/find-the-total-size-of-certain-files-within-a-directory-branch

Linux – No se puede ejecutar virtualbox y un emulador de android al mismo tiempo

Para probar tus aplicaciones móviles, el android SDK incluye un emulador. El problema es que no puedes utilizar este emulador si estas ejecutando alguna otra máquina virtual -en virtualbox, por ejemplo-
Al intentar ejecutar el emulador mientras ejecutas alguna máquina virtual aparecen errores como los siguientes

ioctl(KVM_CREATE_VM) failed: Device or resource busy
ko:failed to initialize KVM

[Emulator] error libGL.so: cannot open shared object file: No such file or directory
[Emulator] Failed to load libGL.so

Tiene algo que ver con la aceleración por hardware. En la documentación de Google especifica lo siguiente

If you use another virtualization technology in your Linux platform, unload its kernel driver before running the x86 emulator. For example, the VirtualBox driver program is vboxdrv.

Para hacer esto supuestamente ejecutas sudo /etc/init.d/vboxdrv stop pero si instalaste VirtualBox desde los repositorios en Ubuntu 14.04, ete archivo no existe. Supuestamente tendrías que ejecutar los siguientes comandos para tenerlo disponible

sudo apt-get install linux-headers-`uname -r`
sudo dpkg-reconfigure virtualbox-dkms  
sudo modprobe vboxdrv

Pero seguía sin existir el archivo, descubrí -sin embargo- que existe un archivo llamado /etc/init.d/virtualbox así que ejecute el comando /etc/init.d/virtualbox stop y detuvo efectivamente los drivers del kernel. Después de hacer esto ya pude iniciar el emulador pero ahora no podía iniciar la máquina virtual de VirtualBox.

Al final he decidido no utilizar el emulador y en su lugar utilizar un dispositivo físico para poder ejecutar mi máquina virtual y probar la aplicación móvil al mismo tiempo.

Fuentes: